174

application:didReceiveRemoteNotification:fetchCompletionHandleriOS 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
4

14 に答える 14

2

回避策として、「通知」キーを追加し、値として空の文字列を持つ「タイトル」内に追加しています。これは、appDelegate の didReceive コールバックを起動します。

于 2017-11-08T08:19:28.453 に答える
1

この回答を書いている時点で、Bill Dunay の回答とまったく同じ問題に直面しています。

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

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

「コンテンツ利用可能」を意図的に使用していないことに注意してください。通知の配信を遅らせたりキャンセルしたりする際に、iOS の最適化ロジックが開始されるようにする設定。

于 2018-08-29T17:17:24.350 に答える