Использование GCM для отправки уведомлений в приложении, возвращает ошибку InvalidRegistration

Я пытаюсь отправить уведомление с помощью GCM на мое устройство Android, но я всегда получаю ошибку InvalidRegistration.

Вот код PHP, который должен отправить уведомление:

<?php define('API_ACCESS_KEY', 'API KEY HIDDEN'); $registrationIds = array( $_GET['id']); // prep the bundle $msg = array ( 'message' => 'TestMessage', 'title' => 'TestTitle', 'subtitle' => 'TestSubtitle', 'tickerText' => 'TestTicker', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send' ); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false ); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch ); echo $result; ?> 

Так производится регистрация:

 private void registerInBackground() { new AsyncTask<Void, Object, String>() { @Override protected String doInBackground(Void... params) { String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regid = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regid; //Here I save the registration ID, and when I try to use it manually, by running the PHP script above, I get the error. sendRegistrationIdToBackend(); // Persist the registration ID - no need to register again. storeRegistrationId(context, regid); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return msg; } @Override protected void onPostExecute(String msg) { Toast.makeText(context, msg + "\n", Toast.LENGTH_SHORT).show(); } }.execute(null, null, null); 

После запуска приложения и вызова метода, который регистрирует приложение, я получаю идентификатор регистрации. Затем, когда я localhost/app/sendNotification.php?id=xxxxxxxxxxxxxx я получаю

 {"multicast_id":8460288429151356251,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]} 

Related of "Использование GCM для отправки уведомлений в приложении, возвращает ошибку InvalidRegistration"

Неверный идентификатор регистрации Проверьте форматирование идентификатора регистрации, который вы передаете на сервер. Убедитесь, что он соответствует идентификатору регистрации, который получает телефон, в намерении com.google.android.c2dm.intent.REGISTRATION и что вы не усекаете его или не добавляете дополнительные символы. Случается, когда код ошибки является InvalidRegistration.

Таким образом, в основном вы делаете ошибку при отправке идентификатора устройства, полученного телефоном на сервер. Убедитесь, что ваш код не меняет deviceId. Вы не отправили код для принятия идентификатора. В этой части есть ошибка или сохранение DeviceId. Я не думаю, что в коде, который вы опубликовали, есть какая-либо ошибка, поскольку неверная регистрация errorLog show

Любое другое, если вы извлекаете токен из db, убедитесь, что тип данных для столбца является либо текстовым, либо очень длинным varchar, как 200. Токен имеет длину более 100 символов, поэтому он может быть сокращен пополам, чтобы быть сохраненным в децибел

Я решил эту проблему, отправив идентификатор регистрации устройства, например

 <?php require_once('loader.php'); // return json response $json = array(); $registatoin_ids = array("APA91bHhzESU4GQKwS_I-sMMpAPZ44GbC0wvDAO-Dch87_jwJzaB1gK5PPeaGmt6vFZx2Bvd6AC8EkYDl6PurNUDO6zLoxX50q7gLc8GMOLGcwmQgiWwSZS-PPOFn1MpA5hz_TFQ6S-4tstLO"); $message = array("product" => "shirt"); $result = send_push_notification($registatoin_ids, $message); echo $result; ?> 

в файле register.php. U получит этот идентификатор регистрации устройства из облака Google.