具有高优先级的Firebase消息不会从Doze android 6中唤醒设备

具有高优先级的Firebase消息不会从Doze android 6中唤醒设备,第1张

概述我已将项目从使用GCM迁移到使用Firebase.当设备处于唤醒状态或最近处于睡眠状态时,推送通知会通过确认,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送.Android文档说,如果您需要唤醒设备以传递消息,请使用优先级设置为高的FireBase.它还说设备管理应用程序不受Doze限制,

我已将项目从使用GCM迁移到使用Firebase.当设备处于唤醒状态或最近处于睡眠状态时,推送通知会通过确认,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送.

Android文档说,如果您需要唤醒设备以传递消息,请使用优先级设置为高的FireBase.它还说设备管理应用程序不受Doze限制,我的应用程序是一个设备管理应用程序.

我想我会提到当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而不是指纹.

我试过了什么

>将优先级设置为高

{  "time_to_live": 300000,  "delay_while_IDle": false,  "androID": {    "priority": "high"  },  "data": {    "message": "Ping_DEVICE",    "time": "21/01/2018 16:20:28",    "pushguID": "10062"  },  "registration_IDs": [    "eOMT........"  ]}

设定生存时间,以便最终传达信息. delay_while_IDle设置为false,2016年9月后FCM将忽略此值.
>设备管理员应用程序不受Doze的影响,我的设备管理员应用程序,但我还明确将应用程序添加到设置中的Doze白名单 – >电池 – >优化.这是通过设置应用程序手动完成的,而不是以编程方式在代码中完成

我已经离开我的设备睡了3个小时,没有推动通过.我还使用adb将设备置于Doze中.当adb将设备置于Doze中时,没有收到推送,当adb将设备从Doze中取出时,推送就会通过.

进一步的想法我没试过.

我的推动是数据消息.这是因为我不希望推送到设备上的通知栏并让用户单击它来执行功能.用户没有与设备管理应用程序的交互.因此,数据消息由处理

onMessageReceived(RemoteMessage remoteMessage)

我相信通知消息会唤醒设备,这是我需要的,但我希望应用程序处理推送,而不是用户.我可以拥有通知和数据但是onMessageRecIEvIEd处理功能的消息吗?

有没有人经历过类似的事情或有任何解决方案?

[EDIT1]
我在下面找到了以下链接,说明您可以发送通知和数据的消息,但如果应用程序在后台,则会显示通知,但只有在用户单击通知时才会执行数据.这不是我想要的,因为我希望数据立即在onMessageRecived中执行.

notification with data

[EDIT2]
我已向应用添加了以下代码和权限.该应用程序现在要求用户将应用程序列入白名单,因此我单击是.然后我通过adb将设备放入Doze并发送推送.在我将设备退出打盹模式之前,没有任何事情发生.所以,不幸的是,这不起作用.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            Intent intent = new Intent();            String packagename = getPackagename();            PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);            if (!pm.isIgnoringBatteryOptimizations(packagename)) {                intent.setAction(Settings.ACTION_REQUEST_IGnorE_BATTERY_OPTIMIZATIONS);                intent.setData(Uri.parse("package:" + packagename));                startActivity(intent);            }        }<uses-permission androID:name="androID.permission.REQUEST_IGnorE_BATTERY_OPTIMIZATIONS" />

[EDIT3]

我已经做了进一步的测试,试图找出问题并将我的Web应用程序代码排除在外.我通过adb和使用过的FireBase控制台将设备置于Doze中以发送推送.推送正确通过这告诉我,我的Web应用程序代码存在问题,它将所有推送信息发送到fcm端点.今晚我会得到代码并稍后发布.

