今日扩展在有限的设备上“无法加载”

Posted

技术标签:

【中文标题】今日扩展在有限的设备上“无法加载”【英文标题】:Today Extension "Unable to Load" on limited devices 【发布时间】:2017-07-12 13:50:02 【问题描述】:

我有一个带有 Today Extension 的 ios 应用程序。我们现在正在测试(TestFlight),并且已经在大约十台设备上进行了测试。关联的小部件在除其中一台设备之外的所有设备上都可以正常显示。在一台设备上,小部件会显示可怕的“无法加载”消息。我们尝试过重启设备、删除/重新安装应用等。

查看设备日志,我看到这是第一个麻烦的参考:

container: WGMajorListViewController> Unable to load widget view controller with service (com.mycompany.MyApp.myApp-Today-Extension): Couldn\M-b\M^@\M^Yt communicate with a helper application.
container: WGMajorListViewController> No longer waiting on connection semaphore (<OS_dispatch_semaphore: 0x174c85410>)
container: WGMajorListViewController> Severed remote view controller connection
container: WGMajorListViewController> Widget disconnected unexpectedly
container: WGMajorListViewController> Aborting active life cycle sequence: <WGWidgetLifeCycleSequence: 0x175035460; sequenceID: com.mycompany.MyApp.myApp-Today-Extension.WGMajorListViewController.7/11/17, 3:13:00 PM; currentState: WGWidgetLifeCycleSequenceStateDidRequestRemoteView>
container: WGMajorListViewController> Remote view controller disconnected unexpectedly
container: WGMajorListViewController> Attempting to reconnect to remote view controller

扩展程序的代码没有尝试打开主机应用程序,所以这个错误让我很困惑。也许这是指内部 (iOS) 帮助应用程序?

第一行中的奇数转义字符在日志中。在这些行之后,它再次尝试,可能再试两次,然后失败。最终我看到Can't request remote view controller that is blacklisted 并且设备在重新启动之前不会重试:

mediaserverd(CoreMedia)[27] <Notice>: -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.mycompany.MyApp.myApp-Today-Extension with pid '257' is now Terminated. Background entitlement: NO
mediaserverd(CoreMedia)[27] <Notice>: -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.mycompany.MyApp.myApp-Today-Extension with pid '259' is now Terminated. Background entitlement: NO
symptomsd(SymptomEvaluator)[121] <Notice>: 257 com.mycompany.MyApp.myApp-Today-Extension: Terminated (most elevated: Terminated)
symptomsd(SymptomEvaluator)[121] <Notice>: 259 com.mycompany.MyApp.myApp-Today-Extension: Terminated (most elevated: Terminated)
symptomsd(SymptomEvaluator)[121] <Notice>: Entry, display name com.mycompany.MyApp.myApp-Today-Extension uuid (null) pid 257 isFront 0
symptomsd(SymptomEvaluator)[121] <Notice>: Duplicate removal of display name com.mycompany.MyApp.myApp-Today-Extension
symptomsd(SymptomEvaluator)[121] <Notice>: Entry, display name com.mycompany.MyApp.myApp-Today-Extension uuid (null) pid 259 isFront 0
symptomsd(SymptomEvaluator)[121] <Notice>: Duplicate removal of display name com.mycompany.MyApp.myApp-Today-Extension
container: WGMajorListViewController> End sequence '(null)' with reason: disappearance transition
container: WGMajorListViewController> Can't end sequence as argument sequence ((null)) doesn't match active sequence ((null)), or there's no active sequence
container: WGMajorListViewController> Begin sequence with reason: appearance transition
container: WGMajorListViewController> Initiating new life cycle sequence: '<WGWidgetLifeCycleSequence: 0x17522b6e0; sequenceID: com.mycompany.MyApp.myApp-Today-Extension.WGMajorListViewController.7/11/17, 3:13:12 PM; currentState: WGWidgetLifeCycleSequenceStateQuiescent>'
container: WGMajorListViewController> Connection requested with reason: 'appearance transition'
container: WGMajorListViewController> Will request remote view controller
container: WGMajorListViewController> Can't request remote view controller that is blacklisted

我没有看到任何来自扩展代码本身的日志记录,也没有任何迹象表明它正在实际启动。

该设备是 iPhone 7 Plus,运行 iOS 10.3.2 的公共版本。该小部件在所有其他设备上运行良好,其中许多设备也是 10.3.2。其他都不是 iPhone 7 Plus。该小部件在 iPhone 7 Plus 模拟器中运行良好。

虽然该版本是针对 iOS 9 和 Xcode 7 构建的,但同一台设备可以正常运行小部件的 App Store 版本。新版本使用 10.3 作为其基本 SDK,使用 Xcode 8.3.3。

