首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有高优先级的防火墙消息-- Doze android 6+不唤醒设备

具有高优先级的防火墙消息-- Doze android 6+不唤醒设备
EN

Stack Overflow用户
提问于 2018-01-25 20:54:40
回答 7查看 34.7K关注 0票数 57

我已经将我的项目从使用GCM迁移到使用Firebase。当设备最近醒着或睡着时,推送通知会通过ok,但是如果我离开设备一个小时,在我唤醒设备之前不会发送推送。

Android说,如果你需要唤醒一个设备来传递一条消息,那么就使用优先级设置为高的FireBase。它还说设备管理应用程序不受Doze限制,我的应用程序是设备管理应用程序。

我想我要提到的是,当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而没有指定指纹。

我试过的东西。

  1. 将优先级设置为高 { "time_to_live":300000,"delay_while_idle":false,"android":{“优先级”:“高”},“数据”:{“消息”:"PING_DEVICE",“时间”:"21/01/2018 16:20:28",“推图”:"10062“},"registration_ids":”eOMT.“} 生活的时间已经设定好了,这样信息最终就会传递出来。delay_while_idle设置为false,2016年9月后FCM忽略了这一点。
  2. 设备管理应用程序不受Doze的约束,我的应用程序是一个设备管理应用程序,但我也显式地将该应用程序添加到在设置->电池->优化中找到的Doze白名单中。这是通过设置应用程序手动完成的,而不是以编程方式在代码中完成的。

我已经离开我的设备去睡觉3个小时,没有任何推动通过。我还用亚行把这个装置放进了Doze。当亚行将设备放入Doze时,没有收到推送,当亚行将设备从Doze取出时,推送就通过了。

进一步思考我还没有试过。

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

代码语言:javascript
运行
复制
onMessageReceived(RemoteMessage remoteMessage)

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

有没有人经历过类似的事情,或者对此有什么解决方案?

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

带有数据的通知

EDIT2我向应用程序添加了以下代码和权限。该应用程序现在要求用户为Doze白名单应用程序,所以我点击“是”。然后我通过亚行把设备放到Doze,然后推了一推。直到我把设备从打瞌睡模式中拿回来之前,什么都没得到。因此,不幸的是,这是行不通的。

代码语言:javascript
运行
复制
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应用程序代码从等式中删除。我把设备通过亚行和使用的FireBase控制台发送推送到Doze。推送是正确的,,这告诉我,我的web应用程序代码有一个问题,它将所有的push信息发送到fcm端点。今晚我会拿到密码,稍后再发。

EDIT4我刚刚做了更多的测试。我将设备放入午睡状态,然后使用FireBase控制台发送带有两个键值对的数据消息。当设备在Doze中,应用程序在前台(在屏幕上)时,推送通过并执行onMessageReceived。这太棒了。但是,如果应用程序在BG中,则只显示一个通知。我了解到,从文档中,数据消息是通过意图发送到启动程序活动的,但我的启动程序应用程序不处理处理推送的pushes.The类,称为MyAndroidFirebaseMsgService和扩展FirebaseMessagingService。

如果应用程序在BG中,我是否必须将意图路由到这个类?要这么做似乎有点让人吃惊。在GCM中从未发生过这种情况。

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

edit5

代码语言:javascript
运行
复制
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)
            {



            }

         }//

谢谢

EN

回答 7

Stack Overflow用户

发布于 2019-01-09 14:13:14

在努力解决类似的问题后,我设法让它发挥作用。

我通过邮递员发送以下json数据:

代码语言:javascript
运行
复制
{
  "data": {
    "body": "Test body from curl"
  },
  "registration_ids": ["Token"],
  "webpush": {
    "headers": {
      "Urgency": "high"
    }
  },
  "android": {
    "priority": "high"
  },
  "priority": 10
}

似乎是最后一个"priority":10为我修复了它。

我在Firebase文档中找不到对此的任何引用,但是在被废弃的GCM文档中使用它。https://developers.google.com/cloud-messaging/concept-options

票数 23
EN

Stack Overflow用户

发布于 2020-01-27 22:14:05

TL;DR -确保根据v1遗留协议的JSON有效负载结构和HTTP协议正确地设置通知优先级.

根据您的情况或实现,上面的帖子可能已经给出了足够的答案,但我想根据FCM在文档中提供的遗留HTTP和HTTP v1协议之间的区别来提供更多的上下文,但在设置通知优先级时,这两个协议API之间有细微的差别。

我们的团队也遇到了同样的问题,即在已经启用Doze的Android设备上没有接收推送通知,尽管我们的服务器似乎在FCM有效负载中正确设置了与最初问题中提供的有效负载类似的优先级。我们依赖Amazon将有效负载转发到FCM,从服务器发送到Amazon的有效负载将根据AndroidConfig JSON对象设置优先级:

代码语言:javascript
运行
复制
{
    "android": {
        "priority": "high"
    }
}

然而,根据JSON HTTP v1协议.,这只是正确的,但我们没有意识到的是,Amazon很可能仍然使用必须在JSON有效负载的顶层设置优先级的

代码语言:javascript
运行
复制
{
    "priority": "high", // legacy HTTP protocol (this can also be set to 10)
    "android": {
        "priority": "high" // HTTP v1 protocol
    }
}

因此,只有当遗留HTTP优先级参数设置为“高”或10时,通知优先级才会生效并允许在Doze中接收推送通知。

对于上下文,在向FCM发送消息时,这些是每个协议的API端点:

票数 17
EN

Stack Overflow用户

发布于 2018-02-02 15:25:18

你无能为力。

这是一个已知的问题,是由一些原始设备制造商(如Meizu或Asus)实现的电池优化造成的。当应用程序在应用程序切换程序中被滑动时,应用程序被视为已停止使用,这不是默认的Android行为。不幸的副作用是,它可能导致FCM服务为您的应用程序停止运行。在打瞌睡模式下,高优先级消息也会受到类似的影响。

Firebase团队正在努力从他们的终端改进这种行为,但是实际的修复必须来自OEM方面。

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

1)将OEM设备附加到亚行

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

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

4) Run命令:亚行shell虚拟包包MY-PACKAGE x grep已停止

如果它显示stopped=true,那么可以安全地假设OEM有这样的机制,并且您的应用程序也会受到同样的影响。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48451761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档