Capacitor iOS应用自定义AVPlayer播放后无法跳转桥接视图问题
问题根因
你的代码存在两个核心问题导致segue跳转失效:
- 你自定义的
viewControl本身已经是AVPlayerViewController子类,却在内部又额外实例化了一个新的AVPlayerViewController(也就是playerController变量),并将它present出来。当视频播放结束时,你调用的是下层被遮盖的viewControl的performSegue方法,上层还有present出来的播放控制器没有关闭,自然看不到跳转效果 - 你没有在segue执行前移除通知监听,可能会造成后续重复回调异常
修复后的完整代码
// // AVPlayer.swift // App // // import Foundation import UIKit import AVFoundation import AVKit import Capacitor class ViewControl: AVPlayerViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) playVideo() } private func playVideo() { guard let path = Bundle.main.path(forResource: "Splash_Screen_Christmas", ofType:"mp4") else { debugPrint("Splash_Screen_Christmas.mp4 not found") return } // 直接用当前控制器本身播放,不要额外新建AVPlayerViewController let player = AVPlayer(url: URL(fileURLWithPath: path)) self.showsPlaybackControls = false self.player = player self.videoGravity = .resizeAspectFill // 添加播放结束监听 NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem) player.play() } @objc func playerDidFinishPlaying(note: NSNotification) { // 先移除通知监听避免重复回调 NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil) // 执行segue跳转 performSegue(withIdentifier: "test", sender: self) print("video is finished ") } }
额外检查项
如果修改后还是无法跳转,确认以下配置:
- 故事板中segue的
Identifier确实是test,没有拼写错误、大小写错误 - 故事板中segue的类型是
Show(Push)或者Present Modally,不要选自定义类型且没有实现自定义跳转逻辑 - 确认Capacitor Bridge View控制器在故事板中的自定义类、模块配置正确,没有加载失败的问题
内容的提问来源于stack exchange,提问作者Hevxr
相关产品推荐
相关产品推荐

