通常不会通过电话收到通知?

时间:2017-08-15 20:26:12

标签: android firebase push-notification firebase-cloud-messaging google-cloud-functions

我的Android手机并不总是收到通知,即使云功能始终发送它们。作为一个有用的侧节点:总是收到WhatsApp消息(我测试过它)。

我注意到在手机充电或打开应用程序时会立即收到通知。

此外,即使已显示通知,用户的UID也不会始终发送到数据库(您通过阅读代码了解我的意思)。

我的问题是:我可以更改哪些内容以接收通知,然后一直推送到数据库 ,就像它应该的那样?

我的通知是"单挑"类型。

我一直在努力优化的代码,但没有成功。我需要帮助。

代码结构:

  1. 收到邮件后,将用户的UID推送到数据库,以查看稍后有多少人收到通知。
  2. 向用户发送通知。

    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;
        }
    }
    }
    
  3. 我的云功能:

        const payLoad = {
        data:{
            title: name,
            body: body,
            icon: photoURL
            }
        };
    
        var options = {
            priority: "high",
            timeToLive: 1000
            };
    
            return admin.messaging().sendToTopic("notify", payLoad, options);
    

    如果我忘记了一条信息,请告诉我。我在有限的时间表上跑步!

1 个答案:

答案 0 :(得分:3)

如果您使用的是Android 6.0或以上版本,则可以使用名为Doze的功能来优化电池使用情况。当您的手机闲置(并且没有充电)它只会收到高优先级的FCM通知,可能就是您的情况。

Android documentation说:

  

FCM经过优化,可以通过手段与Doze和App Standby空闲模式配合使用   高优先级FCM消息。 FCM高优先级消息让你   可靠地唤醒您的应用程序以访问网络,即使用户的   设备处于Doze状态或应用程序处于App Standby模式。在Doze或App   待机模式,系统传递消息并提供应用程序   然后,临时访问网络服务和部分唤醒锁   将设备或应用程序返回到空闲状态。

因此,如果使用FCM数据消息,您的后端应该开始发送字段"priority" : "high" 参考:https://firebase.google.com/docs/cloud-messaging/concept-options