16

我一直在做一个今天的扩展,从提要中下载文章并显示最新的文章。整个事情在 iOS 8 上运行良好,仍然在 iOS 8.1 上运行,然后是 iOS 8.1.2,我们开始抱怨今天的扩展不再工作了。我尝试在 iOS 8.1.2 设备上进行调试,甚至在扩展启动之前,它就因以下错误而崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <__NSConcreteUUID 0x174027280> 5AFB07AB-5DCD-46FE-8D07-44DE0F3789F2)'

我已经阅读了这篇关于开发今日扩展时经常发生的错误的帖子:http: //www.atomicbird.com/blog/ios-app-extension-tip

汤姆哈灵顿在他的帖子中说:

在 iOS 8(和其他最新版本)中,在 Xcode 的构建设置中启用模块意味着您无需显式列出要使用的所有框架。它们会被自动找到。

但今天扩展使用的 NotificationCenter.framework 并非如此。如果您从构建设置中删除它,您将不会收到任何构建警告或错误。但是当你尝试加载扩展时,你会从 libextension.dylib 中得到一个异常并且你的扩展不会加载。异常消息没有启发性:

2014-08-16 12:06:53.793 TodayTestExtension[41313:6111763] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* setObjectForKey:对象不能为零(键:<__NSConcreteUUID 0x7fd729422390> ED3B42F8-66CD-4CB0- BCD5-F3DBA​​6F34DB5)' 如果您正在进行今天的扩展,只需将该框架留在构建设置中。它不应该在那里,但它确实存在。

我的扩展在其构建设置中确实包含 NotificationCenter.framework,但我怀疑我的问题在某些方面可能相似。

有人遇到过类似的问题吗?知道如何解决吗?

4

4 回答 4

48

如果您在“Info.plist”中使用 NSExtensionPrincipalClass 以使用不存在的 ViewController 的名称定义基类(而不是使用情节提要),也会发生此错误。

使用 Swift 时,请确保在类前面加上模块名称(通常是目标名称),例如“Module.MyViewController”。

于 2015-03-23T10:34:14.030 回答
1

最终,我尝试从目标中删除 NotificationCenter.framework 并将其放回原处,清理了项目,现在它又可以正常工作了。我猜这个框架毕竟没有正确链接,尽管我可以用 xcode 在我的目标上看到它。另外,我不知道为什么它确实有效,然后随着 8.1.2 的到来而停止工作。

于 2015-02-12T13:21:21.440 回答
1

我通过将@objc属性添加到 Swift 类来解决此问题。

@objc(NotificationViewController)
class NotificationViewController: UIViewController, UNNotificationContentExtension {
...
}
于 2019-02-05T08:38:10.093 回答
0

刚刚遇到同样的问题。对我来说,它是键盘目标的“常规设置”中的“主界面”属性。它是空白的,我将它设置为我的故事板文件,现在它就像一个魅力。截屏

于 2015-02-10T19:37:54.550 回答