iOS 小部件扩展:"Failed to show Widget" 运行 小部件扩展方案
iOS Widget Extension: "Failed to show Widget" on running with widget extension scheme
我最近在开发带有小部件扩展的 iOS 应用程序时遇到了一个问题。
一开始,我使用Xcode提供的模板代码,在新建的项目中添加了一个widget扩展,没有做任何改动。事实证明,在 运行 自动生成的扩展方案之后,小部件按预期工作。
在应用程序和扩展程序中添加了一些代码后,小部件扩展程序似乎存在一些问题。在我发现小部件库中缺少小部件之前,我什至没有注意到小部件扩展可能有问题。注意到问题后,我尝试 运行 使用小部件方案的项目。但它向我显示了以下错误消息:
SendProcessControlEvent:toPid: encountered an error: Error
Domain=com.apple.dt.deviceprocesscontrolserviceCode=8 "Failed
to show Widget '**' error: Error
Domain=SBAvocadoDebuggingControllerErrorDomain Code=1 "Failed
to get descriptors for extensionBundleID (**)"
UserInfo={NSLocalizedDescription=Failed to get descriptors for
extensionBundleID (**)}." UserInfo={NSLocalizedDescription=
Failed to show Widget '**' error: Error
Domain=SBAvocadoDebuggingControllerErrorDomain Code=1 "Failed
to get descriptors for extensionBundleID (**)"
UserInfo={NSLocalizedDescription=Failed to get descriptors for
extensionBundleID (**)}., NSUnderlyingError=0x12da945a0
{Error Domain=SBAvocadoDebuggingControllerErrorDomain Code=1 "Failed
to get descriptors for extensionBundleID (**)"
UserInfo={NSLocalizedDescription=Failed to get descriptors for
extensionBundleID (**)}}}
Screenshot of the error message
我目前正在使用 Xcode 12.4,并在 iPhone 8 运行 和 iOS 14.3 上进行测试。
应用和小部件扩展都在同一个应用组中,并且使用有效的开发证书签名,扩展的标识符以应用的标识符作为前缀。
网上能找到的讨论,我试过:
- 清理构建文件夹不起作用(我做过很多次)
- 重新启动 Xcode 和 iPhone 不起作用(我也这样做过很多次)
- 删除小部件扩展并添加新的未修改的小部件扩展不起作用(似乎所有扩展都停止工作)
- 确保目标平台版本低于或等于测试平台不起作用
- 正在创建一个新项目并仅从原始项目复制源文件。手动更新 project/target 设置。这不起作用。
除了小部件扩展之外,我还向我的项目添加了一个动作扩展。但是当我发现小部件扩展停止工作时它似乎坏了。
我的猜测:如果问题与扩展中的代码有关,则扩展应该在 运行 时抛出错误,而不是 运行 扩展方案失败。所以我认为问题可能与 project/target 设置有关。但我不太确定。
我花了一整天的时间寻找解决方案。貌似上面关于报错信息的讨论比较少
如果有任何想法,我将不胜感激。 :)
好吧,我终于想通了,解决了这个问题。
事实证明字母大小写是罪魁祸首。
我没有提到的一件事是我的项目包含一个文件夹引用名称“Plugins”以打包到包中。它包含应用程序使用的几个 JavaScript 个文件。
Screenshot: How the file tree looks like
然后我注意到在“Build Phases”设置中,嵌入式应用程序扩展被指定为“PlugIns”作为默认目标,它与“Copy Bundle Resources”中列出的“Plugins”文件夹同名如果忽略字母大小写。
Screenshot: "Build Phases" settings
在浏览构建文件夹后,我发现小部件扩展被放置在“Plugins”文件夹下,而不是“PlugIns”文件夹下。当启动小部件扩展时,正在查找捆绑包中的“PlugIns”文件夹以查找 .appex
扩展。 “PlugIns”文件夹不存在,但“Plugins”文件夹在这种情况下存在。这也可以解释为什么应用程序有效但扩展程序无效。
重命名要包含在捆绑包中的文件夹解决了我的问题。
我最近在开发带有小部件扩展的 iOS 应用程序时遇到了一个问题。
一开始,我使用Xcode提供的模板代码,在新建的项目中添加了一个widget扩展,没有做任何改动。事实证明,在 运行 自动生成的扩展方案之后,小部件按预期工作。
在应用程序和扩展程序中添加了一些代码后,小部件扩展程序似乎存在一些问题。在我发现小部件库中缺少小部件之前,我什至没有注意到小部件扩展可能有问题。注意到问题后,我尝试 运行 使用小部件方案的项目。但它向我显示了以下错误消息:
SendProcessControlEvent:toPid: encountered an error: Error
Domain=com.apple.dt.deviceprocesscontrolserviceCode=8 "Failed
to show Widget '**' error: Error
Domain=SBAvocadoDebuggingControllerErrorDomain Code=1 "Failed
to get descriptors for extensionBundleID (**)"
UserInfo={NSLocalizedDescription=Failed to get descriptors for
extensionBundleID (**)}." UserInfo={NSLocalizedDescription=
Failed to show Widget '**' error: Error
Domain=SBAvocadoDebuggingControllerErrorDomain Code=1 "Failed
to get descriptors for extensionBundleID (**)"
UserInfo={NSLocalizedDescription=Failed to get descriptors for
extensionBundleID (**)}., NSUnderlyingError=0x12da945a0
{Error Domain=SBAvocadoDebuggingControllerErrorDomain Code=1 "Failed
to get descriptors for extensionBundleID (**)"
UserInfo={NSLocalizedDescription=Failed to get descriptors for
extensionBundleID (**)}}}
Screenshot of the error message
我目前正在使用 Xcode 12.4,并在 iPhone 8 运行 和 iOS 14.3 上进行测试。 应用和小部件扩展都在同一个应用组中,并且使用有效的开发证书签名,扩展的标识符以应用的标识符作为前缀。
网上能找到的讨论,我试过:
- 清理构建文件夹不起作用(我做过很多次)
- 重新启动 Xcode 和 iPhone 不起作用(我也这样做过很多次)
- 删除小部件扩展并添加新的未修改的小部件扩展不起作用(似乎所有扩展都停止工作)
- 确保目标平台版本低于或等于测试平台不起作用
- 正在创建一个新项目并仅从原始项目复制源文件。手动更新 project/target 设置。这不起作用。
除了小部件扩展之外,我还向我的项目添加了一个动作扩展。但是当我发现小部件扩展停止工作时它似乎坏了。
我的猜测:如果问题与扩展中的代码有关,则扩展应该在 运行 时抛出错误,而不是 运行 扩展方案失败。所以我认为问题可能与 project/target 设置有关。但我不太确定。
我花了一整天的时间寻找解决方案。貌似上面关于报错信息的讨论比较少
如果有任何想法,我将不胜感激。 :)
好吧,我终于想通了,解决了这个问题。
事实证明字母大小写是罪魁祸首。
我没有提到的一件事是我的项目包含一个文件夹引用名称“Plugins”以打包到包中。它包含应用程序使用的几个 JavaScript 个文件。
Screenshot: How the file tree looks like
然后我注意到在“Build Phases”设置中,嵌入式应用程序扩展被指定为“PlugIns”作为默认目标,它与“Copy Bundle Resources”中列出的“Plugins”文件夹同名如果忽略字母大小写。
Screenshot: "Build Phases" settings
在浏览构建文件夹后,我发现小部件扩展被放置在“Plugins”文件夹下,而不是“PlugIns”文件夹下。当启动小部件扩展时,正在查找捆绑包中的“PlugIns”文件夹以查找 .appex
扩展。 “PlugIns”文件夹不存在,但“Plugins”文件夹在这种情况下存在。这也可以解释为什么应用程序有效但扩展程序无效。
重命名要包含在捆绑包中的文件夹解决了我的问题。