iOS 关于启动app播放视频功能

我们经常会看到我们在第一次使用app的时候,会播放一段视频,以便我们来了解app。如何实现呢,先看效果:

1、我们要在LaunchScreen.storyboard中给app一张启动图片,防止我们在启动的时候会出现空白的情况。

2、创建一个ZYLauchMovieViewController控制器,继承自AVPlayerViewController,设置我们的window的根控制器为我们要播放视频的控制器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

ZYLauchMovieViewController *vc = [[ZYLauchMovieViewController alloc] init];

window.rootViewController = vc;

self.window = window;

[self.window makeKeyAndVisible];

return YES;

}

注意:

3、设置四个属性,

1、播放开始之前的图片startPlayerImageView,防止出现留黑的问题,

2、播放中断的图片pausePlayerImageView,也是防止跳转的时候出现问题,

3、定时器timer,为了在进入app3秒之后显示进入应用按钮,

4、结束按钮也就是进入应用的按钮enterMainButton,为了让用户跳过视频。

/** 播放开始之前的图片 */

@property (nonatomic , strong)UIImageView *startPlayerImageView;

/** 播放中断时的图片 */

@property (nonatomic , strong)UIImageView *pausePlayerImageView;

/** 定时器 */

@property (nonatomic , strong)NSTimer *timer;

/** 结束按钮 */

@property (nonatomic , strong)UIButton *enterMainButton;

4、viewDidLoad中设置一些界面,在并且判断是不是第一次进入app,如果是第一次,设置进入主界面的按钮

// 设置界面

- (void)setupView {

self.startPlayerImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"lauch"]];

_startPlayerImageView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);

[self.contentOverlayView addSubview:_startPlayerImageView];

//是否是第一次进入视频

if (![self isFirstLauchApp]) {

//设置进入主界面的按钮

[self setupEnterMainButton];

}

}

//设置进入主界面的按钮

- (void)setupEnterMainButton {

self.enterMainButton = [UIButton buttonWithType:UIButtonTypeCustom];

_enterMainButton.frame = CGRectMake(24, kScreenHeight - 32 - 48, kScreenWidth - 48, 48);

_enterMainButton.layer.borderWidth =1;

_enterMainButton.layer.cornerRadius = 24;

_enterMainButton.layer.borderColor = [UIColor whiteColor].CGColor;

[_enterMainButton setTitle:@"进入应用" forState:UIControlStateNormal];

_enterMainButton.hidden = YES;

[self.view addSubview:_enterMainButton];

[_enterMainButton addTarget:self action:@selector(enterMainAction:) forControlEvents:UIControlEventTouchUpInside];

//设置定时器当视频播放到第三秒时 展示进入应用

self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showEnterMainButton) userInfo:nil repeats:YES];

}

在这里我们开一个定时器,让按钮在3s之后再显示

//显示进入按钮(定时器的方法)

- (void)showEnterMainButton {

AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:self.player.currentItem.asset];

gen.appliesPreferredTrackTransform = YES;

NSError *error = nil;

CMTime actualTime;

CMTime now = self.player.currentTime;

[gen setRequestedTimeToleranceAfter:kCMTimeZero];

[gen setRequestedTimeToleranceBefore:kCMTimeZero];

[gen copyCGImageAtTime:now actualTime:&actualTime error:&error];

NSInteger currentPlayBackTime = (NSInteger)CMTimeGetSeconds(actualTime);

if (currentPlayBackTime >= 3) {

self.enterMainButton.hidden = NO;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

self.enterMainButton.alpha = 0;

[UIView animateWithDuration:0.5 animations:^{

self.enterMainButton.alpha = 1;

} completion:nil];

});

}

if (currentPlayBackTime > 5) {

//防止没有显现出来

self.enterMainButton.alpha = 1;

self.enterMainButton.hidden = NO;

[self.timer invalidate];

self.timer = nil;

}

}

//进入应用的按钮点击事件

- (void)enterMainAction:(UIButton *)btn {

//视频暂停

[self.player pause];

self.pausePlayerImageView = [[UIImageView alloc] init];

_pausePlayerImageView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);

[self.contentOverlayView addSubview:_pausePlayerImageView];

self.pausePlayerImageView.contentMode = UIViewContentModeScaleAspectFit;

//获取当前暂停时的截图,也就是设置结束时候的图片

[self getoverPlayerImage];

}

//截图的获取方法

- (void)getoverPlayerImage {

AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:self.player.currentItem.asset];

gen.appliesPreferredTrackTransform = YES;

NSError *error = nil;

CMTime actualTime;

CMTime now = self.player.currentTime;

[gen setRequestedTimeToleranceAfter:kCMTimeZero];

[gen setRequestedTimeToleranceBefore:kCMTimeZero];