有什么想法吗?

【问题讨论】:

我发现了另一部 iPhone 7 Plus (iOS 10) 和一部 iPhone 6 Plus (iOS 11 dev seed) - 两者都遇到了同样的问题。几个“较小”的 iPhone(6 等)可以正常运行 Widget。 iPhone 7 Plus Simulator 也可以正常运行 Widget。 我应该补充一点:在故障设备上连接 Xcode 时,代码永远不会运行。我在 Today Extension 的 ViewController 的 viewDidLoad 的第一行设置了一个断点,它从来没有命中。 Xcode 控制台中唯一的注释是Program ended with exit code: 0 我还在 iPhone 6s(也使用 PaintCode)上收到“无法请求被列入黑名单的远程视图控制器”错误,并且不知何故它有助于通过 TestFlight 安装我的应用程序的不同版本和然后是导致错误的版本。然而,这一次它没有错误地工作。我不知道是什么原因造成的,但也许这些信息有助于将来找出真正的问题。 【参考方案1】:

还有一次会发生这种情况,那就是如果在您的 Scheme 目标的 Run Diagnostics 部分下,您已经打开了 Thread Sanitizer / Undefined Behavior Sanitizer。它似乎不喜欢这些选项。

【讨论】:

在我的例子中,它是“Address Sanitizer”选项。只有在 Xcode 调试器下运行时才有效,没有调试器就无法加载。【参考方案2】:

哇,这很奇怪。问题的根源是一个坏的图像,或者更具体地说是坏的图像代码(从 PaintCode 导出)。该代码似乎在 3 倍的“Plus”尺寸设备上给 Widget 的 Storyboard 带来了麻烦。故事板从未初始化。

我使用(并且喜欢)PaintCode,并且尽可能使用它的图像代码。一切都是矢量,可用于任何大小。好东西。无论如何,您可以通过将 PaintCode 代码分配给拖入情节提要的对象来在情节提要中使用 PaintCode 图像。然后从该对象控制拖动到同一情节提要上的 UIImageView。在运行时,无论设备分辨率或图像大小如何,都可以完美绘制图像。

Widget 的情节提要有三幅图像,均来自 PaintCode。三张图片中的一张导致了问题。如果我删除图像,一切都很好。添加回来,小部件永远不会启动,并显示“无法加载”。图像并不复杂,据我所知。只是在 Sketch 中绘制的一个矢量图标。

我无法弄清楚为什么该图像行为不端。我玩了 PaintCode 设置,导出了几种方法,没有变化。所以我使用 Sketch 创建了一个 PDF 资源,并为图像使用了典型的资源目录。

通过控制台,我完全看不到任何线索,即使回想起来也是如此。我猜测,由于 Swift 代码从未启动,而这只是“加号”大小问题,可能存在 Storyboard 问题。删除所有 AutoLayout 约束后,我的直觉是损坏的 Storyboard 文件。所以我通过 Widget 故事板重新创建,并在此过程中进行测试。当我重新添加 PaintCode 图像时它坏了。一旦我有了这个,我回到我原来的故事板,拉出有问题的图像,小部件显示正常。

我会精简项目并将副本发送给 PixelCut 的优秀人员,让他们知道。如果他们有解决方法,我会在这里发布。

【讨论】:

@JonathaANTOINE:我的解决方法是在此处使用标准静态资产(资产目录中的 PDF),而不是动态生成的 (PaintCode) 资产。在这种情况下,我并不真正需要动态,所以我不会因为静态而失去任何东西。 谢谢!我和你有同样的问题,但我需要来自远程视图的动态图像:( @JonathaANTOINE 如果我需要它是动态的,我会尝试的下一件事是在情节提要中放置一个静态占位符图像,然后在小部件已经渲染后替换为动态图像(使用静态图像)。所以一个 DispatchQueue.main.async/DispatchQueue.main.asyncAfter。不确定这会奏效,但也许会。 你好@mitch。我最终发现从字节数据加载图像时 UImage 不是线程安全的。它现在可以使用正确的锁顺利运行。

以上是关于今日扩展在有限的设备上“无法加载”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Today Widget 在 iOS 14 上显示“无法加载”且无法调试?

Django无法在Ubuntu上加载SpatiaLite库扩展mod_spatialite

worklight 无法在真实设备上要求 DOJO Combobox - 无法加载... /dijit/form/nls/it/ComboBox.js

Openshift 无法加载 c++ bson 扩展/找不到模块('swig')

无法加载为扩展“[extensionHere]”注册的类型 [nameHere]

js-bson:无法加载 c++ bson 扩展,在 Windows 的 mongoose 上使用纯 JS 版本