今天扩展在 iOS 8.1.2 上启动前崩溃

Today Extension Crashes before launching on iOS 8.1.2

我一直在制作今天的扩展程序,它可以从提要下载文章并显示最新的文章。 整个事情在 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)'

我读过这个 post 关于开发今天的扩展时经常发生的错误:http://www.atomicbird.com/blog/ios-app-extension-tip

Tom Harrington 在他的 post 中说:

In iOS 8 (and other recent versions), enabling modules in Xcode's build settings means you don't need to explicitly list all the frameworks you want to use. They'll be found automatically.

But this isn't the case with NotificationCenter.framework, which Today extensions use. If you remove that from the build settings, you won't get any build warnings or errors. But when you try to load the extension, you'll get an exception from libextension.dylib and your extension won't load. The exception message is not enlightening:

2014-08-16 12:06:53.793 TodayTestExtension[41313:6111763] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* setObjectForKey: object cannot be nil (key: <__NSConcreteUUID 0x7fd729422390> ED3B42F8-66CD-4CB0-BCD5-F3DBA6F34DB5)' If you're doing a today extension, just leave that framework in the build settings. It shouldn't need to be there, but it does.

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

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

刚遇到同样的问题。对我来说,它是键盘目标的 "General settings" 中的 "Main Interface" 属性。它是空白的,我将它设置到我的故事板文件中,现在它就像一个魅力。

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

如果您在 "Info.plist" 中使用 NSExtensionPrincipalClass 来定义基础 class(而不是使用情节提要),并且名称为 ViewController,则不会发生此错误存在。

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

我通过将 @objc 属性添加到 Swift class 解决了这个问题。

@objc(NotificationViewController)
class NotificationViewController: UIViewController, UNNotificationContentExtension {
...
}