【问题标题】:iOS10 UNNotificationServiceExtension not callediOS10 UNNotificationServiceExtension 未调用
【发布时间】:2017-02-01 11:58:33
【问题描述】:

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

出了什么问题或遗漏了什么?

【问题讨论】:

  • 尝试添加:UNNotificationExtensionDefaultContentHiddenNSExtensionAttributes
  • 您找到解决方案了吗?如果是这样,您能否描述一下或分享一个链接,因为我们遇到了类似的问题...
  • @BenMarten,我终于让它正常工作了,这就是我从这个问题中记住的:
  • 评论在下面作为答案,它太长了,不能作为评论......
  • 有点跑题了,但是如何获取跳板日志呢? 12月31日 21:00:00 iPhone跳板

标签: ios apple-push-notifications ios10 ios-app-extension unnotificationserviceextension


【解决方案1】:

UNNotificationServiceExtension 中的 public func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -&gt; Void) 方法在 swift 版本之间发生了变化。

一些在线示例不是最新的。

确保您在 UNNotificationServiceExtension 的自定义子类中覆盖的方法

我有:

func didReceive(request: UNNotificationRequest, withContentHandler contentHandler:(UNNotificationContent) -&gt; Void)

直到我改为:

func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -&gt; Void)

【讨论】:

  • 感谢您的评论。我刚刚检查过,但我有正确的方法,我使用的是 Objective-c,并且我在界面中使用的方法完全相同(UNNotificationServiceExtension)
  • 知道了。您是否在推送有效负载(服务器端)中发送“类别”?
  • 可能没有,我们有我们的 APNS 服务器的基本功能,并且我们添加了苹果建议的内容(可变内容和我们想在客户端读取的任何额外信息)。
  • 我尝试按照苹果规范(plist 配置和服务器端值)设置此类别,但仍然无法正常工作。我看到苹果规范提到“NSExtensionAttribute”,但很多示例代码都使用“NSExtensionAttributes”(复数),为了以防万一,我都尝试了,但我仍然得到完全相同的结果。出现此错误而根本没有描述错误是非常令人沮丧的,一条简单的消息解释 Apple 试图验证的内容就足以确定问题...
  • 肯定是NSExtensionAttributes 可以发一下相关plist吗?
【解决方案2】:

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

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

这是Notification Content Extension目标的plist:

这是Notification Service Extension目标的plist:

【讨论】:

  • 但在我的情况下,我没有使用自定义 UI,我只是使用扩展来修改内容(实际上甚至没有通过我的代码,所以假设我只是按原样发送内容)。现在我看到 NSExtensionAttributes 是内容扩展所必需的,但看起来这不是我的情况。这是我遵循的第一个文档,当帖子开始时,我的实现不起作用:developer.apple.com/reference/usernotifications/…
  • 链接已损坏。你在 aps 有效载荷中发送mutable-content: 1 吗?
  • 是的,事实上,如果操作系统已经找到我的扩展但没有运行代码,我在设备日志中看到的错误。所以 mutable-content 在那个时候已经被验证了(没有这个甚至不会检查通知扩展)
  • 你明白了吗?
  • 你找到解决办法了吗?
【解决方案3】:

我终于让这个工作正常了,这就是我从这个问题中记得的。

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

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

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

4) NSExtensionAttributes 不是必需的,只需将 NSExtensionPointIdentifier 和 NSExtensionPrincipalClass 用于扩展 .plist。除非你使用自己的布局

5) 即使使用 iOS 9 令牌注册方法,它也能正常工作。

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

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

