如何设置发送到 NotificationHub 的推送通知的高优先级

Jan*_*raš 7 android azure xamarin.android xamarin azure-notificationhub

我已经成功实现了 Azure Function,它向 Android、iOS 和 UWP 的 NotificationHub 发送推送通知。在测试过程中,我发现当 Android 设备处于 Doze 模式时,锁定屏幕上不会发送推送通知。只有在我解锁手机时才会交付。

我发现了这个 stackoverflow 帖子,它帮助我使用方法SendFcmNativeNotificationAsync修复它。我使用了这个代码:

string payload = @"{
                    ""data"":{
                        ""notificationtype"":""sap"",
                        ""title"":""value2"",
                    },
                        ""priority"":""high""
                    }";

await hub.SendFcmNativeNotificationAsync(payload);
Run Code Online (Sandbox Code Playgroud)

然而,我使用SendNotificationAsync方法的实现适用于所有 3 个平台,但不适用于打盹模式。这是我发送通知的代码:

Dictionary<string, string> templateParameters = new Dictionary<string, string>();

templateParameters["alert"] = "Test";
templateParameters["title"] = "Whosap";

var notification = new TemplateNotification(templateParameters);
await hub.SendNotificationAsync(notification);
Run Code Online (Sandbox Code Playgroud)

我试图设置通知标题:

var headers = new Dictionary<string, string> { { "android", @"{""priority"": ""high""}" } };
notification.Headers = headers;
Run Code Online (Sandbox Code Playgroud)

但这没有用。有人知道如何在 TemplateNotification 对象中设置优先级并使用 SendNotificationAsync 方法发送它吗?

这就是我强制/取消强制设备进入打盹模式的方式:

adb shell dumpsys deviceidle force-idle
adb shell dumpsys deviceidle unforce
Run Code Online (Sandbox Code Playgroud)

Mih*_*hev 3

根据您的评论,您希望“仅提供信息性推送通知”,不幸的是,您无法强制手机每次都显示您的通知。这并不构成 Xamarin 甚至 Azure Functions 的限制。甚至谷歌自己的一些应用程序也有同样的行为。

\n\n

查看打瞌睡清单

\n\n
\n

如果您的用户必须立即看到通知,请确保使用FCM 高优先级消息

\n
\n\n

即使我们查看在设备空闲时使用 FCM 与您的应用程序交互

\n\n
\n

FCM 经过优化,可通过高优先级 FCM 消息与 Doze 和应用程序待机空闲模式配合使用。FCM 高优先级消息可让您可靠地唤醒应用程序以访问网络,即使用户\xe2\x80\x99s 设备处于打瞌睡状态或应用程序处于应用程序待机模式时也是如此。在打瞌睡或应用程序待机模式下,系统会传递消息并为应用程序提供对网络服务和部分唤醒锁的临时访问权限,然后将设备或应用程序返回到空闲状态。

\n
\n\n

到目前为止,如果您决定使用高优先级消息,一切都会正常工作。然而,这还不是故事的全部。您将优先级设置为 high 是正确的"priority":"high"。不幸的是,此设置有一些警告(来自文档):

\n\n
\n

高优先级消息通常应该导致用户与您的应用程序或其通知进行交互。如果 FCM 检测到了他们没有检测到的模式,您的邮件可能会被取消优先级

\n
\n\n

这意味着,如果您仅发送信息性通知,则不足以将设备从打瞌睡模式唤醒并显示通知。Android P 的检查/限制变得更加严格。请在此处阅读有关应用程序待机存储桶的信息。

\n\n

好处是退出打瞌睡模式以各种事件/交互的形式出现:

\n\n
\n

一旦用户通过移动设备、打开屏幕或连接充电器来唤醒设备,系统就会退出 Doze,所有应用程序都会恢复正常活动。

\n
\n\n

至少在我尝试过的手机上,在正常的日常场景中,通知会在您夜间睡眠期间或当设备坐在那里而没有任何交互/移动等时暂停。

\n\n

但是,如果您确实需要发送每个通知并且这对用户体验至关重要,那么您有 2 个选择:

\n\n
    \n
  1. 如果您不想进行用户交互 - 将优先级设置为高,并且只是希望系统偶尔会显示一些通知(可能在维护窗口期间)。这不是最好的方法,但默认情况下它有时可能会起作用。
  2. \n
  3. 如果您想保证弹出通知,请使用一些屏幕向用户描述问题,然后将用户导航到Settings -> Apps & notifications --> Advanced --> Special app access --> Battery optimisation。然后他/她可以选择您的应用程序并将其手动设置为Don\t optimization。请记住,这不被认为是最佳实践,并且:a)用户不应该知道此操作的后果,b)最好将所有事情留给操作系统,以便它按预期工作。
  4. \n
\n\n

总而言之,您不必将通知的优先级设置为high,因为操作系统会看到它是一个简单的信息通知,并且现在会唤醒手机。请记住,当手机进入“深度睡眠”打瞌睡模式时,它不应该也不应该因信息通知而唤醒,因此尝试没有意义 - 这是设计使然。否则,其他所有开发人员都可以将其通知优先级设置为高,而手机可能永远不会进入打瞌睡模式,这将使该功能毫无用处。

\n