我已经将我的项目从使用GCM迁移到使用Firebase。当设备最近醒着或睡着时,推送通知会通过ok,但是如果我离开设备一个小时,在我唤醒设备之前不会发送推送。
Android说,如果你需要唤醒一个设备来传递一条消息,那么就使用优先级设置为高的FireBase。它还说设备管理应用程序不受Doze限制,我的应用程序是设备管理应用程序。
我想我要提到的是,当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而没有指定指纹。
我试过的东西。
我已经离开我的设备去睡觉3个小时,没有任何推动通过。我还用亚行把这个装置放进了Doze。当亚行将设备放入Doze时,没有收到推送,当亚行将设备从Doze取出时,推送就通过了。
进一步思考我还没有试过。
我的推杆是数据信息。这是因为我不希望推送到设备上的通知栏,让用户单击它来执行功能。用户没有与设备管理应用程序的交互。因此,数据消息由
onMessageReceived(RemoteMessage remoteMessage)
我相信通知信息确实会唤醒设备,这正是我所需要的,但我希望应用程序来处理推送,而不是用户。我可以拥有通知和数据的消息,但是onMessageRecievied可以处理这些功能吗?
有没有人经历过类似的事情,或者对此有什么解决方案?
EDIT1我在下面找到了一个链接,上面说您可以发送一个消息,它既是通知也是数据,但是如果应用程序在后台,则会显示通知,但只有当用户单击通知时才会执行该通知。这不是我想要的,因为我希望数据立即在onMessageRecived中执行。
EDIT2我向应用程序添加了以下代码和权限。该应用程序现在要求用户为Doze白名单应用程序,所以我点击“是”。然后我通过亚行把设备放到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应用程序代码从等式中删除。我把设备通过亚行和使用的FireBase控制台发送推送到Doze。推送是正确的,,这告诉我,我的web应用程序代码有一个问题,它将所有的push信息发送到fcm端点。今晚我会拿到密码,稍后再发。
EDIT4我刚刚做了更多的测试。我将设备放入午睡状态,然后使用FireBase控制台发送带有两个键值对的数据消息。当设备在Doze中,应用程序在前台(在屏幕上)时,推送通过并执行onMessageReceived。这太棒了。但是,如果应用程序在BG中,则只显示一个通知。我了解到,从文档中,数据消息是通过意图发送到启动程序活动的,但我的启动程序应用程序不处理处理推送的pushes.The类,称为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)
{
}
}//
谢谢
发布于 2019-01-09 14:13:14
在努力解决类似的问题后,我设法让它发挥作用。
我通过邮递员发送以下json数据:
{
"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
发布于 2020-01-27 22:14:05
TL;DR -确保根据v1遗留协议的JSON有效负载结构和HTTP协议正确地设置通知优先级.
根据您的情况或实现,上面的帖子可能已经给出了足够的答案,但我想根据FCM在文档中提供的遗留HTTP和HTTP v1协议之间的区别来提供更多的上下文,但在设置通知优先级时,这两个协议API之间有细微的差别。
我们的团队也遇到了同样的问题,即在已经启用Doze的Android设备上没有接收推送通知,尽管我们的服务器似乎在FCM有效负载中正确设置了与最初问题中提供的有效负载类似的优先级。我们依赖Amazon将有效负载转发到FCM,从服务器发送到Amazon的有效负载将根据AndroidConfig JSON对象设置优先级:
{
"android": {
"priority": "high"
}
}
然而,根据JSON HTTP v1协议.,这只是正确的,但我们没有意识到的是,Amazon很可能仍然使用必须在JSON有效负载的顶层设置优先级的:
{
"priority": "high", // legacy HTTP protocol (this can also be set to 10)
"android": {
"priority": "high" // HTTP v1 protocol
}
}
因此,只有当遗留HTTP优先级参数设置为“高”或10时,通知优先级才会生效并允许在Doze中接收推送通知。
对于上下文,在向FCM发送消息时,这些是每个协议的API端点:
"priority"
param (请看这里)
"android"
对象具有"priority"
param (请看这里)
发布于 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有这样的机制,并且您的应用程序也会受到同样的影响。
https://stackoverflow.com/questions/48451761
复制相似问题