具有高优先级的Firebase消息未从Doze android 6+;唤醒设备;
我已将我的项目从使用GCM迁移到使用Firebase。当设备处于唤醒状态或最近处于休眠状态时,推送通知通过ok发送,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送 Android文档说,如果你需要唤醒一台设备来发送消息,那么使用FireBase并将优先级设置为high。它还说,设备管理应用程序不受瞌睡限制,我的应用程序是一个设备管理应用程序 我想我应该提到,当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而没有指定指纹 我尝试过的。具有高优先级的Firebase消息未从Doze android 6+;唤醒设备;,android,firebase-cloud-messaging,device-admin,Android,Firebase Cloud Messaging,Device Admin,我已将我的项目从使用GCM迁移到使用Firebase。当设备处于唤醒状态或最近处于休眠状态时,推送通知通过ok发送,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送 Android文档说,如果你需要唤醒一台设备来发送消息,那么使用FireBase并将优先级设置为high。它还说,设备管理应用程序不受瞌睡限制,我的应用程序是一个设备管理应用程序 我想我应该提到,当我将项目从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........"
]
}
设定了生存时间,因此信息最终会被传递出去。延迟,当空闲设置为false时,FCM将在2016年9月后忽略该设置onMessageReceived(RemoteMessage remoteMessage)
我相信通知消息确实会唤醒设备,这正是我所需要的,但我希望应用程序能够处理推送,而不是用户。我可以拥有通知和数据两种消息,但OnMessageReceived可以处理这些功能吗
有没有人经历过类似的事情,或者对此有什么解决办法
[第1版]
我在下面找到了一个链接,上面说你可以发送一条包含通知和数据的消息,但是如果应用程序在后台,则会显示通知,但只有当用户单击通知时才会执行数据。这不是我想要的,因为我希望数据立即在onMessageCived中执行
[编辑二]
我已将以下代码和权限添加到应用程序中。该应用程序现在要求用户将该应用程序列入打瞌睡的白名单,因此我单击了“是”。然后,我通过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" />
if(Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.M){
意图=新意图();
字符串packageName=getPackageName();
PowerManager pm=(PowerManager)getSystemService(POWER\u服务);
如果(!pm.isIgnoringBatteryOptimizations(packageName)){
设置动作(设置、动作、请求、忽略、电池优化);
setData(Uri.parse(“包:“+packageName”);
星触觉(意向);
}
}
[编辑部3]
我已经做了进一步的测试,试图隔离问题,并将我的web应用程序代码从等式中去掉。我通过adb和使用的FireBase控制台将设备放入Doze,以发送推送推送正确这告诉我,将所有推送信息发送到fcm端点的web应用程序代码存在问题。我今晚会拿到密码,稍后再发
[编辑部4]
我刚刚又做了一些测试。我将设备放入doze中,然后使用FireBase控制台发送带有2个键值对的数据消息。当设备处于睡眠状态且应用程序位于前台(屏幕上)时,推送将通过并执行onMessageReceived。这太棒了。但是,如果应用程序位于BG中,则仅显示通知。据我所知,从文档中,数据消息通过Intent发送到launcher活动,但我的launcher应用程序不处理推送。处理推送的类称为MyAndroidFirebaseMsgService,扩展了FirebaseMessagingService
如果应用程序在BG中,我是否必须将意图路由到此类?这样做似乎有点开始了。GCM从来就不是这样
此外,我不希望应用程序通过推送启动,因为这是非常具有侵入性的,因为设备用户可能正在使用不同的应用程序。我的应用程序也是一个设备管理应用程序,因此99%的时间没有用户交互,它只是一个在设备上执行策略的客户端。
[编辑部5]
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)
{
}
}//
内部静态void SendNotification(字典名称值、列表名称、字符串sPushName)
{
string stringregIds=string.Join(“\”,\”,theregIDs);
JavaScriptSerializer js=新的JavaScriptSerializer();
字符串keyValueJson=js.Serialize(nameValues);
字符串TIME_TO_LIVE=“604800”;
空闲时的字符串延迟=“false”;
字符串端点地址=@“https://fcm.googleapis.com/fcm/send";
postData=String.Concat(“{time\\\\\\\\\\\\\\\\\\\\\\\\\\”:”,time\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
,keyValueJson
,“},\“注册ID\:[\”“+stringregIds+”\“]}”);
WebRequest myWebRequest=null;
WebResponse myWebResponse=null;
尝试
{
myWebRequest=WebRequest.Create(端点地址);
myWebRequest.Method=“post”;
myWebRequest.ContentTyp
{
"time_to_live": 300000,
"delay_while_idle": false,
"data": {
"message": "PING_DEVICE",
"time": "21/01/2018 16:20:28",
"pushguid": "10062"
},
"priority": "high"
}
{
"android": {
"priority": "high"
}
}
{
"priority": "high", // legacy HTTP protocol (this can also be set to 10)
"android": {
"priority": "high" // HTTP v1 protocol
}
}