WidgetKit在iOS14/15无法运行(FBSOpenApplicationServiceErrorDomain)
问题背景
为旧项目添加WidgetExtension目标,适配iOS14及以上版本后,改用旧版TimelineProvider和StaticConfiguration实现Widget代码,在iOS17模拟器运行正常,但iOS15模拟器启动时出现如下错误:
code-SendProcessControlEvent:toPid: 遇到错误:Error Domain=com.apple.dt.deviceprocesscontrolservice Code=8 "Failed to show Widget 'com.name-pprd.NCWidgetExtension' error: Error Domain=
FBSOpenApplicationServiceErrorDomainCode=5 "The request to open "com.apple.springboard" failed." UserInfo={NSLocalizedDescription=The request to open "com.apple.springboard" failed., NSLocalizedFailureReason=Unexpected error type., NSUnderlyingError=0x600003570b40 {Error Domain=BSServiceConnectionErrorDomain Code=3 "XPC error received on message reply handler" UserInfo={BSErrorCodeDescription=OperationFailed, NSLocalizedFailureReason=XPC error received on message reply handler}}, BSErrorCodeDescription=InvalidResponse}." UserInfo={NSLocalizedDescription=Failed to show Widget 'com.name-pprd.NCWidgetExtension' error: Error Domain=FBSOpenApplicationServiceErrorDomain Code=5 "The request to open "com.apple.springboard" failed." UserInfo={NSLocalizedDescription=The request to open "com.apple.springboard" failed., NSLocalizedFailureReason=Unexpected error type., NSUnderlyingError=0x600003570b40 {Error Domain=BSServiceConnectionErrorDomain Code=3 "XPC error received on message reply handler" UserInfo={BSErrorCodeDescription=OperationFailed, NSLocalizedFailureReason=XPC error received on message reply handler}}, BSErrorCodeDescription=InvalidResponse}., NSUnderlyingError=0x600003570bd0 {Error Domain=FBSOpenApplicationServiceErrorDomain Code=5 "The request to open "com.apple.springboard" failed." UserInfo={NSLocalizedDescription=The request to open "com.apple.springboard" failed., NSLocalizedFailureReason=Unexpected error type., NSUnderlyingError=0x600003570b40 {Error Domain=BSServiceConnectionErrorDomain Code=3 "XPC error received on message reply handler" UserInfo={BSErrorCodeDescription=OperationFailed, NSLocalizedFailureReason=XPC error received on message reply handler}}, BSErrorCodeDescription=InvalidResponse}}}
Domain: DTXMessage
Code: 1
User Info: {
DVTErrorCreationDateKey = "2024-07-20 17:30:58 +0000";
}系统信息:
macOS Version 14.5 (Build 23F79)
Xcode 15.0.1 (22266) (Build 15A507)
Timestamp: 2024-07-20T23:00:58+05:30
Widget实现代码如下:
struct Provider: TimelineProvider { func placeholder(in context: Context) -> SimpleEntry { SimpleEntry() } func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) { completion(SimpleEntry()) } func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) { completion(Timeline(entries: [SimpleEntry()], policy: .never)) } typealias Entry = SimpleEntry } struct SimpleEntry: TimelineEntry { let date: Date = Date() } struct NCWidgetEntryView : View { var entry: Provider.Entry var body: some View { VStack { Text("Time:") Text(entry.date, style: .time) } } } struct NCWidget: Widget { let kind: String = "NCWidget" var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: Provider()) { entry in NCWidgetEntryView(entry: entry) } .configurationDisplayName("DisplayName") .description("description") } }
解决方案
确认部署目标配置一致性
检查WidgetExtension的Deployment Target是否严格设置为iOS14.0,在Build Settings中找到IPHONEOS_DEPLOYMENT_TARGET,确保该值与目标设置面板中的版本一致,避免主App(iOS13.0)与WidgetExtension的版本冲突引发系统兼容问题。清理模拟器缓存并重启环境
- 关闭iOS15模拟器,打开Xcode的
Window > Devices and Simulators,选中对应模拟器,右键选择Erase All Content and Settings - 执行
Command + Shift + K清理项目编译缓存,重启Xcode后重新编译运行
- 关闭iOS15模拟器,打开Xcode的
验证Bundle Identifier与Info.plist配置
确保WidgetExtension的Bundle Identifier是主App Bundle Identifier的后缀形式(例如主App为com.name-pprd,Widget应为com.name-pprd.NCWidgetExtension);同时检查WidgetExtension的Info.plist,移除不必要的隐私权限条目,避免无效配置导致Springboard启动失败。调整Timeline刷新策略
iOS15对Timeline的处理逻辑比iOS17更严格,尝试修改getTimeline的返回策略,替换.never为明确的未来刷新时间:func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) { let nextUpdate = Date().addingTimeInterval(3600) // 1小时后刷新 completion(Timeline(entries: [SimpleEntry()], policy: .after(nextUpdate))) }排查Xcode版本兼容性问题
Xcode15对旧iOS版本模拟器的支持存在已知兼容bug,可尝试切换到Xcode14.x版本编译运行iOS15模拟器,或更新Xcode到最新正式版本后重试。
内容的提问来源于stack exchange,提问作者Ramprasath Selvam

