FCM не отправляет сообщения с данными немедленно - PullRequest
0 голосов
/ 29 апреля 2019

Я отправляю уведомления через данные, а не уведомления. И приоритет данных по умолчанию нормальный.

Когда я использую admin.messaging().send(), он даже не отправляет большую часть времени. Но я не могу настроить приоритет с помощью admin.messaging().sendToDevice(), так как он принимает только «данные» и «уведомления». И когда я использую этот метод, он в основном даже не отправляет сообщение. Я не знаю, почему send () тоже не работает, и я хочу знать, как сделать сообщение высоким приоритетом.

Проверенные телефоны: Xiaomi, ZTE.

Код функции облака, почти никогда не отправляется:

 const payload = 
   {  
     "delay_while_idle": false,
      "android": 
          {
             "priority": "high",
              "ttl":0
          },
      data:
          {
           is_there_new_notification: "true"
          },
          token: token

      };

       return  admin.messaging().send(payload)
               .then((response) => {
               // Response is a message ID string.
               //console.log('Successfully sent message:', response);

                return response;
                }).catch((error) => {
               // console.log('Error sending message:', error);
                 return error;
               });

Код функции облака 2, не отправляет немедленно в режиме ожидания, иногда не отправляет, даже когда устройство не работает)

const payload =    {  
        data:
         {
            is_there_new_notification: "true"
         }

  };

  return  admin.messaging().sendToDevice(token, payload).then((response) => {
                                    // Response is a message ID string.
                                    //console.log('Successfully sent message:', response);

                                   return response;
                                    })
                                .catch((error) => {
                                  // console.log('Error sending message:', error);
                                   return error;
                                    });

Редактировать:

Сервисные коды Android:

@Override
        public void onMessageReceived(RemoteMessage remoteMessage)
            {
                super.onMessageReceived(remoteMessage);
                Log.d(TAG, "onMessageReceived: " + remoteMessage.getData());

                //This is just a string variable return "true" in string. it is being sent in order to notify there are notifications. We don't need its content.
                if(remoteMessage.getData().get(getString(R.string.notification_is_there_new_notification))!= null)
                    {
                        FirebaseMethods.checkAndShowIfThereAreNotifications(context);
                    }
            }

AndroidManifest:

 <service
            android:name=".FirebaseFCMService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

Связанные ресурсы:

https://firebase.google.com/docs/cloud-messaging/concept-options https://developer.android.com/training/monitoring-device-state/doze-standby.html

1 Ответ

1 голос
/ 01 мая 2019

попробовал, отправив уведомление через код, который у меня нормально работает.Пожалуйста, используйте следующий код:

FCM.java

public class FCM {

final static private String FCM_URL = "https://fcm.googleapis.com/fcm/send";

/**
 * 
 * 
 * 
 * Method to send push notification to Android FireBased Cloud messaging
 * Server.
 * 
 * 
 * 
 * @param tokenId
 *            Generated and provided from Android Client Developer
 * 
 * @param server_key
 *            Key which is Generated in FCM Server
 * 
 * @param message
 *            which contains actual information.
 * 
 * 
 * 
 */

static void send_FCM_Notification(String tokenId, String server_key, String message, String req) {

    try {

        // Create URL instance.

        URL url = new URL(FCM_URL);

        // create connection.

        HttpURLConnection conn;

        conn = (HttpURLConnection) url.openConnection();

        conn.setUseCaches(false);

        conn.setDoInput(true);

        conn.setDoOutput(true);

        // set method as POST or GET

        conn.setRequestMethod("POST");

        // pass FCM server key

        conn.setRequestProperty("Authorization", "key=" + server_key);

        // Specify Message Format

        conn.setRequestProperty("Content-Type", "application/json");

        // Create JSON Object & pass value

        JSONObject infoJson = new JSONObject();

        //infoJson.put("title", "Here is your notification.");

        infoJson.put("body", message);

        infoJson.put("msg", req);

        JSONObject json = new JSONObject();

        json.put("to", tokenId.trim());

        //json.put("notification", infoJson);

        json.put("data", infoJson);
        json.put("priority", "high");
        json.put("time_to_live",5);


        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

        wr.write(json.toString());

        wr.flush();

        int status = 0;

        if (null != conn) {

            status = conn.getResponseCode();

        }

        if (status != 0) {

            if (status == 200) {

                // SUCCESS message

                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

                Log.d("ResultData","Android Notification Response : " + reader.readLine());

            } else if (status == 401) {

                // client side error

                Log.d("ResultData","401 Notification Response : TokenId : " + tokenId + " Error occurred :");

            } else if (status == 501) {

                // server side error

                Log.d("ResultData","Notification Response : [ errorCode=ServerError ] TokenId : " + tokenId);

            } else if (status == 503) {

                // server side error

                Log.d("ResultData","Notification Response : FCM Service is Unavailable  TokenId : " + tokenId);

            }

        }

    } catch (MalformedURLException mlfexception) {

        // Prototcal Error

        Log.d("ResultData","Error occurred while sending push Notification!.." + mlfexception.getMessage());

    } catch (IOException mlfexception) {

        // URL problem

        Log.d("ResultData",
                "Reading URL, Error occurred while sending push Notification!.." + mlfexception.getMessage());

    } catch (JSONException jsonexception) {

        // Message format error

        Log.d("ResultData",
                "Message Format, Error occurred while sending push Notification!.." + jsonexception.getMessage());

    } catch (Exception exception) {

        // General Error or exception.

        Log.d("ResultData","Error occurred while sending push Notification!.." + exception.getMessage());

    }

}

TestActivity.java

public class TestActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.test_act);

    String tokenId;// your token ID
    String server_key; //you server key ;
    String message;// Your message

    FCM.send_FCM_Notification( tokenId,server_key,message,"Reply");
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...