2016-07-18 2 views
3

У меня возникла проблема с Firebase "registration_ids". Когда я отправляю запрос от Rest Client, я получаю успешный ответ.Поле "registration_ids" не является массивом JSON (Firebase)

{"multicast_id":4650719213012935695,"success":2,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1468837777484579%214918aff9fd7ecd"},{"message_id":"0:1468837777484484%214918aff9fd7ecd"}]} 

Но когда я вызываю тот же php-скрипт из своего приложения для Android, он дает мне ошибку в ответе. (Я получил ответ в Charles Proxy)

"registration_ids" field is not a JSON array 

Вот мой скрипт

function fetchFirebaseTokenUsers($message) {  
    $query = "SELECT token FROM firebase_tokens"; 
    $fcmRegIds = array(); 
    if($query_run = mysqli_query($this->con, $query)) {   
     while($query_row = mysqli_fetch_assoc($query_run)) { 
      array_push($fcmRegIds, $query_row['token']); 
     } 
    } 

    if(isset($fcmRegIds)) { 
     $pushStatus = $this->sendPushNotification($fcmRegIds, $message); 
    } 
} 

function sendPushNotification($registration_ids, $message) { 

    ignore_user_abort(); 
    ob_start(); 

    $url = 'https://fcm.googleapis.com/fcm/send'; 

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

    define('GOOGLE_API_KEY', 'AIzaSyC.......VdYCoD8A'); 

    $headers = array(
     'Authorization:key='.GOOGLE_API_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_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

    $result = curl_exec($ch); 
    if($result === false) 
     die('Curl failed ' . curl_error()); 

    curl_close($ch); 
    return $result; 
    ob_flush(); 
} 
+0

Не могли бы вы включить код Android? –

ответ

4

Я использовал to вместо отправки массив Firebase лексем в registration_ids. Причина registration_ids, имеющая предел в 1000 наименований огневой базы только https://firebase.google.com/docs/cloud-messaging/http-server-ref.

function fetchFirebaseTokenUsers($message) {  
    $query = "SELECT token FROM firebase_tokens"; 
    $fcmRegIds = array(); 
    if($query_run = mysqli_query($this->con, $query)) {   
     while($query_row = mysqli_fetch_assoc($query_run)) { 
     array_push($fcmRegIds, $query_row['token']); 
     } 
    } 

    if(isset($fcmRegIds)) { 
     foreach ($fcmRegIds as $key => $token) { 
     $pushStatus = $this->sendPushNotification($token, $message); 
     } 
    } 
} 

function sendPushNotification($registration_ids, $message) { 

    ignore_user_abort(); 
    ob_start(); 

    $url = 'https://fcm.googleapis.com/fcm/send'; 

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

    define('GOOGLE_API_KEY', 'AIzaSyC.......VdYCoD8A'); 

    $headers = array(
     'Authorization:key='.GOOGLE_API_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_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

    $result = curl_exec($ch); 
    if($result === false) 
     die('Curl failed ' . curl_error()); 

    curl_close($ch); 
    return $result; 
    ob_flush(); 
} 
+0

change registration_ids to "to" работал для меня – phil

+2

Это будет цикл до 1000 для 1000 пользователей .. не очень хороший подход вообще –

+0

Но 'to' работает для одного токена вправо? – 151291

0

Если б registration_ids вы должны прошли данные в массив следующим образом:

PHP:

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

У меня был подобный сценарий, в котором я должен был создать GCM группу для регистрационные токены пользователя & произошла ошибка. Я понял это позже, что я не следовал corrent формате JSON, указанный на е ire-base

Решение:

Создание модели

public class tempo { 
     public string operation {get;set; } 

     public string notification_key_name { get; set; } 

     public List<string> registration_ids { get; set; } 
    } 

затем сериализовать

var hmm = Newtonsoft.Json.JsonConvert.SerializeObject(obj); 

и сделать почтовый звонок в Google.

Смежные вопросы