26

我正在实施新的 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>

有什么问题或遗漏?

4

20 回答 20

70

什么也可以做的伎俩是检查您的扩展部署目标。10.2当我正在测试的设备(仍然)使用 10.1 时,我的设置为

将部署目标更改10.0UNNotificationServiceExtension实例后被完美调用

于 2017-02-02T14:28:35.907 回答
25

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

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

  1. 在扩展中设置断点
  2. 按 PID 或名称选择调试/附加到进程
  3. 输入扩展目标的名称
  4. 触发推送通知
于 2017-05-09T20:38:22.980 回答
13

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

1)不要使用iOS10 beta版的设备,因为我遇到的问题之一是因为我使用的是beta版。

2) 只有应用程序需要 APNS 权利,这对于用于扩展的 privisoning 不是必需的。

3)我正在使用与扩展名(不是通配符)匹配的配置文件,无论如何我无法确认它是否可以正常使用通配符。

4) NSExtensionAttributes 不是必需的,只需使用 NSExtensionPointIdentifier 和 NSExtensionPrincipalClass 作为扩展名 .plist。除非您使用自己的布局

5) 即使使用 iOS 9 令牌注册方法,这也有效。

6) 不要忘记推送通知中传入的有效负载中的 mutable-content 值,这是服务器通过扩展所需的唯一强制值。

我认为这涵盖了我遇到的所有问题

于 2016-12-20T18:05:29.783 回答
9

如果您使用的是 Firebase,请尝试将有效负载更改为:

{
   “aps” : {
      “category” : “SECRET”,
      “<strong>mutable_content” : true,
      “alert” : {
         “title” : “Secret Message!”,
         “body”  : “(Encrypted)”
     },
   },
   “ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è   Ω^¬%gq∞NÿÒQùw”
}

mutable_content 字段映射到 APN 上的 mutable-content 字段。有关更多详细信息,请通过此链接

于 2018-11-14T13:32:21.573 回答
8

第二次来到这里。第一次,这个答案帮助了我,第二次,它没有。经过大量(内部)宣誓后,我发现我不小心从我的主应用程序目标中的 Embedded Binaries 中删除了扩展。当我重新添加分机时,我的分机将再次被调用。

所以检查一下:

  1. 单击左侧的应用程序项目。
  2. 单击您的主要应用目标。
  3. 选择常规。
  4. 在 Embedded Binaries 下,确保列出了您的扩展程序,如果没有,请添加它。
于 2017-12-15T07:38:14.493 回答
8

Swift 5 简单的方法

 this is very easy way just do it like this

在此处输入图像描述

于 2019-07-25T05:12:37.663 回答
7

有同样的问题,为我解决的问题是从 Embedded Binaries 中删除扩展并再次添加它。

于 2019-06-12T15:52:16.513 回答
6

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

于 2020-08-26T10:13:37.113 回答
5

似乎您的 plist 正在混合 2 个 plist。有2个扩展在起作用:

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

这是Notification Content Extension目标的plist:

在此处输入图像描述

这是Notification Service Extension目标的plist:

r

于 2016-10-07T15:57:26.853 回答
3

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

于 2019-08-03T22:16:33.027 回答
3

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

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

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

于 2017-08-16T14:27:34.303 回答
3

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

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

除非其他一些东西触发了 Xcode 的喜怒无常,否则上述设置应该确保无论何时选择并运行扩展方案,扩展中的断点都会被命中。Debug executable如果您希望 Xcode 在父应用程序中的断点处停止,您可以返回并检查第 4 步。

专业提示:不要忘记"mutable-content": 1在通知 JSON 负载中添加,否则你会很伤心(iOS 不会在没有该键的情况下调用扩展)。


这是通知扩展的方案编辑器对话框的图片:

在此处输入图像描述

于 2020-02-14T03:11:23.857 回答
2

我的问题有两个方面。第一个可能是我将Info.plist属性 NSExtensionPrincipalClass 设置为bundle.identifier.NotificationService而不是ProductModuleName.NotificationService. 模块名称是默认的,但是我在调​​试与不同方案和不同目标相关的其他一些东西时错误地更改为标识符。

第二个问题是我通过运行通知服务目标进行了测试。对我来说,运行应用程序目标时效果更好。我看到其他一些人建议使用通知服务目标来启用调试。但这在运行应用程序目标时也可以正常工作。不过,您必须手动将调试器附加到通知服务。

我发现上面的方法是用最少的代码创建一个新的测试项目。事后看来,我绝对推荐这种方法,而不是尝试在 stackoverflow 等上找到的所有不同解决方案

于 2017-12-15T11:01:07.897 回答
1

swift 版本之间的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)

于 2016-10-04T19:04:19.437 回答
1

其他可能性是检查 UNNotificationContentExtension 的 plist 文件中的类别名称。

plist中“UNNotificationExtensionCategory”的字符串值和payload的“category/click_action”应该相同。

于 2019-10-03T10:04:58.497 回答
1

我目前正在研究 Xcode 12.3 和 Swift 5.2,当我将 Main Project Target 和 Notification Service Extension Target 从iOS 14.2 退回iOS 13.2时,它起作用了!

于 2020-12-21T06:40:57.173 回答
1

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

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

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

希望这可以帮助某人。

于 2020-05-07T12:10:32.063 回答
1

确保您设置了“无”配置。看截图。使用其他参数didReceive不起作用。

配置

于 2017-07-06T08:48:57.097 回答
0

感谢所有好的建议,它们帮助我解决了与部署目标不匹配和缺少可变内容的问题。但对我来说,我仍然无法调用 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/

于 2022-02-22T08:18:21.097 回答
0

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

  • 有效负载必须包含mutable-content值为 的键1

  • 有效负载必须包含带有titlesubtitlebody信息的警报字典。

指定远程通知负载:

{
   “aps” : {
      “category” : “SECRET”,
      “mutable-content” : 1,
      “alert” : {
         “title” : “Secret Message!”,
         “body”  : “(Encrypted)”
     },
   },
   “ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è   Ω^¬%gq∞NÿÒQùw”
}
于 2020-04-22T10:49:27.613 回答