iOS 11のアプリにサイレントプッシュが配信されない


168

iOS 11ベータ2ではapplication:didReceiveRemoteNotification:fetchCompletionHandler、アプリの状態(バックグラウンド/フォアグラウンド)に関係なく、サイレント通知が配信されないことに気付きました。

私はUIApplicationDelegeteメソッドを実装しapplication:didReceiveRemoteNotification:fetchCompletionHandler、次のサイレントプッシュを送信します

{  
  "aps": {  
    "content-available": 1  
  },  
  "mydata": {  
    "foo": "bar"  
  }  
} 

ただし、デリゲートメソッドはiOS 11では呼び出されません。

他のバージョンのiOSでは正常に機能し、ドキュメントのセクション「サイレント通知の構成」では、他に何をすべきかについては触れられていません。

これはiOS 11のバグですか、それともiOS 11の新しい機能がありませんか?

UserNotificationサイレントプッシュの送信に必要ないはずのフレームワークについては話していません。

これは問題を説明するサンプルプロジェクトです(独自のバンドルIDを設定する必要があります)

サンプルプロジェクトを昼食して上記のペイロードをアプリに送信すると、macOSコンソールを使用して、プッシュがデバイスに正しく配信されているがアプリには配信されていないことを確認できます。

アップデート10.08

動作はランダムなようです。デバイスを再起動した後、ペイロードが正しく配信されることがありますが、しばらくすると動作しなくなります。

次のスクリーンショットでわかるように、1とマークされたプッシュはデバイスにのみ配信され、プッシュ2(デバイスの再起動後)もアプリに配信されます。

ここに画像の説明を入力してください

アップデート14.08-iOS 11 Beta 6

まだ同じ行動。正常に機能するはずであるが、機能しない別のものは次のとおりです。アプリケーションのスキームが「実行可能ファイルの起動を待機する」に設定されている場合、サイレントプッシュはアプリを起動し、バックグラウンドで起動することになっています。

ここに画像の説明を入力してください

アップデート21.08-iOS 11 Beta 7

バグレポートのアップルからのアップデートではなく、同じ動作です。

アップデート29.08-iOS 11 Beta 8

まだ同じ問題。現在使用している再現手順は次のとおりです。

  • Xcodeプロジェクトスキームで、[実行可能ファイルの起動を待つ]を選択します。
  • にブレークポイントを追加します didReceiveRemoteNotification: fetchCompletionHandler
  • デバイスでアプリを起動します
  • 上記のサイレントプッシュを送信する

予想:アプリが一時停止状態からバックグラウンドになり、didReceiveRemoteNotification: fetchCompletionHandler呼び出されます

実際:何も起こらない

アップデート06.09-iOS 11 Beta 10

私はまだ同じバグのある行動をしています。Appleからのチケットは、次の回答で更新されました。

Apple Developer Relations 2017年9月6日、10:42 PMエンジニアリングは、この問題に関して以下のフィードバックを提供しました。

サンプルアプリを実行して動作をテストすることができました。説明されているようにこれをテストしたとき、問題は見られませんでした。

アプリがバックグラウンドで実行されている場合、プッシュがアプリに到達することは保証されていません。ここのログは、アプリがアプリを起動するのに十分に使用されているとは考えていないことを示しています。

状況が良いときは時々プッシュを配信しているのを見ています。

これは正しく動作していると考えています。

アップデート11.09

Appleのバグレポートが閉じられ、重複した33278611ものとしてマークされたままになっています

アップデート13.09-iOS 11 GM

kam800のコメントのおかげで(以下を参照)、さらにテストを行い、それらの観察結果を思い付きました。

iOS 11にdasd DuetActivitySchedulerDaemonは、データプッシュを完全に破棄するか、データプッシュの配信を遅延させる新しいデーモンがあるようです。

納期延期

コンソールログ

