繁体   English   中英

iOS10 UNNotificationServiceExtension 未调用

[英]iOS10 UNNotificationServiceExtension not called

我正在实施新的 iOS10 扩展以使用丰富的通知。 我试图在推送通知上对其进行测试,但没有用,我只是收到一个简单的通知,并没有通过扩展。

我做了官方网站和其他一些地方指定的所有内容:

  • 我的应用程序已启动并运行,带有推送通知和正确的配置文件
  • 我在我的应用程序中添加了一个新目标,一个通知服务扩展
  • 实现了我自己的代码(这并不重要,因为甚至没有进入新班级)
  • 此外,我还必须为此扩展设置配置文件,我只使用一个带有通配符的配置文件,我没有看到任何说明扩展目标是否必须启用推送通知功能的文档,在这种情况下,我需要为此进行特定配置一,目前我只使用通配符 prov,无论如何它匹配(它必须匹配)我在应用程序目标中使用的配置文件,并且仅为应用程序目标启用推送通知功能。
  • 我添加了 UNNotificationExtensionCategory 和 NSExtensionPointIdentifier。 我还从服务器发送类别作为推送有效负载的一部分。

正如我所说,我收到了通知,但从未经历过延期。 我看到操作系统如何尝试加载扩展,但随后抛出一个没有相关描述的错误来识别问题:

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.0UNNotificationServiceExtension实例被完美调用

如果您已正确完成所有操作,请不要忘记将其附加到流程中。

运行包含扩展程序的应用程序后:

  1. 在扩展中设置断点
  2. 按 PID 或名称选择调试/附加到进程
  3. 输入扩展目标的名称
  4. 触发推送通知

最后我让这个工作正常,这就是我从这个问题中记得的。

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 字段。 有关更多详细信息,请访问此链接

第二次来到这里。 第一次,这个答案帮助了我,第二次,它没有。 经过大量(内部)咒骂后,我发现我不知何故不小心从主应用程序目标中的嵌入式二进制文件中删除了扩展。 当我重新添加分机时,我的分机将再次被调用。

所以检查这个:

  1. 单击左侧的应用程序项目。
  2. 单击您的主要应用目标。
  3. 选择通用。
  4. 在 Embedded Binaries 下,确保列出了您的扩展名,如果没有,请添加它。

有同样的问题,为我解决的是从嵌入式二进制文件中删除扩展并再次添加它。

Swift 5 简单方法

 this is very easy way just do it like this

在此处输入图片说明

看起来您的 plist 正在混合 2 个 plist。 有2个扩展在玩:

  1. 通知内容扩展 - 负责通过视图控制器显示内容
  2. Notification Service Extension - 负责在显示通知之前在后台获取内容

这是Notification Content Extension目标的 plist:

在此处输入图片说明

这是Notification Service Extension目标的 plist:

r

您必须在所有目标上将部署目标设置为相同。 我想知道为什么这不是由 XCode 自动完成的:/ .. Apple 喜欢浪费开发人员的时间 smh ...

在尝试了许多已经给出的可能修复但没有成功之后,我突然意识到一个框架被错误地添加到我们的扩展目标而不是单元测试目标。

删除框架并以 10.2 为目标允许我的扩展程序再次被调用。

如果您出于某种原因对哪个框架感到好奇,可以在这里找到它: https : //github.com/plu/JPSimulatorHacks

就我而言,这是我忘记在 Scheme 中选择 NotificationServiceExtension 作为特定应用程序而不是我尝试使用它的“我的应用程序”。 所以我一直在运行“我的应用程序”并等待另一个应用程序(NotificationServiceExtension)的代码中的断点,这就是它们从未出现的原因。 在此之前,我尝试了所有建议。

对于任何希望在应用程序的通知扩展中触发断点的人来说,Xcode 11.3 中的过程非常简单:

  1. 选择扩展的方案(不是父应用方案)。
  2. 选择Edit Scheme
  3. 选择可执行文件作为您的父应用程序。
  4. 取消选中Debug executable 通过取消选中此项,您将通知 Xcode 调试扩展而不是父应用程序。 这是让 Xcode 在扩展的断点内停止的关键。
  5. Launch选项下选择Automatically
  6. 运行扩展程序(不是父应用程序)的方案。
  7. 向您的设备发送通知。 利润。

除非其他一些东西触发了 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”应该相同。

在为此苦苦挣扎之后,我终于通过改变两件事来为我完成这项工作。

  1. NotificationServiceExtension 目标的 bundleID 必须是不同的。 首选样式 com.companyname.appname.notificationservice(whatever)。 设置应用程序的相同 bundleID 会导致构建到设备失败。
  2. 主要的是部署目标。 我用应用程序的目标仔细检查了这一点,但我们还必须检查新创建的 NotificationServiceExtenion 目标的部署目标,默认情况下是最新版本。 将其设置为您想要支持但大于 ios 10 的最低 iOS 版本。

注意:请确保您在远程有效负载中有 "mutable-content" : 1。

希望这可以帮助某人。

我目前正在 Xcode 12.3 和 Swift 5.2 上工作,当我将主项目目标和通知服务扩展目标从iOS 14.2 退回iOS 13.2 时,它起作用了!

仅当远程通知的有效负载包含以下信息时,系统才会执行您的通知内容应用扩展:

  • 负载必须包含值为1mutable-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM