1.開啟后臺模式
image.png
2.導(dǎo)入框架#import <AVKit/AVKit.h> 創(chuàng)建AVPictureInPictureController
注:如果是使用系統(tǒng)播放器AVPlayerViewController,設(shè)置allowsPictureInPicturePlayback = YES即可
//1.判斷是否支持畫中畫功能
if ([AVPictureInPictureController isPictureInPictureSupported]) {
//2.開啟權(quán)限
@try {
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionOrientationBack error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];
} @catch (NSException *exception) {
NSLog(@"AVAudioSession發(fā)生錯誤");
}
self.pipVC = [[AVPictureInPictureController alloc] initWithPlayerLayer:self.player];
self.pipVC.delegate = self;
}
3.開啟或關(guān)閉畫中畫
if (self.pipVC.isPictureInPictureActive) {
[self.pipVC stopPictureInPicture];
} else {
[self.pipVC startPictureInPicture];
}
4.代理 AVPictureInPictureControllerDelegate
// 即將開啟畫中畫
- (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 已經(jīng)開啟畫中畫
- (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 開啟畫中畫失敗
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error;
// 即將關(guān)閉畫中畫
- (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 已經(jīng)關(guān)閉畫中畫
- (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 關(guān)閉畫中畫且恢復(fù)播放界面
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;
值得注意的是,關(guān)閉畫中畫會執(zhí)行
pictureInPictureController:restoreUserInterfaceForPictureInPictureStopWithCompletionHandler: 這個代理方法,用來恢復(fù)播放界面的
全局畫中畫注意點
- 通過一個全局變量持有畫中畫控制器,可以在pictureInPictureControllerWillStartPictureInPicture持有,pictureInPictureControllerDidStopPictureInPicture釋放;
- 有可能不是點畫中畫按鈕,而是從其它途徑來打開當(dāng)前畫中畫控制器,可以在viewWillAppear 進行判斷并關(guān)閉;
- 已有畫中畫的情況下開啟新的畫中畫,需要等完全關(guān)閉完再開啟新的,防止有未知的錯誤出現(xiàn),因為關(guān)閉畫中畫是有過程的;
- 如果創(chuàng)建AVPictureInPictureController并同時開啟畫中畫功能,有可能會失效,出現(xiàn)這種情況延遲開啟畫中畫功能即可。