default 13:11:47.177547 +0200   dasd    DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>!   lifecycle   com.apple.duetactivityscheduler
default 13:11:47.178186 +0200   dasd    DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private>   default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200   dasd    DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017   default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200   dasd    DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>)  scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200   dasd    DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private>  default com.apple.duetactivityscheduler

延期された配達の問題

  • データプッシュ配信が延期され、アプリが起動された場合、データプッシュは、配信日になると、数分先になる可能性がある場合にのみ配信されます。これは、データプッシュを使用して新しいアプリのコンテンツを次回のリリースに備えておく目的を完全に無効にします。ここでもう一度、Appleのドキュメントを引用します。

「サイレント通知は、アプリが実行されていないときでも、アプリを最新の状態に保つのに役立つため、ユーザーエクスペリエンスを向上させます。」

  • とき2つのデータプッシュが中断アプリに送信され、それらはiOSの11の代わりに、直接アプリを目覚めにより延期されています。配信時間に達すると、最後のデータプッシュのみが配信されます。以前のプッシュは失われ、デリゲートメソッドを介して配信されないため、データが失われます。

配達はキャンセルされました

コンソールログ

default 13:35:05.347078 +0200   dasd    DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
 ], FinalDecision: Must Not Proceed}    scoring com.apple.duetactivityscheduler

キャンセルされた配信の問題

この場合、データプッシュは完全に失われ、iOS 11では正しく配信されませんが、iOS 10では正しく配信されます。

アップデート19.09-iOS 11 GM

また、アプリケーションがフォアグラウンドにあり、通知がアプリに配信されない場合、コンソールに次のログが表示されることにも気付きました。

default 08:28:49.354824 +0200   apsd    apsd    <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO   courier-oversized   com.apple.apsd

fault   08:33:18.128209 +0200   dasd    Foundation  <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
    NSArray,
    NSData,
    NSString,
    NSNumber,
    NSDictionary,
    NSUUID,
    _DASActivity,
    NSSet,
    _DASFileProtection,
    NSDate,
    NWParameters,
    NWEndpoint
)}'.    general com.apple.foundation.xpc

