リッチ通知を使用するために、新しいiOS10拡張機能を実装しています。プッシュ通知でテストしようとしていますが、機能していません。単純な通知を受け取り、拡張機能を使用していません。
公式サイトや他の場所で指定されているすべてのことを行いました。
私が言ったように、私は通知を受け取りますが、拡張を通過しません。 OSが拡張機能をロードしようとしたが、関連する説明のないエラーをスローして問題を特定する方法を確認します。
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>
何が間違っているのですか?
前もって感謝します
最後に、これが正しく機能するようになりました。これがこの問題から覚えていることです。
1)iOS10ベータ版でデバイスを使用しないでください。ベータ版を使用していたために問題が発生したためです。
2)アプリのみがAPNS資格を必要とします。これは、拡張機能に使用される特権には必要ありません。
3)拡張のID(ワイルドカードではない)に一致するプロビジョニングプロファイルを使用していましたが、とにかく、それが正常に機能するかどうかはワイルドカードで確認できません。
4)NSExtensionAttributesは必要ありません、拡張子.plistにNSExtensionPointIdentifierとNSExtensionPrincipalClassを使用します。独自のレイアウトを使用していない場合
5)これは、iOS 9トークン登録方法を使用しても機能します。
6)プッシュ通知に含まれるペイロードのmutable-content値を忘れないでください。これは、拡張機能を通過するためにサーバーから必要な唯一の必須値です。
これは私が抱えていたすべての問題をカバーしていると思います
また、トリックを行う可能性があるのは、拡張機能の展開ターゲットを確認することです。私がテストしていたデバイスが(まだ)10.1を使用していた間に、鉱山は10.2
に設定されました
展開ターゲットを10.0
に変更した後、UNNotificationServiceExtension
インスタンスが完全に呼び出されました
そして、すべてを正しく行ったら、プロセスに添付することを忘れないでください。
拡張機能を含むアプリを実行した後:
二度目にここに来ました。初めて この答え が助けになり、二度目は助けになりませんでした。多くの(内部)宣誓の後、メインアプリターゲットの埋め込みバイナリから拡張機能を何らかの形で誤って削除したことがわかりました。拡張機能を再度追加すると、拡張機能が再度呼び出されます。
これを確認してください:
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 。
すでに成功せずに与えられた可能性のある修正の多くを試した後、フレームワークがユニットテストターゲットではなく拡張ターゲットに誤って追加されたことがわかりました。
フレームワークを削除して10.2をターゲットにすると、拡張機能をもう一度呼び出すことができました。
何らかの理由でどのフレームワークに興味がある場合は、ここで見つけることができます: https://github.com/plu/JPSimulatorHacks
私の問題は2つありました。最初の理由は、おそらくInfo.plist
プロパティNSExtensionPrincipalClassからbundle.identifier.NotificationService
の代わりに ProductModuleName.NotificationService
。モジュール名はデフォルトですが、異なるスキームと異なるターゲットに関連する他のいくつかをデバッグするときに、誤って識別子に変更していました。
2番目の問題は、通知サービスターゲットを実行してテストしたことです。私にとっては、アプリのターゲットを実行するときの方がずっとうまく機能しました。デバッグを有効にするために通知サービスターゲットを使用することを推奨する他の人々を見ました。ただし、アプリターゲットを実行する場合も同様です。ただし、デバッガを通知サービスに手動でアタッチする必要があります。
上記を発見した方法は、最小限のコードで新しいテストプロジェクトを作成することでした。後知恵では、stackoverflowなどで見つかったすべての異なるソリューションを試す代わりに、そのアプローチを絶対にお勧めします
同じ問題を抱えていたので、Embedded Binariesから拡張機能を削除して再度追加することで解決しました。
「なし」構成が設定されていることを確認してください。スクリーンショットを見てください。他のパラメーターではdidReceive
は機能しません。
UNNotificationServiceExtension
のpublic func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)
メソッドは、Swiftバージョン間で変更されました。
一部のオンライン例は最新ではありません。
UNNotificationServiceExtension
のカスタムサブクラスでオーバーライドするメソッドを確認してください
私が持っていた:
func didReceive(request: UNNotificationRequest, withContentHandler contentHandler:(UNNotificationContent) -> Void)
に変更するまで機能しませんでした:
func didReceiveNotificationRequest(request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)