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