Apple Docs と読むと、ローカル、リモート、サイレントの3種類の通知に言及しています。
ローカル通知は、アプリによってローカルに送信される名前から推測できます。
しかし、他の2つのタイプの違いは何ですか?
編集:この回答は完全に適用可能ですが、iOS 12の通知にはadditions(変更ではない)があります。 WWDC 2018:ユーザー通知の新機能 および here を参照してください。
主な変更点は次のとおりです。
正しく機能するために設定する必要がある設定が多すぎます。それらを分析し、理解しやすくします。
全体として、いくつかのことが重要です。
content-available
とはWWDC 2015:新機能のお知らせ の最初の7分間を視聴することを強くお勧めします。発表者はそこから、2つの主要な通知タイプがあることに言及しています。
それらはバックグラウンドで発生するため、アラート/バッジ/サウンドは表示されません。ダウンロードされるものwithoutあなたはそれらについて知っています。
iOS 11のバグ
here を参照してください。 iOS 11の初期リリースでは、サイレント通知のバグがありました。テスト用の最新バージョンがあることを確認してください
名前が示すように、userと関係があります。つまり、ユーザーには警告/バッジが表示されるか、音が聞こえます。 2種類あります。
ローカル通知
ローカル通知は、3つの異なる方法でtriggeredにできます。
UNLocationNotificationTrigger
:Walmartストアの近くにいるときにアラートが表示されます。
UNTimeIntervalNotificationTrigger
:例10分ごとにアラートが表示されます。
UNCalendarNotificationTrigger
は2017年12月1日午後1時です。
リモート通知
LocalNotificationsに似ていますが、サーバーからトリガーされます。 Fromフィールド(Mom)とbodyフィールド(I love you!)を持つWhatsAppメッセージ。
ランダムなメモ:
サイレントまたはリモート通知を受信するには、次を使用してトークンに登録する必要があります。
application.registerForRemoteNotifications()
????登録にはユーザーの許可は必要ありません。これにより、サイレント通知がシームレスになります。 WWDCビデオのこの瞬間をご覧ください
サイレント通知はデフォルトで有効になっています。ユーザーはあなたを承認する必要はありません-あなたのアプリにそれらを使用する許可を与えることはありません。許可をユーザーに求めることなくそれらを使用し始めることができます。
WWDC から
show badges/alerts/soundsを可能にするには、ユーザーにpermissionを要求する必要があります。
UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in
guard error == nil else {
//Display Error.. Handle Error.. etc..
return
}
if granted {
//Do stuff here..
//Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
application.registerForRemoteNotifications()
}
else {
//Handle user denying permissions..
}
}
質問:ローカル通知用に1回、リモート通知用に1回アクセスを要求する必要がありますか?
いいえ。上記のスニペットを書くだけで、bothリモートおよびローカルへのアクセスが要求されます。
さて、トリッキーな部分に行きましょう:D
サイレント通知を受信するには何かを有効にする必要がありますか?
これを有効にしないと、アプリはトークンを受け取りません。そして、トークンがなければ、サーバーはあなたを認識しません。
backgroundModes を有効にするには、plistまたはXcodeを使用してeitherを実行します。機能。
どちらの方法でもできるのは、plistがコードに近く、古い方法であるためです。おそらく、レガシーサポートのために存在している可能性があります。 Xcode機能は、より新しく簡単な方法です。
plist:
アイテム0は単なるindexであり、辞書のキーではありません(通常plistに表示されるもの)。UIBackgroundModesはStringsのarray
です。文字列は、 UIBackgroundModes Array のaccepted valueからのみ取得する必要があります。
Xcode機能:
バックグラウンドモードのXcodeのRemote Notification
を以下のように確認します。
上記のいずれも行わない場合は、次の方法で通知をオフに切り替えます。
リモートおよびローカル通知を強制終了します
ただし、do plistまたはXcode機能からアプリのバックグラウンド更新を有効にし、アプリの通知をオフにしても、サイレント通知!
ユーザーがサイレント通知を無効にする場合は、両方の通知を無効にし、アプリ/システム全体で「バックグラウンドアプリの更新」を無効にする必要があります。システム全体で「バックグラウンドアプリの更新」を無効にするには、これを行う必要があります。
なぜ私はこれをすべて言っているのですか?サイレント通知とプッシュ通知のsettingsはユーザーごとに異なり、送信の制限が異なることを説明します。 詳細については、WWDCビデオの this moment をご覧ください。。 こちらをご覧ください (前のリンクは無効です):
サイレント通知はデフォルトで有効になっています。
ユーザーは、アプリを使用する許可を与えないことを承認する必要はありません。ユーザーに許可を求めることなく、使用を開始できます。
ただし、サイレント通知はアプリのバックグラウンド更新の背後にあるメカニズムです。
ユーザーはいつでも設定にアクセスして無効にできることがわかっています。
したがって、常に利用可能であることに依存することはできません。
ユーザーがそれらをオフにするかどうかはわかりませんが、通知はもうありません。
これは、サイレント通知が最善の努力で配信されることも意味します。
つまり、通知がユーザーのデバイスに届くと、システムはいくつかの選択を行います。
デバイスやユーザーの行動(電源や時刻など)からのさまざまな信号を使用して、通知を配信してアプリを起動するのに適したタイミングを判断します。
バッテリーを節約しようとする場合や、ユーザーの行動に合わせて、ユーザーが使用する可能性が高い場合にコンテンツを利用できるようにする場合があります。
here も参照してください。
CAVEAT:アプリのバックグラウンド更新を無効にし、許可通知を無効にしても、アプリがFOREGROUNDの場合はサイレント通知を受信できます。アプリがバックグラウンドにある場合、それらは配信されません。
リモート通知を受信するには何かを有効にする必要がありますか?
Xcode機能からPush Notificationsを有効にするだけです。
これを有効にしないと、アプリはトークンを受け取りません。そして、トークンがなければ、サーバーはあなたを認識しません。
好奇心が強い...私のペイロードがどのように見えるべきか教えてもらえますか?
アップルに会うことを強くお勧めします§ ドキュメント 。それは非常に明確です。
ありがとう、しかし重要な部分を教えていただけますか?
うーん... OK、しかしちょうどあなたがこれが私がちょうど言ったリンクからであることを知っているように:
サイレント通知には、2つの基準があります。
aps
辞書には、content-available
の値を持つ1
キーが含まれている必要があります。aps
dictionaryには、alert
、sound
、またはbadge
キーを含めることはできません。サンプルペイロードは次のようになります。
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
acme1、acme2、またはいくつかのカスタムデータ!ただし、aps
キーについては、Appleの構造に従う必要があります。そうしないと、mapが正しくなくなり、データを正しく読み取ることができなくなります。
リモート通知の場合:
alert
内にaps
キーが必要です。
例として:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
番目のオプションもあります。これについては、回答のさらに下で説明します。
固定のaps
およびalert
辞書キーが何であるかについては、これらの Apple docs を参照してください。
- はい、わかった。 content-available
とは?
とても簡単です。これは、ダウンロード可能なコンテンツがあるため、アプリを起動して何かをダウンロードする必要があることを伝えるフラグです。詳細については、この exact moment を参照してください。
デフォルトでは、content-available
フラグは含まれていません。つまり、デフォルトでは、送信する通知はwo n'tapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)
をトリガーするか、アプリで何かを行います。 。通知が表示されるだけです。 (バックグラウンドで何かを行うために)アプリを起動する場合は、content-available
を含めて1
に設定する必要があります。
§:Firebaseを使用している場合、ペイロード構造とキーはわずかに異なる場合があります。たとえば、キー
content-available
はcontent_available
に置き換えられます。詳細については、 Firebase documentation および here も参照してください。
サイレント通知を使用しているときのみアプリにダウンロードできるのは何かと言いましたが、バックグラウンドでアプリを起動し、リモート通知のために何かをダウンロードする方法はありますか?
はい。ただし、サイレント通知と同様に、content-available
フラグを1に設定する必要があります。これにより、目覚めて何かをダウンロードすることがわかります。それ以外の場合は、ポップおよびアラート/バッジ/サウンドが表示されますが、何もダウンロードされません。
重要事項:
content-available
を1
に設定します。content-available
には何の関係もありません。content-available
を1
に設定する必要があります。(3番目のオプション)
{
"aps" : {
"content-available" : 1
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
この瞬間 WWDCビデオから????
リモート通知について混乱しています。通知を受け取るたびに、アプリがバックグラウンドでアクティブになり、何かをダウンロードすると思いました。説明してもらえますか?
例えばこの時点で:
お使いのiPhoneは、「送信者なし」の本文を含むリモート通知を受信しました。これを受信するには、WhatsApp does n'tをバックグラウンドで実行する必要があります。つまり、BackgroundModesから「リモート通知」を有効にする必要はありません。 プロセスはWhatsAppアプリではなくOSによって管理されているであるため、アプリが強制終了または中断された場合でも、引き続き通知を受け取ります。ただし、実際のメッセージまたはその画像/ビデオをWhatsAppにダウンロードできるようにしたい場合(ユーザーがWhatsAppを開くと、ビデオがそこに座ってユーザーを待っています)、アプリをアクティブにする必要があります。これを行うには、content-available : 1
とapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)
を実装する必要があります。
同様に、アプリの携帯データを無効にした場合でも、引き続き通知を受け取ります。ただし、その通知をタップすると、ユーザーwo n'tは、そのアプリに対してnetwork requestsを作成できるようになります。彼らはアプリをopenにしかできません。
または、別の同様のシナリオでは、接続しているサーバー/アクセスポイントがWhatsAppなどのアクセスを制限している場合、APN通知を受信できます。ただし、その通知をタップすると、ユーザーwo n'tは、そのアプリに対してnetwork requestsを作成できるようになります。彼らはアプリをopenにしかできません。
CAVEAT:ユーザーがアプリを強制終了した場合、上記の理由で通知を受け取っている間は、アプリを自動的に終了状態から戻すことはできません。 (content-available
を1
に設定した場合でも)。デリゲートメソッドはどれもヒットしません。userはアプリを開く必要があり、そうしないとデリゲートメソッドに到達できません。
信頼性とAPNアーキテクチャに関する注意:通知は、実際のコンテンツをアプリに配信するために頻繁に使用されますが、deliver向けではありません。 /アプリへのコンテンツ。むしろ、彼らはnotifyに設計されています。「何か新しいものが到着しました(2bメッセージまたは50kbの小さな画像、または10mb画像または2GBのビデオ)必要に応じてアプリを開きます。ちなみに、ここにその一部(実際のメッセージ自体if適合可能、通知に表示される画像またはサムネイル、タイトル詳細については、 iOS APNS「ベストエフォート」フォールバック を参照してください。自分自身を繰り返すために、メールで送信された40MBの添付ファイルをダウンロードすることはありませんその存在が通知されるだけで、ユーザーに最新情報を通知し、さらにアプリを開く必要があるかどうかを判断できるように、十分な数(添付ファイルのサムネイルビュー)を送信します。 iOSでは、実際にプッシュ通知を介して画像/ビデオを送信すると思いました。
プッシュ通知は、ユーザーに通知を受け取ったことを通知します(たとえば、通知ポップアップを表示します)。サイレント通知は更新されますが、ユーザーには通知されません。いずれにしても、プッシュ通知であるかのように、サイレントで通知されたときにアクションを実行できます。唯一の違いは、ユーザーがポップアップ通知で通知されないことです。
違いはペイロードにあります。
プッシュ通知:
aps {
content-available: 1
alert: {...}
}
サイレント通知:
aps {
content-available: 0
alert: {...}
}
また、選択したバックグラウンドモードをCapabilitiesに設定する必要があります。
サイレントプッシュ通知はデバイスに到達し、ユーザーは通知について何も知らないが、彼のアプリは通知を受け取り、アプリはアプリの状態に関係なく新しいコンテンツをダウンロードしてユーザーに提示する時間を与えられます(つまり、実行中かどうかランニング)
リモートプッシュ通知メソッドは、アプリの実行中にのみ呼び出されます。アプリが一時停止または実行されていない場合、システムはアプリを起動または起動し、メソッドを呼び出す前にバックグラウンド実行状態にします。このメソッドは、更新されたコンテンツをユーザーに表示することを目的としています。このメソッドが呼び出されると、アプリはダウンロード操作を実行し、指定された完了ハンドラーブロックを呼び出すために最大30秒の実時間を持ちます。ハンドラーが時間内に呼び出されない場合、アプリは中断されます。
技術的な詳細については、次のリンクをご覧ください。