Android、iOS、UWPのNotificationHubにプッシュ通知を送信するAzure Functionを正常に実装しました。テスト中に、Android=端末がDozeモードの場合、プッシュ通知がロック画面に配信されず、スマートフォンのロックを解除したときにのみ配信されることがわかりました。
私は this stackoverflow post を見つけました。これは、メソッドSendFcmNativeNotificationAsyncで修正するのに役立ちました。私はこのコードを使用しました:
string payload = @"{
""data"":{
""notificationtype"":""sap"",
""title"":""value2"",
},
""priority"":""high""
}";
await hub.SendFcmNativeNotificationAsync(payload);
ただし、SendNotificationAsyncメソッドを使用した私の実装は、3つのプラットフォームすべてで機能しますが、Dozeモードでは機能しません。これは通知を送信するための私のコードです:
Dictionary<string, string> templateParameters = new Dictionary<string, string>();
templateParameters["alert"] = "Test";
templateParameters["title"] = "Whosap";
var notification = new TemplateNotification(templateParameters);
await hub.SendNotificationAsync(notification);
通知のヘッダーを設定しようとしました:
var headers = new Dictionary<string, string> { { "Android", @"{""priority"": ""high""}" } };
notification.Headers = headers;
しかし、これはうまくいきませんでした。 TemplateNotificationオブジェクトに優先度を設定し、それをSendNotificationAsyncメソッドで送信する方法を誰かが知っていますか?
これは私がデバイスを居眠りモードに強制/強制解除する方法です:
adb Shell dumpsys deviceidle force-idle
adb Shell dumpsys deviceidle unforce
「有益なプッシュ通知のみ」を使用したいというコメントに基づいて、残念ながら、毎回電話に通知を表示させることはできません。これは、Xamarinの制限としても、Azure Functionsの制限にもなりません。 Google独自のアプリケーションの一部でも同じように動作します。
ユーザーがすぐに通知を見る必要がある場合は、 FCM優先度の高いメッセージを使用してください
FCMを使用してデバイスがアイドル状態のときにアプリとやり取りする場合/ :
FCMは、 高優先FCMメッセージ を使用して、Dozeおよびアプリスタンバイアイドルモードで動作するように最適化されています。 FCMの高優先度メッセージを使用すると、ユーザーのデバイスがDozeモードになっている場合やアプリがアプリスタンバイモードの場合でも、アプリを確実に起動してネットワークにアクセスできます。 Dozeモードまたはアプリスタンバイモードでは、システムはメッセージを配信し、アプリにネットワークサービスと部分的なウェイクロックへの一時的なアクセスを許可してから、デバイスまたはアプリをアイドル状態に戻します。
これまでのところ、高優先度メッセージを使用する場合、すべてが正常に機能するはずです。ただし、それだけではありません。優先度を高い"priority":"high"
に設定するのは正解です。残念ながら、この設定にはいくつかの注意点があります( from docs ):
優先度の高いメッセージは通常、ユーザーによるアプリまたはその通知の操作につながります。 FCMが検出しないパターンを検出した場合、メッセージの優先順位が優先順位が下げられている可能性があります。
つまり、情報提供の通知のみを送信する場合は、デバイスをDozeモードから復帰させて通知を表示するだけでは不十分です。 Android Pからチェック/制限がさらに厳しくなりました。アプリのスタンバイバケットについては、 こちら をご覧ください)。
良い点は、Dozeモードを終了することが、さまざまなイベント/相互作用の形で行われることです。
ユーザーがデバイスを動かしたり、画面をオンにしたり、充電器を接続したりすると、システムはすぐにDozeを終了し、すべてのアプリが通常のアクティビティに戻ります。
少なくとも私が試した電話では、通常の毎日のシナリオでは、通知はあなたの夜の睡眠中、またはデバイスがそこに座って相互作用/動きがないときに停止されています。
ただし、本当にevery通知を配信する必要があり、UXにcrucialである場合は、 2つのオプションがあります。
Settings -> Apps & notifications --> Advanced --> Special app access --> Battery optimisation
に移動します。次に、アプリを選択し、手動でDo n't optimiseに設定します。これはベストプラクティスとは見なされず、次の点に注意してください。a)ユーザーはこのアクションの結果を知らないでください。b)意図したとおりに機能するためには、OSにすべてを任せることをお勧めします。つまり、通知の優先度をhighに設定する必要はありません。これは、OSが通知を通知するだけであり、通知を受け取るためです。スマートフォンが「ディープスリープ」Dozeモードに入ると、通知を表示するためにスリープ状態を解除してはならず、解除してはならないので、試しても意味がないことに注意してください。これは仕様によるものです。そうしないと、他のすべての開発者が通知の優先度を高く設定でき、電話機がDozeモードに移行しない可能性があり、そのため機能が役に立たなくなります。