[EDIT4]
我刚做了一些测试.我将设备置于打瞌睡状态,然后使用FireBase控制台发送带有2个键值对的数据消息.当设备处于Doze且应用程序位于前台(在屏幕上)时,推送通过并执行onMessageReceived.这很棒.但是,如果应用程序位于BG中,则仅显示通知.我理解,从文档中,数据消息通过Intent被分派到启动器活动,但我的启动器应用程序不处理推送.处理推送的类称为MyAndroIDFirebaseMsgService并扩展FirebaseMessagingService.

如果应用程序在BG中,我是否必须将意图路由到此课程?看起来有点像需要这样做.在GCM中从来就不是这样.

此外,我不希望应用程序从推送启动,因为这是非常侵入性的,因为设备用户可能正在使用不同的应用程序.我的应用程序也是一个设备管理员应用程序,所以99%的时间没有用户交互,它只是一个在设备上执行策略的客户端.

[edit5]

internal static voID SendNotification (  Dictionary<string, string> nameValues ,  List<string> theregIDs , string sPushname)         {                 string stringregIDs =  string.Join("\",\"", theregIDs) ;             JavaScriptSerializer Js = new JavaScriptSerializer();            string keyvalueJson = Js.Serialize(nameValues);            string TIME_TO_liVE = "604800";            string DELAY_WHILE_IDLE = "false";            string ENDPOINTADDRESS = @"https://fcm.GoogleAPIs.com/fcm/send";            postData = String.Concat("{\"time_to_live\":", TIME_TO_liVE,  ",\"delay_while_IDle\": ", DELAY_WHILE_IDLE,  ",  \"androID\":{\"priority\":\"high\" } ,\"data\": { \"message\" : " + "\"" + sPushname + "\",\"time\": " + "\"" + System.DateTime.Now.ToString() + "\""                , keyvalueJson               , "},\"registration_IDs\":[\"" + stringregIDs + "\"]}");            WebRequest myWebRequest = null;            WebResponse myWebResponse = null;            try            {                myWebRequest = WebRequest.Create(ENDPOINTADDRESS);                                         myWebRequest.Method = "post";                myWebRequest.ContentType = "application/Json";                //  myWebRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";                myWebRequest.headers.Add("Authorization: key=" + Our_API_Key);                myWebRequest.headers.Add("Sender:ID=" + Our_Sender_ID);                Byte[] BA = EnCoding.UTF8.GetBytes(postData);                myWebRequest.ContentLength = BA.Length;                using (Stream dataStreamOut = myWebRequest.GetRequestStream())                {                    dataStreamOut.Write(BA, 0, BA.Length);                }                using (myWebResponse = myWebRequest.GetResponse())                {                    using (Stream dataStream = myWebResponse.GetResponseStream())                    {                        using (StreamReader tReader = new StreamReader(dataStream))                        {                            strServerResponse = tReader.ReadToEnd();                         }                    }                }            }            catch (WebException ex)            {            }         }//

谢谢

解决方法:

你无能为力.

这是由一些OEM(如魅族或华硕)实施的电池优化引起的已知问题.当应用程序切换器中的应用程序被刷掉时,应用程序将被视为强制停止,这不是默认的AndroID行为.这种不幸的副作用是它可能导致您的应用程序的FCM服务停止运行.在打盹模式下,高优先级消息可能会产生类似的效果.

Firebase团队正在努力从最终改善这种行为,但实际修复必须来自OEM方面.

检查您的应用是否受到任何OEM电池管理功能影响的一种方法如下:

1)将OEM设备连接到adb

2)在设备上运行您的应用程序

3)将应用程序从设备上的最近屏幕上移开

4)运行命令:adb shell dumpsys package MY-PACKAGE |格雷普停了下来

如果它显示stopped = true,则可以安全地假设OEM具有这样的机制并且您的应用程序受到相同的影响.

总结

以上是内存溢出为你收集整理的具有高优先级的Firebase消息不会从Doze android 6中唤醒设备全部内容,希望文章能够帮你解决具有高优先级的Firebase消息不会从Doze android 6中唤醒设备所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1100639.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存