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 上进行测试。 应用和小部件扩展都在同一个应用组中,并且使用有效的开发证书签名,扩展的标识符以应用的标识符作为前缀。

网上能找到的讨论,我试过:

除了小部件扩展之外,我还向我的项目添加了一个动作扩展。但是当我发现小部件扩展停止工作时它似乎坏了。

我的猜测:如果问题与扩展中的代码有关,则扩展应该在 运行 时抛出错误,而不是 运行 扩展方案失败。所以我认为问题可能与 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”文件夹在这种情况下存在。这也可以解释为什么应用程序有效但扩展程序无效。

重命名要包含在捆绑包中的文件夹解决了我的问题。