1
Beta 8ではまだ修正されていません。コンソールを見ると、次のエラーが表示されます。<NSXPCConnection:0x123f43620> pid 58からの接続:受信メッセージのデコード中に例外がキャッチされ、受信メッセージがドロップされました。例外:引数0のデコード中の例外(呼び出しの#2):例外:キー 'NS.objects'の値は予期しないクラス 'NSNull'でした。許可されるクラスは「{(NWParameters、NWEndpoint、NSArray、NSData、NSString、NSNumber、NSDictionary、NSUUID、_DASActivity、NSSet、_DASFileProtection、NSDate)}」です。
Thomas Einwaller 2017

2
iOS 11(以前ではありません)でも同じ結果が得られます。プッシュwith "content-available": 1で送信し、アプリがフォアグラウンドにある場合、コールバックは発生しません。
GoRoS 2017

4
新しいiOS11.1ベータ1でテストした後、これは現在修正されており、iOS 10で以前と同様に機能しているようです
Lee

3
WhatsAppは、同様の問題があったと思われるwhatsappen.com/news/5465/...のほとんどの開発者である「習慣的に近い自分のアプリを強制」というユーザーについて何か...
toxaq

3
11.1の公開リリースとまったく同じです。サイレントプッシュを使用していて、アプリがフォアグラウンドにある場合は、デバイスが電源に接続されている場合でも、いくつかの事柄に応じて配信されるとは期待しないでください。
Gruntcakes

回答:


31

つまり、iOS 11.1ベータ1のリリースノートには、

iOS 11.1ベータ1がリリースされたばかりで、「解決された通知の問題•サイレントプッシュ通知がより頻繁に処理されるようになりました。(33278611)

私はいくつかのテストを行いましたが、実際には修正されているようです:

一時停止状態

アプリをサスペンドモードで起動してサイレントプッシュを送信すると、アプリがバックグラウンドに戻り、didReceiveRemoteNotification:fetchCompletionHandlerデリゲートが呼び出されます。

フォアグラウンド状態

同様に、アプリケーションがフォアグラウンドでサイレントプッシュが送信された場合、デリゲートは期待どおりに呼び出されているように見えます。これは以前のiOS 11バージョンではランダムに機能しなかったので、さらにテストを行って確認します。


3
私の最初のテストでは、それは修正されたと思いました。それはしばらくの間働きました。しかし、いくつかの厳しいテストの後、物事は一部になり始めました。アプリがフォアグラウンドにある場合でも、すべてのサイレントプッシュのデリゲートの呼び出しが突然停止しました。どうやら、この新しい「duet」システムは、「energyBudget」がないため、私のアプリのデリゲートが呼び出されないようにブロックしています。したがって、残念ながらまだ修正されていません。
Abras 2017

信じられないほど:(
トーマス・アインウォーラー

私の経験は上記のエイブラスと同じです。しばらく働いた後、バラバラになり、ハンドラーは呼び出されなくなりました-これは最悪です
Lee

さらにテストを行った結果、デバイスに通知を再度受信させる方法を見つけることができました。電源に接続します。デバイスを電源に接続するとすぐに、すべてのリモート通知の受信が再開されます。切断すると停止します。私のすべてのテストではアプリがフォアグラウンドにあったため、これは意味がありません。また、フォアグラウンドアプリは、リモート通知を受信することが保証されています。
Abras 2017

私にとっては、電源に接続されていない携帯電話接続であっても、すべてうまくいきます。デバイスを省電力モードに設定した場合のみ、フォアグラウンドでもプッシュを取得できません。しかし、それは私が理解することです
Jan

18

私もこの問題に見舞われたため、ここに2セントを追加したかっただけで、Appleが再現できなかったと言うこの問題に関するレーダーをいくつか閉じていることに気づきました。興味深いことに、デバッガーに接続されているアプリがバックグラウンドで実行されている場合、プッシュが配信されます。

デバッガーを終了し、電話を外してアプリを起動し、サイレントプッシュペイロードを送信すると、アプリが起動しないことがわかります。コンソールログで、システムがアプリへのペイロードの配信をキャンセルしたことがわかります。

問題を再現する小さなサンプルアプリを含むレーダーを提出しました。私はまた、私のチケットで作業している人が問題を再現するためにデバッガーに接続されたアプリを実行してはならないことをレーダーで明示的に指摘しました。これがリンクです:https : //bugreport.apple.com/web/?problemID=34461063

うまくいけば、これはこの問題でいくつかの進歩をもたらすでしょう。


2
レポートをありがとう。ところで、Appleのバグをリンクしてもここでは役に立たない。彼らは非公開であり、記者とAppleだけがそれらを見ることができる
Jan

他の人のレーダーを追跡できるように、もっと多くの人がopenradar.appspot.comを使用することを望んでいます
Thomas Einwaller '21 / 09/21

あなたのバグレポートの更新はありますか?apple @bill
MagicFlow

Appleからレーダーのアップデートを入手していませんが、iOS 11.1のベータ版をインストールしました。問題は修正されたようです。
Bill Dunay

はい、iOS 11.2.6でも同じ問題に直面しています。解決策やアップデートはありますか?
Gopik '17

14

iOS 11の新しい動作のようです。iOS11ベータ10は、この問題に関するいくつかの説明的なログを提供します。

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

すべてのサイレントプッシュがiOSに配信されるように見えますが、dasdデーモンはいくつかのポリシーを使用して、サイレントプッシュをアプリに配信するかどうかを決定します(バッテリーレベルなど)。昨日の夜、サイレントプッシュを1回受信できましたが、その時点でiPhoneは充電器に接続されていました。おそらく、BatteryLevelPolicyスコアがそのサイレントプッシュを1回受信するのに十分な高さでした。

AppleはこのiOS側の動作に関する公式情報を提供していません。サーバー側のスロットルに関する情報のみがあります。

サイレント通知は、アプリをバックグラウンドで起動状態に保つ方法として意図されたものではなく、優先度の高い更新のためのものでもありません。APNはサイレント通知を優先度の低いものとして扱い、総数が過剰になると配信を完全に抑制できます。実際の制限は動的であり、条件に応じて変化する可能性がありますが、1時間あたりの通知数が数を超えないようにしてください。

指を交差させたままにしておくと、アプリが修正されるため、動作が変更されました:)一方、この変更は優れています。iPhoneのバッテリーをAndroidフォンよりも長持ちさせる多くのものの1つです。


1
はい、プッシュはデバイスに配信されますが、アプリには配信されません。それは私が元の投稿で書いたものです。「サイレント通知は、アプリをバックグラウンドで起動させ続ける方法ではありません」これは、「時々」配信される限り問題ありません。大きな問題は、バックグラウンドでiOS 11のアプリにサイレント通知が配信されないことです。これは、データプッシュの目的全体を完全に無効にします。
Jan

はい、あなたはすでにそれを書いています、私はこれらの新しいプッシュポリシーについて完全な説明を提供したかっただけです。Appleのドキュメントを引用して、プッシュ配信の不確実性についてすでに警告していることを示した。私が書いたように、「昨日の夜、なんとかサイレントプッシュを1回受信することができました」(私が意図したアプリで)、アプリはバックグラウンドでした。しかし、当日–私のアプリはプッシュを受け取りません:(私の意見では、AppleはRCバージョンでこれらのプッシュポリシーを緩和します。その一方で、彼らは元のプッシュ動作を復元できます–彼らは既に提供されている機能のみを取り除くために使用していましたベータ版(例10.3キーチェーンの自動削除)
kam800

プッシュが受信され、アプリが一時停止されると、同様のログが表示されます。次に、dasd プロセスはログに記録しdefault 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017ます。サイレントプッシュは当時配信されたようです。
Jan

すでに、まだ奇妙な行動を見て、iOSの11 GMと同様のログテストを開始 com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
トーマス・エインウォーラー

1
また、いくつかのスタブ通知で非サイレントプッシュを送信し、Notification Service Extensionを使用して適切なコンテンツで通知を埋めることで、アプリを解決することができました。
kam800

9

iOS 11.1ベータリリースノートには次のものが含まれます。解決された通知の問題サイレントプッシュ通知はより頻繁に処理されます。(33278611)


7

iOS 11.1 Beta 2には、

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

リリースノート-今すぐテストします。

アップデート-11.10.2017-iOS 11.1 Beta 2

「実世界のシナリオ」で2日間アプリを使用した後、このバージョンのiOSで実際に改善が見られたようです。これが修正されたと私は慎重に考え始めています。


1
さまざまなシナリオをテストしました。フォアグラウンドとバックグラウンドの状態で動作していました。残念ながら、アプリがユーザーによって終了された場合は機能しません。ユーザーがアプリを再びアクティブに起動しない限り、デバイスの終了後、デバイスはサイレントプッシュを受信しません。同じことを経験しましたか?
AlexWoe89 2017年

今では動作します...約「ダウンタイム」後 5〜10分で、サイレント通知が期待どおりに動作します...申し訳ありません。コメント:)
AlexWoe89

1
ユーザーがアプリを終了したときにサイレントプッシュが機能しない-developer.apple.com/documentation/uikit/uiapplicationdelegate/…を参照してください。「ただし、ユーザーがアプリを強制終了した場合、システムはアプリを自動的に起動しません。
Thomas Einwaller

1
iOS11.1ベータ3はiOS10とほぼ同じように機能しており、iOS11.1ベータ2よりもはるかに優れています。
Lee

1
@Olecramoak for me iOS11.1ベータ4はiOS 10のように動作します
AlexWoe89

7

Apple Developer Relationsが私のレーダーにコメントを追加しました:

この問題は、最新のiOS 11.2ベータ版で解決されると考えています。

最新のiOSベータ版でテストしてください。それでも問題が解決しない場合は、バグレポートを更新して、調査に役立つ可能性のある関連ログまたは情報を提供してください。

https://developer.apple.com/download/

現在iOS 11.2ベータ版をインストールしています-サイレントプッシュ動作をテストします


では、これはiOS 11.1 GMが問題を修正しないことを意味しますか?:(
Olecramoak 2017年

iOS11.1の正式リリースはいつ期待できますか?
AlexWoe89 2017年

11.2のXcodeがないため、現在アプリをインストールできません。(そして私は自分のデバイスからアプリを削除しました)
Rool Paap 2017年

3

iOS 10まではプッシュ通知をapplication:didReceiveRemoteNotification:fetchCompletionHandler受け取り、正しく呼び出されていましたが、iOS 11に更新するとプッシュ通知が機能しなくなりました。

プッシュ通知ペイロードでcontent-available:1とmutable-content:1を使用していても、コードの問題はでしたが、バックグラウンドフェッチオプションがオンになりませんでした。しかし、iOS 10までは完全に機能していました。

これらの機能が両方ともオンになっていることを確認してください。

バックグラウンドフェッチ機能をオンにした後、機能します


いいえ、iOS11では機能しません-アプリを一度終了すると、アプリのウェイクアップが停止します。このトピックの回答とコメントを読んでください
AlexWoe89

2
終了したアプリの場合、プッシュ通知(シーレントまたは一般的なプッシュ)はアプリデリゲートのデリゲートメソッドを起動しません。これがデフォルトの動作です。iOS 11.0には特別なケースはありません。
Sudeep george

3

iOS 11.4.1、Swift 4

(CloudKitからの)サイレントプッシュが届かないという問題があり、誰もがここで述べていることをすべて試しました。次にalertBody、次のCKNotificationInfo()ようにオブジェクトに空白を設定してみることにしました。

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

これにより、プッシュがより高い優先度で送信されるようになりましたが(それらはまだサイレントプッシュでした)、プッシュが無視されているというエラーがデバイスログに表示されなくなりました。

誰かのお役に立てば幸いです。:)


CloudKitでも動作します。alertBodyがない場合、remoteNotificationsを取得するにはデバイスを接続する必要があります。非常に奇妙な動作...
powertoold 2018

2

これは確かにiOS 11のバグであり、iOS 11ベータ3で修正されています。 application:didReceiveRemoteNotification:fetchCompletionHandlerサイレントプッシュがフォアグラウンドでもバックグラウンドでも受信されると、正しく呼び出されるようになりました。

更新

いいえ、これは修正されておらず、iOSベータ3および4でも引き続き発生しています。


1
実はそうではありません:(それはまだ11ベータ3のiOSで起こっている

1
Appleもバグレポートを再開しました。お知らせします
Jan

1
iOS 11ベータ4でサイレントプッシュを受信して​​いません。さらに心配なのは、アプリがフォアグラウンドにない場合、通常の通知として表示されることがあります。間違いなく何かアップ!
Ben Dodson 2017

1
だから私はiOS 11ベータ5をインストールしたばかりですが、見栄えがよくなり、アプリがフォアグラウンドまたはバックグラウンドにあるときに、didReceiveRemoteNotificationデリゲートを介してしばらくの間サイレント通知が配信されます。同じ行動?
2017

1
これだけでなくテストしても頭が痛くなるので、それはすばらしいことです。サイレントプッシュは、デバイスの再起動後にランダムに機能するか機能しません。元の投稿をサンプルプロジェクトで更新して、全員が同じものを使用できるようにしました
Jan

2

回避策として、「通知」キーを追加し、値として空の文字列を含む「タイトル」内に追加します。これは、appDelegateのdidReceiveコールバックをウェイクアップします。


1
これは私にとっても、Appleがバグを修正するまで、DuetActivitySchedulerDaemonが通知でアプリを起動できるようにするための回避策と同様に機能するように思われました。
ジョーベントン

空のタイトルを含むJSONをプッシュしても、コンソールに「アラート、サウンド、バッジのない通知を無視しています...」というメッセージが表示されます{{aps ":{" alert ":{" title ":" "}、 "content-available": "1"}、 "gcm.message_id": "0 ... bb"}このJSON構造は役に立ちますか?
Olecramoak 2017年

引用符なしで1(利用可能なコンテンツの値)を送信しないでください。
elkorb

これが、Google FirebaseがJson(「1」)をフォーマットする方法であり、常に機能します。dasdナンセンスを備えたiOS 11だけが問題を引き起こしています。あなたのために働いているJsonの例を投稿していただけませんか?
Olecramoak 2017年

したがって、iOS 11.1で観察しているのは、デバイスがバッテリーで動作しており(充電ではない)、バッテリーレベルが20%未満の場合、低エネルギーモードがアクティブ化されていなくても、サイレントプッシュが配信されないことです。これは悪いです。iOS 11でのサイレントプッシュはまったく信頼できず、ほとんど役に立ちません。
Olecramoak

1

この回答を書いている時点で、私はビル・デュネイの回答とまったく同じ問題に直面しています。

私の要件は、アプリがフォアグラウンドにあるときにサイレント通知を受信し、アプリがバックグラウンドにあるか実行されていないときに何も受信しないことでした。そして私の回避策はこれでした。私はバッジを使用しないので、ゼロに設定しても問題ありません。

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

「content-available」を意図的に使用していないことに注意してください。iOS最適化ロジックに通知の配信の遅延/キャンセルを開始させる設定。


1

一部の通知で同じ問題が発生しています(必ずしも通知がない)。

すべての更新と回答を確認した後、役立つ2つの更新を追加できます。

  • UIApplication.shared.isRegisteredForRemoteNotifications通知の受信中にメソッドにアクセスすると、Xcodeに何も報告せずにアプリケーションが停止することがわかりました。メソッドにアクセスする通知を受け取った後、コードを実行しているかどうかを確認してください。(isRegisteredForRemoteNotificationsはUIをsemaphore_wait_trapでロックします)。

    • "title-loc-args" : [3333]文字通り3333を文字どおりに受け入れないため、コンソールでプッシュ通知の解析エラーが発生することを発見しました"title-loc-args" : ["3333"]。これにより、上記のメソッドにアクセスした後、インターフェイス全体が機能しなくなりました。iOS11でのみ、iOS 12で機能します。
  • また、まったく同じコードで、iOS 12.0(16A5366a)では問題なく動作することもわかりました。しかし、iOS 11ではそれが起こっています。


1

私の場合、サーバーサイトでジョブが完了した後にUIを更新するためにサイレント通知が使用されたため、アプリに関連性のないコンテンツを含めるのはお尻の痛みでした。サイレント通知のペイロードにはタイトルと本文も含まれているため、これらのメソッドを実装して、アクティブ/非アクティブアプリで動作中の通知を取得します。充電せず、バックグラウンドアプリの更新をオフにして、低電力状態にもします。

これを機能させるために、デリゲートを追加し、UNUserNotificationCenterDelegateプロトコルとwillPresent notification(iOS 10+)メソッドを使用して拡張機能を作成します。これは、正しいペイロードで毎回トリガーされます。アプリがアクティブなときに通知を表示しないようにするには、バッジまたはサウンドで完了を呼び出します。私はこのようなもので終わった

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

そして、アプリがバックグラウンドでサイレント通知が私のメソッドを呼び出さないときにこれらの状態を機能させるには、通知センターから直接通知を受け取りますapplicationDidBecomeActive

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

私の場合、iPhoneの設定で「バックグラウンドアプリの更新」がオフになっています。このため、プッシュ通知はデバイスに配信されましたが、アプリには配信されませんでした。バックグラウンドアプリの更新をオンにすると、アプリでサイレントプッシュを受信します。

これは、誰かが確認する必要がある場合に備えて、この質問の実際の答えではない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.