美文网首页iOS常用
iOS 关于启动app播放视频功能

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

作者: 陈大帅 | 来源:发表于2021-07-29 16:41 被阅读0次

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


    image.png

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

    image.png
    image.png

    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;
    
    }
    

    注意:


    image.png
    image.png

    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

    原文作者:谁遇而安

    相关文章

      网友评论

        本文标题:iOS 关于启动app播放视频功能

        本文链接:https://www.haomeiwen.com/subject/teffvltx.html