web-dev-qa-db-ja.com

iOS10 UNNotificationServiceExtensionは呼び出されません

リッチ通知を使用するために、新しいiOS10拡張機能を実装しています。プッシュ通知でテストしようとしていますが、機能していません。単純な通知を受け取り、拡張機能を使用していません。

公式サイトや他の場所で指定されているすべてのことを行いました。

  • プッシュ通知と適切なプロビジョニングプロファイルを使用してアプリを実行しています
  • アプリに新しいターゲット、通知サービス拡張機能を追加しました
  • 私自身のコードを実装しました(新しいクラスに入らないため、実際には問題ではありません)
  • また、この拡張機能のプロビジョニングプロファイルを設定する必要がありました。ワイルドカードを使用するだけです。拡張ターゲットでプッシュ通知機能を有効にする必要があるかどうかを指定するドキュメントは表示されません。 1つは、現時点では、ワイルドカードの証明を使用するだけです。とにかく、アプリターゲットで使用するプロファイルと一致する(一致する必要があります)ため、プッシュ通知機能はアプリターゲットでのみ有効になります。
  • UNNotificationExtensionCategoryとNSExtensionPointIdentifierを追加しました。また、サーバーからプッシュペイロードの一部としてカテゴリを送信しています。

私が言ったように、私は通知を受け取りますが、拡張を通過しません。 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>

何が間違っているのですか?

前もって感謝します

17
Rodrigo.C

最後に、これが正しく機能するようになりました。これがこの問題から覚えていることです。

1)iOS10ベータ版でデバイスを使用しないでください。ベータ版を使用していたために問題が発生したためです。

2)アプリのみがAPNS資格を必要とします。これは、拡張機能に使用される特権には必要ありません。

3)拡張のID(ワイルドカードではない)に一致するプロビジョニングプロファイルを使用していましたが、とにかく、それが正常に機能するかどうかはワイルドカードで確認できません。

4)NSExtensionAttributesは必要ありません、拡張子.plistにNSExtensionPointIdentifierとNSExtensionPrincipalClassを使用します。独自のレイアウトを使用していない場合

5)これは、iOS 9トークン登録方法を使用しても機能します。

6)プッシュ通知に含まれるペイロードのmutable-content値を忘れないでください。これは、拡張機能を通過するためにサーバーから必要な唯一の必須値です。

これは私が抱えていたすべての問題をカバーしていると思います

7
Rodrigo.C

また、トリックを行う可能性があるのは、拡張機能の展開ターゲットを確認することです。私がテストしていたデバイスが(まだ)10.1を使用していた間に、鉱山は10.2に設定されました

展開ターゲットを10.0に変更した後、UNNotificationServiceExtensionインスタンスが完全に呼び出されました

44
basvk

そして、すべてを正しく行ったら、プロセスに添付することを忘れないでください。

拡張機能を含むアプリを実行した後:

  1. 拡張機能にブレークポイントを設定します
  2. PIDまたは名前で[デバッグ/プロセスにアタッチ]を選択します
  3. 拡張ターゲットの名前を入力します
  4. プッシュ通知をトリガーする
10

二度目にここに来ました。初めて この答え が助けになり、二度目は助けになりませんでした。多くの(内部)宣誓の後、メインアプリターゲットの埋め込みバイナリから拡張機能を何らかの形で誤って削除したことがわかりました。拡張機能を再度追加すると、拡張機能が再度呼び出されます。

これを確認してください:

  1. 左側のアプリプロジェクトをクリックします。
  2. メインアプリターゲットをクリックします。
  3. 一般を選択します。
  4. [埋め込みバイナリ]の下で、拡張機能がリストされていることを確認し、ない場合は追加します。
3
Jonny

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

2
AnitaAgrawal

あなたのplistは2つのリストを混合しているようです。 2つの拡張機能があります:

  1. 通知コンテンツ拡張機能-ビューコントローラーを介してコンテンツを表示する役割
  2. 通知サービス拡張-通知が表示される前にバックグラウンドでコンテンツを取得します

Notification Content Extensionターゲットのplistは次のとおりです。

enter image description here

Notification Service Extensionターゲットのplistは次のとおりです。

r

2
Or Arbel

すでに成功せずに与えられた可能性のある修正の多くを試した後、フレームワークがユニットテストターゲットではなく拡張ターゲットに誤って追加されたことがわかりました。

フレームワークを削除して10.2をターゲットにすると、拡張機能をもう一度呼び出すことができました。

何らかの理由でどのフレームワークに興味がある場合は、ここで見つけることができます: https://github.com/plu/JPSimulatorHacks

1
Jon Whitmore

私の問題は2つありました。最初の理由は、おそらくInfo.plistプロパティNSExtensionPrincipalClassからbundle.identifier.NotificationService の代わりに ProductModuleName.NotificationService。モジュール名はデフォルトですが、異なるスキームと異なるターゲットに関連する他のいくつかをデバッグするときに、誤って識別子に変更していました。

2番目の問題は、通知サービスターゲットを実行してテストしたことです。私にとっては、アプリのターゲットを実行するときの方がずっとうまく機能しました。デバッグを有効にするために通知サービスターゲットを使用することを推奨する他の人々を見ました。ただし、アプリターゲットを実行する場合も同様です。ただし、デバッガを通知サービスに手動でアタッチする必要があります。

上記を発見した方法は、最小限のコードで新しいテストプロジェクトを作成することでした。後知恵では、stackoverflowなどで見つかったすべての異なるソリューションを試す代わりに、そのアプローチを絶対にお勧めします

1
Simon Bengtsson

Swift 5の簡単な方法

 this is very easy way just do it like this

enter image description here

1
Shakeel Ahmed

同じ問題を抱えていたので、Embedded Binariesから拡張機能を削除して再度追加することで解決しました。

0
shanizoe

「なし」構成が設定されていることを確認してください。スクリーンショットを見てください。他のパラメーターではdidReceiveは機能しません。

設定

0

UNNotificationServiceExtensionpublic 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)

0
Or Arbel