我实施新的iOS10扩展程序以使用丰富的通知。我试图在推送通知上测试它但不起作用,我只收到一个简单的通知,而不是通过扩展。
我做了在官方网站和其他一些地方指定的所有内容:
正如我所说,我收到通知但从未通过扩展程序。我看到操作系统如何尝试加载扩展,但随后抛出一个没有相关描述的错误来识别问题:
Dec 31 21:00:00 iPhone SpringBoard(libextension.dylib)[51] <Notice>: calling plugIn beginUsing:
Dec 31 21:00:57 iPhone pkd[86] <Notice>: assigning plug-in com.test.app.NotificationWithAttachmentExtension(1.0) to plugin sandbox
Dec 31 21:03:57 iPhone pkd[86] <Notice>: enabling pid=51 for plug-in com.test.app.NotificationWithAttachmentExtension(1.0) 38BB5FF1-2597-42E0-B950-169DBFA80573 /private/var/containers/Bundle/Application/A8C47706-C0EC-4FB1-ABA7-0118372F6900/testapp.app/PlugIns/NotificationWithAttachmentExtension.appex
Dec 31 21:00:53 iPhone SpringBoard(PlugInKit)[51] <Notice>: plugin com.test.app.NotificationWithAttachmentExtension interrupted
Dec 31 21:03:56 iPhone SpringBoard(PlugInKit)[51] <Notice>: Hub connection error Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.test.app.NotificationWithAttachmentExtension" UserInfo={NSDebugDescription=connection to service named com.test.app.NotificationWithAttachmentExtension}
Jun 29 13:33:36 iPhone SpringBoard(libextension.dylib)[51] <Notice>: PlugInKit error in beginUsing:
Jun 17 23:33:04 iPhone SpringBoard(libextension.dylib)[51] <Notice>: killing invalid plugIn
Dec 31 21:00:00 iPhone SpringBoard(UserNotificationsServer)[51] <Error>: Extension error whilst trying to modify push notification F502-9B36: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.test.app.NotificationWithAttachmentExtension" UserInfo={NSDebugDescription=connection to service named com.test.app.NotificationWithAttachmentExtension}
Dec 31 21:00:00 iPhone SpringBoard(UserNotificationsServer)[51] <Notice>: [com.test.app] Saving notification F502-9B36
Dec 31 21:00:00 iPhone SpringBoard(libextension.dylib)[51] <Notice>: completed calling plugIn beginUsing: for pid: 0
相关扩展名.plist:
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>UNNotificationExtensionCategory</key>
<string>attachmentCategory</string>
<key>UNNotificationExtensionInitialContentSizeRatio</key>
<real>1</real>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.service</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
</dict>
错误或缺失了什么?
提前致谢
答案 0 :(得分:40)
还有什么可以解决的问题是检查扩展的部署目标。 Mine设置为10.2
,而我正在测试的设备(仍然)使用10.1
将部署目标更改为10.0
后,UNNotificationServiceExtension
实例被称为完美
答案 1 :(得分:7)
如果你已经正确地完成了所有事情,不要忘记将它附加到过程中。
运行包含扩展程序的应用程序后:
答案 2 :(得分:6)
最后,我的工作正常,这是我从这个问题中记得的。
1)不要使用iOS10测试版的设备,因为我遇到的一个问题是因为我使用的是测试版。
2)只有应用程序需要APNS权利,这不是用于扩展的私有化所必需的。
3)我正在使用与扩展名(不是通配符)匹配的配置文件,无论如何我无法通过通配符确认它是否正常工作。
4) NSExtensionAttributes不是必需的,只需使用NSExtensionPointIdentifier和NSExtensionPrincipalClass作为扩展名.plist。除非您使用自己的布局
5)即使使用iOS 9令牌注册方法也可以。
6)不要忘记推送通知中的有效负载中的可变内容值,这是服务器通过扩展所需的唯一必需值。
我认为这涵盖了我遇到的所有问题
答案 3 :(得分:3)
必须将所有部署目标上的部署目标设置为相同。我想知道为什么XCode不会自动完成此操作:/ .. Apple喜欢浪费开发人员的时间……
答案 4 :(得分:2)
好像你的plist混合2个plist。 游戏中有2个扩展名:
答案 5 :(得分:2)
第二次来到这里。第一次,this answer帮我,第二次,它没有。经过大量(内部)咒骂后,我发现我不知何故意外地从主应用程序目标中的嵌入式二进制文件中删除了扩展名。当我添加扩展名时,我的扩展名将再次被调用。
所以检查一下:
答案 6 :(得分:1)
我目前正在开发 Xcode 12.3 和 Swift 5.2,当我将主要项目目标和通知服务扩展目标从 iOS 14.2 退回到 iOS 13.2 时,成功了!
答案 7 :(得分:1)
在为此苦苦挣扎之后,我终于通过更改两件事为我完成了这项工作。
注意:确保远程有效负载中的“可变内容”为1。
希望这对某人有帮助。
答案 8 :(得分:1)
对于希望在应用的通知扩展中触发断点的任何人,此过程在Xcode 11.3中非常简单:
Edit Scheme
。Debug executable
。通过取消选中此选项,您是在通知Xcode调试扩展而不是父应用。这是使Xcode在扩展的断点内停止的关键。 Automatically
选项下选择Launch
。 除非有其他因素触发Xcode的情绪波动,否则上述设置应确保每当您选择并运行扩展方案时,扩展中的断点都会被选中。如果您希望Xcode在父应用程序中的断点处停止,则可以返回并在步骤4中检查Debug executable
。
专业提示:不要忘了在通知JSON有效负载中添加"mutable-content": 1
,否则您会感到非常难过(iOS会在没有该密钥的情况下调用扩展程序)。
这是我的方案编辑器对话框的通知扩展图片:
答案 9 :(得分:1)
在我的情况下,我忘记了在Scheme中选择NotificationServiceExtension作为特定应用程序,而不是在尝试使用它的地方选择“ my application”。因此,我一直在运行“我的应用程序”,并等待另一个应用程序(NotificationServiceExtension)的代码中的断点,这就是为什么它们从未显示出来的原因。在那之前我尝试了所有建议。
答案 10 :(得分:1)
答案 11 :(得分:1)
如果您使用的是Firebase,请尝试将有效负载更改为:
{
“aps” : {
“category” : “SECRET”,
“mutable_content” : true,
“alert” : {
“title” : “Secret Message!”,
“body” : “(Encrypted)”
},
},
“ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è Ω^¬%gq∞NÿÒQùw”
}
mutable_content字段映射到APN上的mutable-content字段。 有关更多详细信息,请遍历此link。
答案 12 :(得分:1)
在尝试了许多已经没有成功的可能修复之后,我突然意识到框架被错误地添加到我们的扩展目标而不是单元测试目标。
删除框架并定位10.2允许再次调用我的扩展程序。
如果您对哪个框架无论出于何种原因感到好奇,可以在此处找到它:https://github.com/plu/JPSimulatorHacks
答案 13 :(得分:0)
遇到了同样的问题,为我解决的问题是从Embedded Binaries中删除扩展,然后再次添加。
答案 14 :(得分:0)
其他可能性是检查UNNotificationContentExtension的plist文件中的类别名称。
plist中的“ UNNotificationExtensionCategory”字符串值和有效负载的“ category / click_action”应该相同。
答案 15 :(得分:0)
我的问题是双重的。第一个可能是我将Info.plist
属性NSExtensionPrincipalClass设置为bundle.identifier.NotificationService
而不是ProductModuleName.NotificationService
。模块名称是默认值,但在调试与不同方案和不同目标相关的其他一些内容时,我错误地将其更改为标识符。
第二个问题是我通过运行通知服务目标进行了测试。对我来说,在运行应用程序目标时效果更好。我看到其他一些人建议使用通知服务目标来启用调试。但是,在运行应用程序目标时也能正常工作。您必须手动将调试器附加到通知服务。
我发现上述方法是用最少的代码创建一个新的测试项目。事后我绝对推荐这种方法,而不是尝试在stackoverflow等上找到所有不同的解决方案
答案 16 :(得分:0)
仅当远程通知的有效负载包含以下信息时,系统才执行通知内容应用扩展:
有效负载必须包含值为mutable-content
的{{1}}键。
有效负载必须包括带有 title , subtitle 或 body 信息。
指定远程通知有效负载:
1
答案 17 :(得分:0)
请确保您拥有“没有”&#39;配置集。看截图。使用其他参数didReceive
无效。
答案 18 :(得分:0)
public func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)
中的UNNotificationServiceExtension
方法在swift版本之间发生了变化。
有些在线示例不是最新的。
确保您在自定义子类UNNotificationServiceExtension
我有:
func didReceive(request: UNNotificationRequest, withContentHandler contentHandler:(UNNotificationContent) -> Void)
直到我改为:
才开始工作 func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)