Сбой AVPlayer при изменении размера окна во время полноэкранного режима во время просмотра горячих точек

#ios #swift #avplayer #avplayerviewcontroller #hotspot

#iOS #swift #avplayer #avplayerviewcontroller #точка доступа

Вопрос:

Я разрабатываю приложение, в котором пользователи могут просматривать широкий спектр видео. Я открываю видео в полноэкранном режиме нажатием кнопки, и пользователь может использовать элементы управления воспроизведением для изменения размера окна. Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь делится своим Интернетом через точку доступа, в верхней части приложения появляется синяя полоса. Изменение размера окна на этом этапе приведет к сбою в платформе AVKit (я полагаю). Использование Swift 2.3, Xcode 7.3.1. Мой телефон, iPhone 6s, использует iOS 10, и я также пробовал это на iOS 9 iPhone 6 Plus, та же проблема.

Сбой:

 Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<AVFullScreenPlaybackControlsViewController: 0x102933000> should have parent view controller:<AVPlayerViewController: 0x10212d800> but actual parent is:<AVFullScreenViewController: 0x10884d900>'
  

Мой код:

 private let playerController = AVPlayerViewController()
private var player: AVPlayer!

private func playVideo(media: Media) {

        player = AVPlayer(URL: NSURL(string: media.url)!)
        playerController.player = player

        presentViewController(playerController, animated: true, completion: {
            self.playerController.player?.play()
            self.playerController.delegate = self
        })

    }
  

Если я не предоставляю доступ к Интернету на своем телефоне (таким образом, нет синей полосы), тогда он работает нормально, никаких проблем вообще. Кому-нибудь удалось скрыть эту синюю полосу или возникла аналогичная проблема?

Комментарии:

1. Я также вижу этот сбой в производственном приложении. Вы когда-нибудь находили решение?

2. @FelipeOliveira к сожалению, нет. Я был вынужден с этим смириться. Если вы когда-нибудь найдете решение для этого, пожалуйста, дайте мне знать. 🙂

3.Я нашел два радарных сообщения об этом сбое openradar.me/20488804 openradar.appspot.com/29919046 Поскольку сбой происходит при частном вызове, я мало что могу сделать. Я дам вам знать, если найду решение.

4. @FelipeOliveira пожалуйста, сделайте это, спасибо!

Ответ №1:

Я исправил это с помощью этого кода:

 @interface YourAVPlayerViewController : AVPlayerViewController
@end

@implementation YourAVPlayerViewController

 - (BOOL)prefersStatusBarHidden {
        return YES;
 }

@end
  

Ответ №2:

В качестве обходного пути вы можете нажать на navigationControlelr stack или при модальном представлении использовать этот:

 @interface AVPlayerViewController ()
- (void)fullScreenButtonTapped:(id)arg1;
@end

@interface RCKPlayerViewController ()

@end

@implementation RCKPlayerViewController

- (void)fullScreenButtonTapped:(id)arg1 {
    if ([[UIApplication sharedApplication] statusBarFrame].size.height >= 40) {
        // Show alert that cannot enter full screen when in-call
    } else {
        [super fullScreenButtonTapped:arg1];
    }
}

@end
  

Затем просто используйте RCKPlayerViewController

 AVPlayerViewController *playerViewController = [[RCKPlayerViewController alloc] init];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:videoStringURL]];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
playerViewController.player = player;

[self presentViewController:playerViewController animated:YES completion:^{
    [player play];
}];
  

Ответ №3:

Я написал небольшое расширение для AVPlayerViewController , которое устраняет проблему во всем приложении:

 // AVPlayerViewController.swift

import AVKit

extension AVPlayerViewController {

  // fixes app crash while using personal hotspot   watching a full screen video
  override open var prefersStatusBarHidden: Bool {
    return true
  }

}