【讨论】:

  • 我们需要在会员中心为 UNNotificationServiceExtension 创建单独的 bundle id 和配置文件?
  • 应用扩展需要APNs,否则无法编译。
  • 同样不工作请有人分享应用程序委托的代码他做了什么???????
  • 正确设置一切。但它仍然无法正常工作:(
【解决方案4】:

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

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

【讨论】:

  • 太棒了。我犯了同样的错误。非常感谢。
  • 天哪!这是非常好的和简单的解决方案。我什至没想过要检查这个。
  • 谢谢!非常感谢@basvk 我为其中一个目标集成了一个推送库,然后不得不在同一周内为第二个目标重新集成。两次我都浪费了很多时间没有检查目标并最终得到了你的答案
  • 非常感谢,它对我帮助很大。当扩展部署目标为 10.3 时,我使用的是 10.1 设备
  • 面对手掌。我在这个问题第三次。这个答案第二次帮助了我。下次我保证送蛋糕。 ?
【解决方案5】:

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

运行包含扩展的应用后:

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

【讨论】:

  • +1 这个答案非常有帮助,因为我忘记了这是一个单独的进程,并且如果我只是运行应用程序进程,我希望断点可以工作。
  • NotificationService 类没有出现在那里!!
  • 尝试手动添加它,当您开始输入名称时,它应该会出现@Basir Alam
  • @BasirAlam from here 如果您尝试调试由操作系统触发的扩展,那么您需要做一些事情以便操作系统触发它。只有这样您才能将其附加到调试器。
  • 不知道你可以这样做,谢谢哥们!
【解决方案6】:

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

Configuration

【讨论】:

    【解决方案7】:

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

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

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

    【讨论】:

    • 救了我,伙计。谢谢!
    【解决方案8】:

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

    所以检查一下:

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

    【讨论】:

      【解决方案9】:

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

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

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

      【讨论】:

        【解决方案10】:

        如果您使用的是 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

        【讨论】:

        • 使用常规的非firebase API,该字段被命名为“mutable-content”并且必须与“alert”属性相邻
        • @CalS 对!显然,如果“mutable-content”的值不同于“false”或0,则通知被认为具有可变内容。
        【解决方案11】:

        遇到了同样的问题,为我解决的方法是从 Embedded Binaries 中删除扩展并重新添加。

        【讨论】:

        • 这个。难以置信,但这就是为我解决这个问题的原因。我用头撞墙了两天。
        • 在很长一段时间后,这对我来说是解决方法。我已经实施了很多次丰富的推送。但这一次不知何故不适用于我的新项目。这个答案改变了一些东西,现在它正在工作。谢谢。
        • 难以置信,这应该得到更多的支持!在 4 小时的咒骂之后拯救了我的一天^_^
        • 这是一个疯狂的修复 - 试一试,也为我解决了这个问题!
        【解决方案12】:

        Swift 5 简单方法

         this is very easy way just do it like this
        

        【讨论】:

        • 这对我有用,让我像个傻瓜:joy:
        【解决方案13】:

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

        【讨论】:

        • 我浪费了四个小时的生命,直到找到了这个解决方案。上帝保佑你!
        【解决方案14】:

        另一种可能是检查 UNNotificationContentExtension 的 plist 文件中的类别名称。

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

        【讨论】:

          【解决方案15】:

          对于希望在应用的通知扩展中触发断点的任何人,在 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 不会在没有该键的情况下调用扩展)。


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

          【讨论】:

            【解决方案16】:

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

            • 负载必须包含 mutable-content 键,其值为 1

            • 有效负载必须包含带有 titlesubtitle正文信息。

            指定远程通知负载:

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

            【讨论】:

              【解决方案17】:

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

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

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

              希望这对某人有所帮助。

              【讨论】:

                【解决方案18】:

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

                【讨论】:

                • 拯救了我的一天。我的主应用程序上有 14.0,服务扩展上有 14.1。没有工作。将服务扩展更改为 14.0 并立即生效。谢谢!
                【解决方案19】:

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

                【讨论】:

                  猜你喜欢
                  • 2019-01-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-01-27
                  • 1970-01-01
                  • 2017-04-15
                  • 1970-01-01
                  • 2018-09-05
                  • 2017-08-14
                  相关资源
                  最近更新 更多