CGImageRef image = [gen copyCGImageAtTime:now actualTime:&actualTime error:&error];

if (!error) {

UIImage *thumb = [[UIImage alloc] initWithCGImage:image];

self.pausePlayerImageView.image = thumb;

}

NSLog(@"%f , %f",CMTimeGetSeconds(now),CMTimeGetSeconds(actualTime));

NSLog(@"%@",error);

//视频播放结束

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self moviePlaybackComplete];

});

}

5、在viewDidLoad设置监听,监听视频播放的开始,结束,以及程序进入活动的状态,需要判断是不是第一次进入app,是的话就重复播放视频,不是的话就播放一次

//设置监听

- (void)addNotification {

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewWillEnterForeground) name:UIApplicationDidBecomeActiveNotification object:nil];//进入前台

if ([self isFirstLauchApp]) {

//第二次进入app视频需要直接结束

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];//视频播放结束

}else {

//第一次进入app视频需要轮播

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackAgain) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];//视频播放结束

}

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackStart) name:AVPlayerItemTimeJumpedNotification object:nil];//播放开始

}

//实现监听的方法

//开始播放移除我们刚开始加的图片,不然无法看到视频

- (void)moviePlaybackStart {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self.startPlayerImageView removeFromSuperview];

self.startPlayerImageView = nil;

});

}

//视频播放完成移除图片,进入主界面

- (void)moviePlaybackComplete {

//发送推送之后就删除  否则 界面显示有问题

[[NSNotificationCenter defaultCenter] removeObserver:self

name:AVPlayerItemDidPlayToEndTimeNotification

object:nil];

[self.startPlayerImageView removeFromSuperview];

self.startPlayerImageView = nil;

[self.pausePlayerImageView removeFromSuperview];

self.pausePlayerImageView = nil;

if (self.timer){

[self.timer invalidate];

self.timer = nil;

}

//进入主界面

[self enterMain];

}

//app进入活动时播放视频

- (void)viewWillEnterForeground

{

NSLog(@"app enter foreground");

if (!self.player) {

[self prepareMovie];

}

//播放视频

[self.player play];

}

//第一次进入app的时候,再一次播放视频

- (void)moviePlaybackAgain {

self.startPlayerImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"lauchAgain"]];

_startPlayerImageView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);

[self.contentOverlayView addSubview:_startPlayerImageView];

[self.pausePlayerImageView removeFromSuperview];

self.pausePlayerImageView = nil;

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"opening_long_1080*1920.mp4" ofType:nil];

//初始化player

self.player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]];

self.showsPlaybackControls = NO;

//播放视频

[self.player play];

}

6、在viewDidLoad中初始化视频

- (void)prepareMovie {

//首次运行

NSString *filePath = nil;

if (![self isFirstLauchApp]) {

//第一次安装

filePath = [[NSBundle mainBundle] pathForResource:@"opening_long_1080*1920.mp4" ofType:nil];

[self setIsFirstLauchApp:YES];

}else {

filePath = [[NSBundle mainBundle] pathForResource:@"opening_short_1080*1920.mp4" ofType:nil];

}

//初始化player

self.player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]];

self.showsPlaybackControls = NO;

//播放视频

[self.player play];

}

7、进入主界面的方法以及判断是否第一次进入app

//进入主界面

- (void)enterMain {

AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

UIViewController *main = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateInitialViewController];

delegate.window.rootViewController = main;

[delegate.window makeKeyWindow];

}

#pragma mark -- 是否第一次进入app

- (BOOL)isFirstLauchApp {

return [[NSUserDefaults standardUserDefaults] boolForKey:kIsFirstLauchApp];

}

- (void)setIsFirstLauchApp:(BOOL)isFirstLauchApp

{

[[NSUserDefaults standardUserDefaults] setBool:isFirstLauchApp forKey:kIsFirstLauchApp];

}

大概就是这些

最后,总结一下,思路就是:

第一步:先给一张初始的图片,然后判断是不是第一次进入app,第一次就设置一个进入应用的按钮,点击截图一张放在视频上方进入主界面,然后开一个定时器,当视频播放到第3s的时候显示按钮。

第二步:监听视频的开始播放、结束播放,以及app是否进入活动状态;开始播放的时候移除第一张图片;结束播放的时候移除图片,移除定时器,进入主界面;进入活动状态时候播放视频。

第三步:初始化player,加载本地视频,播放视频

最后附上DEMO的地址需要的话可以看一下:https://github.com/zhangyqyx/startMovie

大概就这些了,希望大家能提出宝贵的意见,可以给我留言,也可以发邮件到我的邮箱:namezyqyx@163.com

谢谢大家,如果你有更好的想法或文章请告知,不胜感激。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容