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
"content-available": 1
で送信し、アプリがフォアグラウンドにある場合、コールバックは発生しません。