iOS10 UNNotificationServiceExtension未调用

时间:2016-09-23 15:00:08

标签: ios apple-push-notifications ios10

我实施新的iOS10扩展程序以使用丰富的通知。我试图在推送通知上测试它但不起作用,我只收到一个简单的通知,而不是通过扩展。

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

  • 我的应用程序启动并运行推送通知和正确的配置文件
  • 我在我的应用中添加了一个新目标,即通知服务扩展
  • 实施了我自己的代码(它并不重要,因为甚至没有进入新班级)
  • 另外我必须为此扩展设置配置文件,我只使用带有通配符的配置文件,我没有看到任何文档指定扩展目标是否必须启用推送通知功能,在这种情况下我需要对于这一个的特定配置,目前我只使用通配符提供,无论如何它匹配(它必须匹配)我在应用目标中使用的配置文件,并且仅为应用目标启用了推送通知功能。
  • 我添加了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>

错误或缺失了什么?

提前致谢

19 个答案:

答案 0 :(得分:40)

还有什么可以解决的问题是检查扩展的部署目标。 Mine设置为10.2,而我正在测试的设备(仍然)使用10.1

将部署目标更改为10.0后,UNNotificationServiceExtension实例被称为完美

答案 1 :(得分:7)

如果你已经正确地完成了所有事情,不要忘记将它附加到过程中。

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

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

答案 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个扩展名:

  1. 通知内容扩展 - 负责通过视图控制器显示内容
  2. 通知服务扩展 - 负责在显示通知之前在后台获取内容
  3. 以下是Notification Content Extension目标的谎言:

    enter image description here

    以下是Notification Service Extension目标的谎言:

    r

答案 5 :(得分:2)

第二次来到这里。第一次,this answer帮我,第二次,它没有。经过大量(内部)咒骂后,我发现我不知何故意外地从主应用程序目标中的嵌入式二进制文件中删除了扩展名。当我添加扩展名时,我的扩展名将再次被调用。

所以检查一下:

  1. 点击左侧的应用项目。
  2. 点击您的主应用目标。
  3. 选择常规。
  4. 在嵌入式二进制文件下,​​确保列出了您的扩展程序,如果没有,请添加它。

答案 6 :(得分:1)

我目前正在开发 Xcode 12.3 和 Swift 5.2,当我将主要项目目标和通知服务扩展目标从 iOS 14.2 退回到 iOS 13.2 时,成功了!

答案 7 :(得分:1)

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

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

注意:确保远程有效负载中的“可变内容”为1。

希望这对某人有帮助。

答案 8 :(得分:1)

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

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

除非有其他因素触发Xcode的情绪波动,否则上述设置应确保每当您选择并运行扩展方案时,扩展中的断点都会被选中。如果您希望Xcode在父应用程序中的断点处停止,则可以返回并在步骤4中检查Debug executable

专业提示:不要忘了在通知JSON有效负载中添加"mutable-content": 1,否则您会感到非常难过(iOS会在没有该密钥的情况下调用扩展程序)。


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

enter image description here

答案 9 :(得分:1)

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

答案 10 :(得分:1)

Swift 5简单方法

 this is very easy way just do it like this

enter image description here

答案 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无效。

Configuration

答案 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)