不使用故事板编写iOS 8共享扩展

29

有没有好的方法可以在没有附带 MainInterface.storyboard 模板的情况下编写 iOS 8 共享扩展?

当我删除文件或从 Info.plist 中移除 NSExtensionMainStoryboard 时,扩展停止工作(在共享面板上点击按钮时不会发生任何事情)。我们尝试用 NSExtensionPrincipalClass 替换 NSExtensionMainStoryboard,但也不起作用。

有什么想法吗?

4个回答

65

搞定了!

原来Swift中出现了奇怪的模块命名问题,你可以通过在类中添加@objc名称来解决:


@objc(PrincipalClassName)

class PrincipalClassName: UIViewController {
...

然后将NSExtensionPrincipalClass键设置为PrincipalClassName


嗨!谢谢,你能具体说明一下你在哪里找到这个的来源吗? - Akshansh Thakur
1
在使用Swift时,您需要在Info.plist的NSExtensionPrincipalClass键的值字段中指定“NotificationContent.NotificationContentViewController”。在这里,“NotificationContent”是模块名称,“NotificationContentViewController”是唯一的视图控制器类。 - DawnSong

25
不要使用@objc的hack方法,在Swift中正确的做法是在NSExtensionPrincipalClass中包含模块名称,即:
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ActionViewController</string>

(否则记录错误)
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: ...)'

希望能帮助到将来遇到这个错误的人。Xcode 15显示了一个详细且更有帮助的错误信息。
__extensionPrincipalClass != nil - /Library/Caches/com.apple.xbs/Sources/ExtensionFoundation_Sim/ExtensionFoundation/Source/NSExtension/NSExtensionSupport/EXConcreteExtensionContextVendor.m:109:
Unable to find NSExtensionPrincipalClass (MessagesViewController) in
extension bundle! Please verify that the extension links the required
frameworks and that the value for NSExtensionPrincipalClass is
prefixed with '$(PRODUCT_MODULE_NAME).' if the class is implemented in
Swift. Type: Fault | Timestamp: 2023-09-19 18:05:10.722854-07:00 |
Library: ExtensionFoundation | Subsystem: com.apple.extensionkit |
Category: default | TID: 0x4f172

我同意这比@objc指令更好,也更明确。对我有用。 - Doug Boutwell
你太棒了!一直在寻找代码崩溃的原因,自己肯定想不到。 - Muvimotv

14

结合答案1答案2,找到了这些答案的答案。

对于Objective-C,您需要将以下内容放入App extension的info.plist中:NSExtensionPrincipalClass,并确保它在NSExtension Dict下面。

因此,完整的答案应该像这样,以我为例,ActionViewController是App扩展视图控制器。

输入图片描述


5

无法添加评论,但它不再是NSPrincipalClass,而是NSExtensionPrincipalClass


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接