![](/img/trans.png)
[英]UNNotificationServiceExtension - iOS10 - What Happens if the Service Crashes?
[英]iOS10 UNNotificationServiceExtension not called
我正在实施新的 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>
有什么问题或缺失?
还可以做的伎俩是检查扩展的部署目标。 我的设置为10.2
而我正在测试的设备(仍然)使用 10.1
将部署目标更改为10.0
, UNNotificationServiceExtension
实例被完美调用
如果您已正确完成所有操作,请不要忘记将其附加到流程中。
运行包含扩展程序的应用程序后:
最后我让这个工作正常,这就是我从这个问题中记得的。
1) 不要使用 iOS10 测试版的设备,因为我遇到的问题之一是因为我使用的是测试版。
2) 只有应用程序需要 APNS 权限,这对于用于扩展的权限不是必需的。
3)我正在使用与扩展名(不是通配符)匹配的配置文件,无论如何我无法确认它是否可以使用通配符正常工作。
4) NSExtensionAttributes 不是必需的,只需使用 NSExtensionPointIdentifier 和 NSExtensionPrincipalClass 作为扩展 .plist。 除非您使用自己的布局
5) 即使使用 iOS 9 令牌注册方法,这也有效。
6) 不要忘记推送通知中有效负载中的 mutable-content 值,这是服务器通过扩展所需的唯一强制值。
我认为这涵盖了我遇到的所有问题
如果您使用 Firebase,请尝试将有效负载更改为:
{
“aps” : {
“category” : “SECRET”,
“mutable_content” : true,
“alert” : {
“title” : “Secret Message!”,
“body” : “(Encrypted)”
},
},
“ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è Ω^¬%gq∞NÿÒQùw”
}
mutable_content 字段映射到 APNs 上的 mutable-content 字段。 有关更多详细信息,请访问此链接。
第二次来到这里。 第一次,这个答案帮助了我,第二次,它没有。 经过大量(内部)咒骂后,我发现我不知何故不小心从主应用程序目标中的嵌入式二进制文件中删除了扩展。 当我重新添加分机时,我的分机将再次被调用。
所以检查这个:
有同样的问题,为我解决的是从嵌入式二进制文件中删除扩展并再次添加它。
您必须在所有目标上将部署目标设置为相同。 我想知道为什么这不是由 XCode 自动完成的:/ .. Apple 喜欢浪费开发人员的时间 smh ...
在尝试了许多已经给出的可能修复但没有成功之后,我突然意识到一个框架被错误地添加到我们的扩展目标而不是单元测试目标。
删除框架并以 10.2 为目标允许我的扩展程序再次被调用。
如果您出于某种原因对哪个框架感到好奇,可以在这里找到它: https : //github.com/plu/JPSimulatorHacks
就我而言,这是我忘记在 Scheme 中选择 NotificationServiceExtension 作为特定应用程序而不是我尝试使用它的“我的应用程序”。 所以我一直在运行“我的应用程序”并等待另一个应用程序(NotificationServiceExtension)的代码中的断点,这就是它们从未出现的原因。 在此之前,我尝试了所有建议。
对于任何希望在应用程序的通知扩展中触发断点的人来说,Xcode 11.3 中的过程非常简单:
Edit Scheme
。Debug executable
。 通过取消选中此项,您将通知 Xcode 调试扩展而不是父应用程序。 这是让 Xcode 在扩展的断点内停止的关键。Launch
选项下选择Automatically
。 除非其他一些东西触发了 Xcode 的情绪化,否则上面的设置应该确保无论何时选择和运行扩展方案,扩展中的断点都会被命中。 如果您希望 Xcode 在父应用程序中的断点处停止,您可以返回并检查步骤 4 中的Debug executable
。
专业提示:不要忘记在通知 JSON 负载中添加"mutable-content": 1
,否则你会很伤心(iOS 不会在没有该键的情况下调用扩展)。
这是我的通知扩展的方案编辑器对话框的图片:
我的问题有两个方面。 第一个可能是我将Info.plist
属性 NSExtensionPrincipalClass 设置为bundle.identifier.NotificationService
而不是ProductModuleName.NotificationService
。 模块名称是默认值,但是在调试与不同方案和不同目标相关的其他一些事情时,我错误地更改了标识符。
第二个问题是我通过运行通知服务目标进行了测试。 对我来说,运行应用程序目标时效果要好得多。 我看到其他一些人推荐使用通知服务目标来启用调试。 但这在运行应用程序目标时也能正常工作。 不过,您必须手动将调试器附加到通知服务。
我发现上面的方法是用最少的代码创建一个新的测试项目。 事后看来,我绝对推荐这种方法,而不是尝试在 stackoverflow 等上找到的所有不同解决方案
所述public func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)
在方法UNNotificationServiceExtension
已迅速更改版本之间。
一些在线示例不是最新的。
确保您在UNNotificationServiceExtension
自定义子类中覆盖的方法
我有:
func didReceive(request: UNNotificationRequest, withContentHandler contentHandler:(UNNotificationContent) -> Void)
直到我改为:
func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)
确保您设置了“无”配置。 看看截图。 使用其他参数didReceive
不起作用。
另一种可能性是在 UNNotificationContentExtension 的 plist 文件中检查类别名称。
plist 中“UNNotificationExtensionCategory”的字符串值和有效负载的“category/click_action”应该相同。
在为此苦苦挣扎之后,我终于通过改变两件事来为我完成这项工作。
注意:请确保您在远程有效负载中有 "mutable-content" : 1。
希望这可以帮助某人。
我目前正在 Xcode 12.3 和 Swift 5.2 上工作,当我将主项目目标和通知服务扩展目标从iOS 14.2 退回到iOS 13.2 时,它起作用了!
仅当远程通知的有效负载包含以下信息时,系统才会执行您的通知内容应用扩展:
负载必须包含值为1
的mutable-content
键。
负载必须包含带有标题、副标题或正文信息的警报字典。
指定远程通知负载:
{
“aps” : {
“category” : “SECRET”,
“mutable-content” : 1,
“alert” : {
“title” : “Secret Message!”,
“body” : “(Encrypted)”
},
},
“ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è Ω^¬%gq∞NÿÒQùw”
}
感谢所有好的建议,这些建议帮助我解决了与部署目标不匹配和缺少可变内容的问题。 但对我来说,我仍然无法调用 NSE。 我在这个博客的源代码中找到了解决方案, https://medium.com/gits-apps-insight/processing-notification-data-using-notification-service-extension-6a2b5ea2da17 。 我缺少将扩展程序复制到我的应用程序的嵌入应用程序扩展程序。 为什么缺少这个,我不确定,在我阅读的不同教程中,我没有将此视为必需的步骤。
嵌入应用程序扩展只是一个已重命名的“复制文件阶段”,如此处解释https://stackoverflow.com/a/71031519/3080858
本教程也非常有助于设置不同的应用程序 ID、应用程序组、配置文件等: https://blog.logrocket.com/implement-push-notifications-react-native-onesignal/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.