web-dev-qa-db-ja.com

NotificationHubに送信されるプッシュ通知の優先度を高く設定する方法

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
5
Jan Nepraš

「有益なプッシュ通知のみ」を使用したいというコメントに基づいて、残念ながら、毎回電話に通知を表示させることはできません。これは、Xamarinの制限としても、Azure Functionsの制限にもなりません。 Google独自のアプリケーションの一部でも同じように動作します。

Dozeチェックリスト

ユーザーがすぐに通知を見る必要がある場合は、 FCM優先度の高いメッセージを使用してください

FCMを使用してデバイスがアイドル状態のときにアプリとやり取りする場合/

FCMは、 高優先FCMメッセージ を使用して、Dozeおよびアプリスタンバイアイドルモードで動作するように最適化されています。 FCMの高優先度メッセージを使用すると、ユーザーのデバイスがDozeモードになっている場合やアプリがアプリスタンバイモードの場合でも、アプリを確実に起動してネットワークにアクセスできます。 Dozeモードまたはアプリスタンバイモードでは、システムはメッセージを配信し、アプリにネットワークサービスと部分的なウェイクロックへの一時的なアクセスを許可してから、デバイスまたはアプリをアイドル状態に戻します。

これまでのところ、高優先度メッセージを使用する場合、すべてが正常に機能するはずです。ただし、それだけではありません。優先度を高い"priority":"high"に設定するのは正解です。残念ながら、この設定にはいくつかの注意点があります( from docs ):

優先度の高いメッセージは通常、ユーザーによるアプリまたはその通知の操作につながります。 FCMが検出し​​ないパターンを検出した場合、メッセージの優先順位が優先順位が下げられている可能性があります

つまり、情報提供の通知のみを送信する場合は、デバイスをDozeモードから復帰させて通知を表示するだけでは不十分です。 Android Pからチェック/制限がさらに厳しくなりました。アプリのスタンバイバケットについては、 こちら をご覧ください)。

良い点は、Dozeモードを終了することが、さまざまなイベント/相互作用の形で行われることです。

ユーザーがデバイスを動かしたり、画面をオンにしたり、充電器を接続したりすると、システムはすぐにDozeを終了し、すべてのアプリが通常のアクティビティに戻ります。

少なくとも私が試した電話では、通常の毎日のシナリオでは、通知はあなたの夜の睡眠中、またはデバイスがそこに座って相互作用/動きがないときに停止されています。

ただし、本当にevery通知を配信する必要があり、UXにcrucialである場合は、 2つのオプションがあります。

  1. ユーザーとの対話を行わない場合は、優先度を高に設定し、システムが時々通知を表示することを期待します(おそらくメンテナンスウィンドウの間)。最善の方法ではありませんが、デフォルトでは時々動作する可能性があります。
  2. 通知がポップアップすることを保証したい場合は、ユーザーに問題を説明する画面をいくつか用意してから、ユーザーをSettings -> Apps & notifications --> Advanced --> Special app access --> Battery optimisationに移動します。次に、アプリを選択し、手動でDo n't optimiseに設定します。これはベストプラクティスとは見なされず、次の点に注意してください。a)ユーザーはこのアクションの結果を知らないでください。b)意図したとおりに機能するためには、OSにすべてを任せることをお勧めします。

つまり、通知の優先度をhighに設定する必要はありません。これは、OSが通知を通知するだけであり、通知を受け取るためです。スマートフォンが「ディープスリープ」Dozeモードに入ると、通知を表示するためにスリープ状態を解除してはならず、解除してはならないので、試しても意味がないことに注意してください。これは仕様によるものです。そうしないと、他のすべての開発者が通知の優先度を高く設定でき、電話機がDozeモードに移行しない可能性があり、そのため機能が役に立たなくなります。

1
Mihail Duchev