Несколько уведомлений, получаемых из GCM

Я использую PHP для отправки уведомлений на несколько устройств Android одновременно. Все регистрационные идентификаторы уникальны, ниже приводится запрос CURL, который я отправляю.

$url='https://android.googleapis.com/gcm/send';
$headers = array(
                'Authorization: key=' . ANDROID_KEY,
                'Content-Type: application/json'
            );
$registration_ids = [];//with multiple registration ids
$notification = array(
                'registration_ids' => $registration_ids,
                'data'             => array('notification_id' => $data['notification_id'],
                                            'title'           => $data['title'],
                                            'message'         => $data['message'])
            );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($notification));           
$res = curl_exec($ch);

После многократной отладки я не смог найти причину для нескольких уведомлений (более 10 раз) на одном устройстве.

Есть ли способ проверить журнал запросов, полученных GCM. Любое руководство будет оценено.

Ответы

Ответ 1

Можете ли вы попробовать запустить свою командную строку script через командную строку и посмотреть, все ли она отправляет несколько уведомлений, если не существует какой-либо проблемы в script, где реализован этот фрагмент кода.

Ответ 2

добавить в конце кода

echo json_encode($res);

и посмотреть результат из CGM. Возможно, вы можете увидеть результат там, если это все еще проблема, вставьте его здесь.

Ответ 3

Попробуйте ввести код ниже. Я уже использовал это и отлично работает:

$registrationIDs[] = array();//All device tokens

// Set POST variables
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
    'registration_ids' => $registrationIDs,
        'data' => $param,
);
$headers = array(
    'Authorization: key=' . $apiKey, // ANDROID PUSH NOTIFICATION API KEY;
    'Content-Type: application/json'
);

// Open connection
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

// Execute post
$result = curl_exec($ch);
if ($result === FALSE) {
    die('Curl failed: ' . curl_error($ch));
} else {
    // "success notification";
}

// Close connection
curl_close($ch);

Если вы все еще получаете несколько уведомлений. Вы должны управлять токенами устройств.

Каждое устройство может иметь несколько токенов устройства. Поэтому вам нужно управлять этим с помощью идентификатора устройства. Следуйте этому шагу:

  • При регистрации токена устройства Вы должны проверить его с помощью идентификатора устройства (сочетание идентификатора устройства и токена устройства в одной таблице). Поэтому перед сохранением проверьте идентификатор устройства и обновите токен соответственно, чтобы мы могли иметь последний токен устройства для этого устройства. Каждое устройство имеет уникальный идентификатор устройства.

  • Пока пользователь подписывает токен регистратора и идентификатор устройства. Когда пользователь выйдет из системы, просто сделайте токен устройства пустым. Так что в следующий раз мы можем обновить токен устройства на основе идентификатора устройства

Ответ 4

У GCM были некоторые проблемы. Вот почему Google запустил Firebase Cloud Messaging (FCM). Ознакомьтесь с документацией здесь.

Ниже приведен пример кода, который я использовал в своих проектах. Проверьте его с помощью идентификатора устройства Android и ключа сервера FCM.

$data = array(
    'to' => 'XXXXXXXXXXXdevice_idXXXXX',
    "priority" => "high",
    'data' => [
        'title' => 'Test Title',
        'body' => 'Test Body',
    ]
);

$headers = array(
    "Content-Type:application/json"
);

$headers[] = "Authorization:key=XXXXXXSERVER KEYXXXXXXXXXX";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://fcm.googleapis.com/fcm/send");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_TIMEOUT, 5 );
curl_setopt($ch, CURLOPT_HEADER, false);
//curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
$result = curl_exec($ch);

curl_close($ch);

Если вы напечатаете $result variable, вы получите ответ вроде этого. Он сообщит вам, отправлено ли ваше уведомление или нет.

{"multicast_id":6375780930000000095,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:139000000000000cd617fcf9fd7ecd"}]} 

Ответ 5

Ссылайтесь на этот код

<?php

include "connection.php";

$msg = "New jobs for you";
$noti ="Jobsglance";

$sql = "SELECT gcmid FROM gcm";
// Executing the query
$result = mysql_query($sql);
  while($row = mysql_fetch_assoc($result))
  {
$regid[] = $row[gcmid];
}

define( 'API_ACCESS_KEY', 'AI******************' );

$registrationIds = $regid;
// Message Array
$msg = array
(

// <!--Message that we want to send in the push notification-->
'message' => $msg,


// <!--Title that we want to set for the push notification-->
'title' => $noti,

'subtitle' => 'This is a subtitle. subtitle',
'tickerText' => 'Ticker text here...Ticker text here...Ticker text here',

// Sets to true or '1' if we want device to vibrate and make sound when user recieves push notification
'vibrate' => 'default',
'sound' => 'default',
'largeIcon' => 'large_icon',
'smallIcon' => 'small_icon'
);

// RegistrationIds and message are assigned to fields
$fields = array
(
'registration_ids' => $registrationIds,
'data' => $msg
);
$headers = array
(

// Setting headers for API acceess key and content type
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);

// <!--Initializing Curl-->
$ch = curl_init();

curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/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;
 ?>

Ответ 6

Я также столкнулся с той же проблемой. Может быть одно из решений снизу:

  1. Если затронуты только некоторые устройства, удалите приложение с этих устройств, перезапустите эти устройства, а затем снова установите приложение.
  2. Если возникает проблема с несколькими уведомлениями на всех устройствах, проверьте токен устройства из приложения, т.е. Сколько токенов генерируется для одного устройства через приложение.
  3. Проверьте реакцию скручивания. Если ответ GCM является успешным для каждого токена устройства, проверьте, не вызывается ли функция более одного раза для одних и тех же данных. Если в ответе указана недостижимая или аналогичная ошибка, существует вероятность того, что завиток будет повторять попытку непрерывно, но не получит никакого ответа. Попробуйте онлайн-тестер уведомлений, например https://pushtry.com/

Ответ 7

Я понял, что проблема была с моей реализацией Android. Устройство регистрировалось несколько раз.

GCM возвращает тот же идентификатор регистрации для устройства до следующей переустановки. В некоторых случаях, когда срок действия регистрационного идентификатора истекает/недействительный GCM возвращает новый.

Во время нажатия GCM вернет канонический идентификатор регистрации для просроченного/недействительного токена.

Решение состоит в том, чтобы прочитать ответ и обновить старый регистрационный идентификатор новым в БД.

Ответ 8

На стороне приложения в уведомлении получить файл.

со стороны php добавьте уникальный идентификатор в полезную нагрузку уведомления. Когда вы создаете уведомление. затем установите идентификатор уведомления на php Уникальный идентификатор. И установите в качестве ожидающего намерения значение FLAG_UPDATE_CURRENT.

Таким образом, если вы получаете несколько уведомлений. Это добавится по этому.