application:didReceiveRemoteNotification:fetchCompletionHandler
iOS 11 ベータ 2 で、アプリの状態 (バックグラウンド/フォアグラウンド) に関係なく、サイレント通知が に配信されないことに気付きました。
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 ベータ 6
それでも同じ動作です。動作するはずなのに動作しないもう 1 つのことは、次のとおりです。アプリケーションのスキームが「実行可能ファイルの起動を待機する」に設定されている場合、サイレント プッシュはアプリをウェイクアップし、バックグラウンドで起動することになっています。
アップデート 21.08 - iOS 11 ベータ 7
バグ レポートでの Apple からの更新ではなく、同じ動作のままです。
アップデート 29.08 - iOS 11 ベータ 8
それでも同じ問題です。私が現在使用している再現手順は次のとおりです。
- Xcode プロジェクト スキームで、[実行可能ファイルの起動を待つ] を選択します。
- にブレークポイントを追加します
didReceiveRemoteNotification: fetchCompletionHandler
- デバイスでアプリを起動する
- 上記のサイレントプッシュを送信
予想される: アプリが一時停止状態からバックグラウンドに移行し、didReceiveRemoteNotification: fetchCompletionHandler
が呼び出されます
実際: 何も起こらない
アップデート 06.09 - iOS 11 ベータ 10
私はまだ同じバグのある動作をしています。Apple からのチケットは、次の回答で更新されました。
Apple Developer Relations 2017 年 9 月 6 日 10:42 PM エンジニアリングは、この問題に関して次のフィードバックを提供しました。
サンプル アプリを実行して動作をテストすることができました。説明どおりにこれをテストしたところ、問題は見られませんでした。
アプリがバックグラウンドで実行されている場合、プッシュがアプリに到着する保証はありません。ここでのログは、アプリを起動するのに十分なほどアプリが使用されていないと思われることを示しています。
コンディションが良いときは時々プッシュを配信しています。
これは正しく動作していると考えています。
アップデート 11.09
Apple のバグ レポートが閉じられ、重複としてマークされ、33278611
開いたままになっている
アップデート 13.09 - iOS 11 GM
kam800 のコメント (以下を参照) のおかげで、私はさらにテストを行い、それらの観察結果を思いつきました:
iOS 11dasd 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 10 では正しく配信されていましたが、iOS 11 では配信されませんでした。
アップデート 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