У меня есть приложение iOS, которое работает в магазине приложений. Я могу отправлять push-уведомления на устройства iOS, у которых установлено приложение, но только тогда, когда я отправляю их с консоли Firebase.
Когда я пытаюсь отправить push-уведомления через запрос cURL, ответ с сервера указывает, что я был успешным, но сообщение не получено на устройстве. Я пробовал это как с многоадресными, так и с одиночными получателями.
Я должен упустить что-то более фундаментальное, но я не вижу этого.
Вот мой PHP-код:
<?php // API access key from Google API's Console define( 'API_ACCESS_KEY', 'AI*****4LPGkx8xtDG2tBl*****7KWJfmp1szcA' ); $registrationIds = array( $_GET['id'] ); // prep the bundle $msg = array ( 'message' => 'here is a message. message', 'title' => 'This is a title. title' ); $fields = array ( 'to' => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE", 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $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;
Вот ответ, который я получаю при запуске этого кода:
{ "Multicast_id": 5814921248239922706, "успех": 1, "провал": 0, "canonical_ids": 0, "Результаты": [{ "message_id": "0: 1476193002715692% a4ddee3cf9fd7ecd"}]}
Было два вопроса:
notification
в полезную нагрузку вместо data
В конце я использовал функцию PHP shell_exec()
чтобы вместо этого выполнить запрос cURL поверх SSH. Это не идеально, но он выполнил свою работу.
Пример кода:
shell_exec('curl -X POST --header "Authorization: key=<key here>" --header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"'.$to.'\",\"priority\":\"high\",\"notification\":{\"body\": \"'.stripslashes($message).'\"}}"');
Из документации Firebase у вас есть выбор использования данных или уведомлений в полезной нагрузке сообщения. Но когда вы используете данные , вы несете ответственность за обработку получения уведомления самостоятельно. Другими словами, он не будет отправлен сразу вашему клиенту приложения. Вы обрабатываете его в didReceiveRemoteNotification: для ios и onMessageReceived () в случае Android .
Если, однако, вы используете уведомление в полезной нагрузке, firebase отправит сообщение прямо вашему клиентскому приложению.
Вот почему вы не получите сообщение (если вы использовали данные ), даже если ваш запрос на завивание говорит вам, что ему удалось выполнить запрос.
Попробуйте добавить {priority: high}
$fields = array ( 'to' => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE", 'data' => $msg, 'priority' =>'high' );