将推送发送到多个设备时出现无效注册

时间:2017-08-25 09:37:36

标签: php android firebase push-notification

我尝试使用Google Firebase向多台设备发送推送通知,但我总是收到错误:" InvalidRegistration"。

这是我在"中发送的令牌。

 :json_encode($tokensPerEvent): 
 ["eV9g4oTwjZs:APA91bF3YLGtDkCDekvR6eahbVAn-jIY0sVGjxMWyBEyR-
  3AB9q6RBhw4fyeqE4ZkZxQs0TsYhUee9Txy_exAGxtrBPV_-
  sjKlWcV3z3nDYXOcVSVwlpPyGzUJKxGMU16drMR41bLI4t"]

这是回复:

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

另一个问题:如果其中一个令牌不再存在,这会对所有其他令牌产生影响,还是仅影响唯一的旧令牌?

这是我的代码:

<?php
    require_once '../CommonFunctions.php'; 

    ignore_user_abort();
    ob_start();

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

    //GET TOKENS FROM DB
    $db = new Database();
    $db->query("SELECT push_token FROM User");

    $db1 = new Database();
    $db1->query("SELECT phone FROM invite_list where event_id = 137");

    $response = $db->resultset();
    $response1 = $db1->resultset();

    $arr2 = array_column($response1, 'phone');
    $phones = join("','",$arr2);

    $db2 = new Database();   
    $db2->query("SELECT push_token FROM User WHERE phone IN ('$phones')");

    $tokensPerEvent = array();
    $tokensrr = $db2->resultset();
    $tokensPerEvent = array_column($tokensrr, 'push_token');

    echo json_encode($tokensPerEvent);    

    $fields = array('to' => json_encode($tokensPerEvent),
    'notification' => array('body' => 'HI', 'title' => ':)'));


    define('GOOGLE_API_KEY', '***********');

    $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;
?>

1 个答案:

答案 0 :(得分:1)

如果您想通过他们的注册ID向许多客户发送推送通知,则必须使用 registration_ids 而不是字段。您可以在docs(第二个参数)中找到它。

您还要对令牌进行两次编码:

$fields = array('to' => json_encode($tokensPerEvent), ...

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

尝试跳过数组中的$tokensPerEvent编码: $fields = array('to' => $tokensPerEvent, ...