FCM推送通知问题: - "错误":" NotRegistered"

时间:2017-02-15 05:36:45

标签: php android push-notification yii2 firebase-cloud-messaging

我遇到了使用FCM向Android发送推送通知的奇怪问题。

  

目标: - 发送推送通知时出错

以下是我有向Android发送推送通知功能的场景

 public static function SendMultipleNotificationAndroid($groups)
    {
        //your api key SERVER API KEY
        $apiKey = Yii::$app->params['android_api_key'];
        $url = 'https://fcm.googleapis.com/fcm/send';    
        $headers = array(
            'Authorization:key=' . $apiKey,
            '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);

        foreach($groups as $resG){
            $users  = $resG['users'];                        
            $msg    =   $resG['message'];
            $type    =   $resG['notification_type'];
            $notification_data    =   $resG['notification_data'];

            $deviceTokens = [];
            foreach($users as $resUser){
                $deviceTokens[] = $resUser['device_token'];
                //Add  Friend badge count +1
                Common::AddRemoveBadgeCount($resUser['user_id']);
            }
            if(!empty($deviceTokens)){
                $fields = array(
                    'registration_ids' => $deviceTokens,
                    'priority'     => 'high', 
                    'collapse_key' => $resG['notification_type'],   
                    'time_to_live' => 2419200,     
                    "click_action" =>"NotificationListingActivity",     
                    'data'         => [                  
                        "title"             => "ProjectName",
                        "body"              => $resG['message'],
                        "action_tag"        => $resG['notification_type'],
                        "message"           => $resG['message'],
                        'notification_type' => $type,
                        'notification_data' => $notification_data,
                        'sound'             => 'default',
                    ]
                );
                //Print result 
                p($ch,0);
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
                curl_exec($ch);
            }            
        }
        curl_close($ch);
    }

所以问题是当我发送单个通知时工作正常但是当我发送多个通知时我每次都会收到错误

<pre>Resource id #5</pre>{"multicast_id":4818908994630396118,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136045570022%c3bae3c6002e9358"}]}

<pre>Resource id #5</pre>{"multicast_id":5218359780835228544,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136046618669%c3bae3c6002e9358"}]}

当我们调试代码时,我们在数据库中没有设备令牌,没有防火墙停止发送推送通知。

每次我打电话给上面的功能

  

&#34;错误&#34;:&#34; NotRegistered&#34;

任何帮助将不胜感激。

提前致谢。

12 个答案:

答案 0 :(得分:13)

不太了解php,但最近我在另一个项目中遇到了同样的问题而且我已经解决了这个问题:

首先参考: Where can I find the API KEY for Firebase Cloud Messaging?

并获取更新的API密钥,如下面的快照enter image description here

所示

答案 1 :(得分:9)

根据该文档,因为移动设备测试不再安装您的应用程序

  

如果是NotRegistered,您应该从中删除注册ID   您的服务器数据库,因为该应用程序已从中卸载   设备或客户端应用程序未配置为接收消息。

答案 2 :(得分:1)

这是客户端(设备)问题,而不是服务端。 多种情况可能导致此情况:

  • 如果客户端应用注销了GCM。
  • 如果客户端应用程序自动注销,则在用户卸载应用程序时会发生这种情况。例如,在iOS上,如果APNS反馈服务 报告APNS令牌无效。
  • 如果注册令牌已过期(例如,Google可能决定刷新注册令牌,或者iOS设备的APNS令牌已过期)。
  • 如果客户端应用已更新,但新版本未配置为接收消息。

请参见https://developers.google.com/cloud-messaging/http-server-ref

在应用启动时,我检查我本地存储的令牌是否与新令牌匹配。如果没有,则刷新服务器上的令牌。我也在FirebaseInstanceIDService::onTokenRefresh中做到这一点。

答案 3 :(得分:1)

我的问题与上述所有问题都不相同。我们正在尝试的Firebase消息超出了最大容量 4Kb 。触发“未注册”的机会很小。但是问题是我花了一些时间未安装该应用程序的日志。因此,还要检查 Firebase消息的大小。

答案 4 :(得分:1)

在我们的案例中,当我们使用Xcode“运行”覆盖应用的生产安装(用生产调试版本替换生产应用)时,此问题在iOS上出现。

该应用仍然会收到相同的注册令牌,但不接受消息(FCM返回了NotRegistered)。

我们发现从设备上卸载应用程序并执行全新安装可以解决此问题。

答案 5 :(得分:1)

卸载并重新安装应用程序时出现此错误。

我的想法是,当我们重新安装应用程序时,每次安装都无法获得新的fcm令牌。

因此,我们必须首先删除先前的实例ID,然后创建新的fcm令牌。请参见下面的代码。

只需添加未注释的行即可解决我的问题。

有关此解决方案的代码,请参阅第一个评论:)

_firebaseRegister() { 
    // _firebaseMessaging.deleteInstanceID(); 
    _firebaseMessaging.getToken().then((token) => fcmtoken = token); 
}

希望这对您有用! :)

答案 6 :(得分:0)

查看您是否已卸载该应用程序,并且设备令牌已修改。更新设备令牌,您的错误将消失

答案 7 :(得分:0)

在搜索“未注册”问题时,我们发现了以下问题...

在设备端,当用户在安装后首次启动应用程序时,通过以下代码生成一次设备通知令牌。

RegToken = FirebaseInstanceId.getInstance().getToken(senderId, "FCM");  // Old code

我们正在使用派生自“ FirebaseMessagingService”的其他类来创建/接收通知。但是该类中缺少以下方法。

// New code
@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(token);
 }

我们发现,以上方法是在App每次启动时由设备中的FCM系统调用的。 (未卸载该应用程序,仍然该方法每次都提供不同的令牌。)因此我们将方法称为“ sendRegistrationToServer(token);”。将令牌连同“ DeviceId”和其他标识数据一起提交给我们的服务器。当我们从php服务器通过此令牌发送通知时,它返回的是“已发送”,而不是“ NotRegistered”。

答案 8 :(得分:0)

我有一个100%的解决方案,我最近已修复了此问题,此错误的发生是因为您在不包含Firebase设置api密钥的设备上发送此通知,例如,当您注册该用户时,该用户从其他地方注册Firebase设置,因此您的android令牌是不同的,并且您向其他Firebase设置的发送请求没有为其创建要尝试发送通知(消息)的android令牌,因此您必须确保您的用户android令牌是从相同的Firebase项目生成的您正在使用哪一个项目的Firebase API密钥

答案 9 :(得分:0)

问题是Firebase首次运行该应用程序时会为您的目标设备生成一个唯一的设备ID,并用作该设备的标识(如果用户卸载了该应用程序或清除了该应用程序的数据)那么在这种情况下,重新安装或重新打开应用程序时,设备ID会有所不同,firebase无法识别该设备ID以发送通知,这会导致错误未注册

答案 10 :(得分:0)

https://fcm.googleapis.com/fcm/send发送请求时,此错误出现在Android应用程序中:

...
"results": [
    {
        "error": "NotRegistered"
    }
]

虽然应用程序在一段时间内运行良好,并且推送通知已发布,但随后(可能是在应用程序中重新授权或在Play Market中重新授权之后)开始显示错误。

如果我更改了推送令牌(例如,添加了“ 1”),则会出现另一个错误:

"results": [
    {
        "error": "InvalidRegistration"
    }
]

因此,Firebase知道推送令牌,但没有发出通知。

我卸载了Android应用程序,然后再次安装。

答案 11 :(得分:0)

就我而言,更新设备的 FCM 令牌有效!