2016-09-23 302 views
8

Im实现新的iOS10扩展以使用丰富的通知。我试图在推送通知上测试它,但不工作,我只收到一个简单的通知,并没有通过扩展。iOS10 UNNotificationServiceExtension未被调用

我所做的一切,它的官方网站和其他一些地方规定:

  • 我有我的应用程序启动和推送通知运行和正确的provisioning profile
  • 我添加了一个新的目标,以我的应用程序,通知服务扩展
  • 实施我自己的代码(真的没关系,因为甚至没有进入新班级)
  • 此外,我必须为此扩展设置配置文件,我只使用一个通配符,我没有看到任何文件entation指定扩展目标是否必须启用推送通知功能,在这种情况下,我需要一个特定的供应,此时我只使用通配符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> 

缺少了什么错或?

在此先感谢

+0

尝试添加此: UNNotificationExtensionDefaultContentHidden \t \t \t 到'NSExtensionAttributes' –

+0

你有没有找到一个解决办法?如果是这样,请你描述它或共享链接,因为我们遇到类似的问题... –

+0

@ BenMarten,终于我有这个工作正常,这是我从这个问题上记得: –

回答

4

最后,我有这个正常工作,这是我从这个问题还记得。

1)不要使用设备与iOS10测试版,因为我有一个问题是因为我使用的是测试版。

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

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

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

5)即使使用iOS 9令牌注册方法,这也是可行的。

6)不要忘记进入推送通知的有效内容中的可变内容值,这是您需要从服务器通过扩展名访问的唯一必需值。

我想,这涵盖了所有我

+2

我们需要在UNNotificationServiceExtension的成员中心创建单独的捆绑ID和配置文件? –

+0

APNs是应用程序扩展所必需的,否则它不会被编译。 –

0

UNNotificationServiceExtensionpublic func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)方法已经迅速更改版本之间。

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

确保方法你覆盖在UNNotificationServiceExtension

定制子类我:

func didReceive(request: UNNotificationRequest, withContentHandler contentHandler:(UNNotificationContent) -> Void)

,没有工作,直到我改为:

func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)

+0

感谢您的评论。我只是检查,但我有正确的方法,我使用Objective-C,我有完全相同的方法它在接口(UNNotificationServiceExtension) –

+1

明白了。您是否在推送有效载荷(服务器端)中发送“类别”? –

+0

可能不是,我们拥有APNS服务器的基本功能,并且我们只添加了苹果建议的内容(可变内容和我们想在客户端上读取的任何额外信息)。 –

1

这似乎是你的plist混合2 plists。 有2个扩展名中起作用:

  1. 通知内容分机 - 负责经由视图控制器显示所述内容
  2. 通知服务扩展 - 负责在后台获取内容被显示通知之前

这里是Notification Content Extension目标的plist:

enter image description here

这里是Notification Service Extension目标的plist:

r

+0

,但在我的情况下,我不使用自定义UI,我只是使用扩展来修改内容(实际上不是即使通过我的代码,所以让我们说我只是发送内容)。现在我看到NSExtensionAttributes是内容扩展的需求,但看起来这不是我的情况。这是我遵循的第一个文档,当帖子开始时,我的实现无法正常工作:https://developer.apple.com/reference/usernotifications/unnotificationserviceextension –

+0

链接已损坏。你在aps有效载荷中发送'mutable-content:1'吗? –

+0

是的,事实上,我在设备日志中看到的错误,如果操作系统已经找到我的扩展但没有运行代码。所以当时已经验证了可变内容(没有这甚至不检查notif扩展名) –

19

什么也可以做的伎俩是检查你的部署目标为扩展名的问题。矿设置为10.2,而我是在测试设备中使用10.1

改变部署目标10.0UNNotificationServiceExtension实例被称为完美

+1

太好了。我犯了同样的错误。非常感谢。 – Vijay

+0

我的天啊!这是非常好的和简单的解决方案。我甚至没有想过要检查这个。 –

+0

适合我,谢谢 – Joey

4

之后(仍然)如果你事事正确,不要”不要忘记将它附加到过程中。

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

  1. 设置你的扩展
  2. 选择调试断点/附上由PID或名称
  3. 到过程中输入扩张对象的名称
  4. 触发推送通知
+0

+1这个答案非常有帮助,因为我忘记了这是一个单独的过程,并期望如果我只是运行应用程序过程中断点工作。 – markquezada

+0

NotificationService类没有出现! –

0

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

Configuration

0

大量尝试没有成功已经给可能的修正后,我明白了一个框架,已被错误地添加到我们的扩张对象,而不是单元测试目标。

删除框架和定位10.2允许我的扩展再次被调用。

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

0

这里走来的第二次。第一次,this answer帮助我,第二次,它没有。经过很多(内部)宣誓之后,我发现我不小心从我的主要应用程序目标中的嵌入式二进制文件中意外删除了扩展名。当我添加扩展名时,我的扩展名将被再次调用。

所以检查:

  1. 点击您的应用项目到左边。
  2. 点击你的主应用程序目标。
  3. 选择一般。
  4. 在嵌入式二进制文件下,​​确保您的扩展名已列出,如果没有,请添加它。
0

我的问题是两倍。首先可能是我已将Info.plist属性NSExtensionPrincipalClass设置为bundle.identifier.NotificationService而不是ProductModuleName.NotificationService。模块名称是默认的,但是在调试与不同方案和不同目标相关的其他事情时,我错误地改变了标识符。

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

我发现上述的方法是用最少的代码创建一个新的测试项目。现在回想起来我绝对推荐这种方法,而不是尝试所有的计算器等发现了不同的解决方案