我的Android手机并不总是收到通知,即使Cloud Functions总是发送它们。作为一个有用的侧节点:总是收到WhatsApp消息(我测试过(。
我注意到手机充电或打开应用程序时会立即收到通知。
此外,即使已显示通知,用户的 UID 也并不总是发送到数据库(通过阅读代码,您将理解我的意思(。
我的问题是:我可以更改什么来接收通知,然后像应该的那样一直推送到数据库?
我的通知是"抬头"类型。
几天来我一直在尝试优化我的代码,但没有成功。我需要帮助。
代码结构:
- 收到消息后,将用户的UID推送到数据库,以查看稍后通知了多少人。
-
向用户发送通知。
public class MyFirebaseMessagingService extends FirebaseMessagingService { // Firebase instance variables private FirebaseAuth mFirebaseAuth; private FirebaseUser mFirebaseUser; DatabaseReference myURL = FirebaseDatabase.getInstance().getReferenceFromUrl("https://newproj-54a87.firebaseio.com/notified"); @Override public void onMessageReceived(RemoteMessage remoteMessage) { // Check if message contains a data payload. if (remoteMessage.getData() != null) { mFirebaseAuth = FirebaseAuth.getInstance(); mFirebaseUser = mFirebaseAuth.getCurrentUser(); if(mFirebaseUser != null) mUID = mFirebaseUser.getUid(); myURL.push().setValue(mUID); sendNotification(remoteMessage.getData().get("body"), remoteMessage.getData().get("title"), remoteMessage.getData().get("icon")); } } private void sendNotification(String messageBody, String messageTitle, String iconURL) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Bitmap bitmap = getBitmapFromURL(iconURL); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setDefaults(DEFAULT_SOUND | DEFAULT_VIBRATE) .setPriority(Notification.PRIORITY_MAX) .setStyle(new NotificationCompat.BigTextStyle()) .setSmallIcon(R.drawable.myIcon) .setLargeIcon(bitmap) .setContentTitle(messageTitle) .setContentText(messageBody) .setAutoCancel(true) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } public Bitmap getBitmapFromURL(String strURL) { //from https://stackoverflow.com/a/16007659 try { URL url = new URL(strURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); return myBitmap; } catch (IOException e) { e.printStackTrace(); return null; } } }
我的云功能:
const payLoad = {
data:{
title: name,
body: body,
icon: photoURL
}
};
var options = {
priority: "high",
timeToLive: 1000
};
return admin.messaging().sendToTopic("notify", payLoad, options);
如果我忘记了一条信息,请告诉我。我正在按有限的时间表运行!
如果您使用的是Android 6.0或更高版本,则有一个名为"打瞌睡"的功能可以优化电池使用。 当您的手机处于空闲状态(并且未充电(时,它只会收到高优先级的 FCM 通知,可能就是这种情况。
安卓文档 说:
FCM 经过优化,可通过以下方式与低电耗器和应用程序待机空闲模式配合使用 的高优先级 FCM 消息。FCM 高优先级消息让您 可靠地唤醒应用以访问网络,即使用户的 设备处于低电耗模式或应用程序处于应用程序待机模式。在打瞌睡或应用中 待机模式,系统传递消息并给出应用程序 临时访问网络服务和部分唤醒锁,然后 将设备或应用返回到空闲状态。
因此,如果使用FCM数据消息,您的后端应该开始发送字段"priority" : "high"
。
参考: https://firebase.google.com/docs/cloud-messaging/concept-options