歡迎光臨
每天分享高質量文章

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(00, 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 - 4848);
_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(00, 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(00, 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

 

謝謝大家,如果你有更好的想法或文章請告知,不勝感激。

贊(0)

分享創造快樂