Отправка уведомлений FCM Push на определенные устройства в приложении для Android с использованием запроса MySQL в качестве идентификации из сценария PHP - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу отправлять push-уведомления FCM конкретным пользователям Android только с использованием их токена, сохраненного в базе данных mysql, для идентификации. вот мой текущий прогресс

Код фрагмента сценария PHP: Report_Status.php (файл 1)

//Gets the token of every user and sends it to Push_User_Notification.php 
while ($User_Row = mysqli_fetch_array($Retrieve_User, MYSQLI_ASSOC)){
            $User_Token = $User_Row['User_Token'];
            include "../Android_Scripts/Notifications/Push_User_Notification.php";
            $message = "Your Report has been approved! Please wait for the fire fighters to respond!";
            send_notification($User_Token, $message);
        }

PHP-код для файла 2: Push_User_Notification.php

<?php  //Send FCM push notifications process
include_once("../../System_Connector.php");

function send_notification ($tokens, $message)
{
    $url = 'https://fcm.googleapis.com/fcm/send';
    $fields = array(
         'registration_ids' => $tokens,
         'data' => $message
        );
    $headers = array(
        'Authorization:key = API_ACCESS_KEY',
        'Content-Type: application/json'
    );

   $ch = curl_init();
   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_SSL_VERIFYHOST, 0);  
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
   $result = curl_exec($ch);           
   if ($result === FALSE) {
       die('Curl failed: ' . curl_error($ch));
   }
   curl_close($ch);
}

?>

Проблема:

Страница всегда застревает в Report_Status.php каждый раз, когда я запускаю скрипт. Он должен войти в Push_User_Notification и вернуться к Report_Status после завершения процесса. Я ошибаюсь в реализации вызова Push_User_Notification.php или параметры получения Push_User_Notification.php

приписка

Вот мой полный исходный код Report_Status.php на тот случай, если кто-нибудь захочет его проверить: Report_Status.php

1 Ответ

0 голосов
/ 12 ноября 2018

Думаю, проблема в том, что вы отправляете множество уведомлений на несколько устройств в короткие сроки. Я думаю, что это может быть воспринято как спам. Я предлагаю отправить одно уведомление на несколько устройств.

Попробуйте изменить код в report_status.php на этот.

include "../Android_Scripts/Notifications/Push_User_Notification.php";
$message = "Your Report has been approved! Please wait for the fire fighters to respond!";
while ($User_Row = mysqli_fetch_array($Retrieve_User, MYSQLI_ASSOC)){
    $User_Token[] = $User_Row['User_Token'];
}
$tokens = implode(",", $User_Token);
send_notification($tokens, $message);

Идея состоит в том, что вы будете собирать пользовательские токены в массиве $User_Token[]. Затем вам нужно разделить токены запятыми и отправить сообщение один раз всем устройствам, которые связаны с токенами. FCM позволяет отправлять сразу несколько токенов.

обновлен

$User_Token должен быть массивом. так что снимите взрыв. Это была моя ошибка.

Во-вторых, $message должен иметь следующий формат.

$message = array(
    'title' => 'This is a title.',
    'body' => 'Here is a message.'
);

Также следует отметить, что существует 2 типа сообщений, которые вы можете отправлять с помощью FCM. Уведомления или сообщения данных. Подробнее здесь: https://firebase.google.com/docs/cloud-messaging/concept-options

Я не знаю, обрабатывает ли ваше приложение получение сообщений (я не знаю, реализовали ли вы метод onMessageRecieve), поэтому я, вероятно, предложил бы внести небольшое изменение в массив $fields в функции send_notification. Добавление поля уведомлений позволяет Android обрабатывать уведомления автоматически, если ваше приложение находится в фоновом режиме. Поэтому убедитесь, что ваше приложение находится в фоновом режиме при тестировании. https://firebase.google.com/docs/cloud-messaging/android/receive

$fields = array(
    'registration_ids' => $tokens,
    'data' => $message,
    'notification' => $message
);

Так что попробуйте код ниже. Я пробовал и проверял. Меня устраивает. Если это не работает. В send_notification функция echo $ result возвращает сообщение об ошибке. echo $result = curl_exec($ch); Тогда мы можем работать оттуда, чтобы увидеть, что не так. Вы можете увидеть, что означают ошибки здесь: https://firebase.google.com/docs/cloud-messaging/http-server-ref#error-codes

include "../Android_Scripts/Notifications/Push_User_Notification.php";
$message = array(
    'title' => 'Report Approved',
    'body' => 'Your Report has been approved! Please wait for the fire fighters to respond!'
);
while ($User_Row = mysqli_fetch_array($Retrieve_User, MYSQLI_ASSOC)){
    $User_Token[] = $User_Row['User_Token'];
}
send_notification($User_Token, $message);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...