BroadcastUploadExtension:broadcastStarted正常但broadcastFinished未调用求助
解决BroadcastUploadExtension中broadcastFinished()未触发的问题
以下是针对该问题的排查和解决步骤:
1. 修正UserDefaults跨进程访问逻辑
主App与BroadcastUploadExtension属于不同进程,默认UserDefaults相互隔离,若用它验证方法是否被调用,必须通过App Groups实现数据共享:
- 在开发者后台为App ID开启App Groups权限,创建统一的组ID(如
group.com.yourcompany.yourapp) - 在主App和Extension的
Info.plist中添加AppGroups键,值为创建的组ID - 在SampleHandler中使用组ID初始化共享UserDefaults:
override func broadcastFinished() { let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp") sharedDefaults?.set(true, forKey: "broadcastFinished") sharedDefaults?.synchronize() finishBroadcastWithError(nil) } - 主App读取时同样使用该组ID的UserDefaults,避免因进程隔离导致误判。
2. 确保SampleHandler方法实现规范
检查SampleHandler的代码实现,确认:
- 正确重写
broadcastFinished()方法,无拼写错误(如大小写、方法名偏差) - 方法末尾必须调用
finishBroadcastWithError(nil),告知系统广播流程已完成,这是触发完整回调链路的必要操作:class SampleHandler: RPBroadcastSampleHandler { // ...其他业务方法... override func broadcastFinished() { // 执行清理逻辑(如释放录制资源、停止数据上传) finishBroadcastWithError(nil) } }
3. 调整模拟点击Picker的方式
直接调用按钮sendActions(for: .touchUpInside)可能跳过Picker内部初始化流程,导致后续回调链路异常:
- 延迟触发点击操作,确保Picker完成布局与初始化:
self.window.rootViewController?.view.addSubview(picker) DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { if let button = picker.subviews.first(where: { $0 is UIButton }) as? UIButton { button.sendActions(for: .touchUpInside) } } - 苹果不推荐依赖Picker的私有视图结构,若业务允许,优先引导用户手动点击Picker启动录屏。
4. 检查Extension配置与签名
- 确认BroadcastUploadExtension的
Info.plist配置正确:NSExtension->NSExtensionPointIdentifier值为com.apple.broadcast-servicesNSExtension->NSExtensionPrincipalClass值为SampleHandler的完整类名(如$(PRODUCT_MODULE_NAME).SampleHandler)
- 确认主App与Extension使用相同团队ID签名,且App Groups权限已正确配置到签名中。
内容的提问来源于stack exchange,提问作者Ertürk Alan
相关产品推荐
相关产品推荐

