FCM InvalidRegistration

时间:2017-06-24 10:14:30

标签: php firebase-realtime-database firebase-authentication firebase-cloud-messaging

我正在开发一个使用FCM REST API发送通知的应用。 但是当我发送通知时,我总是得到相同的错误InvalidRegistration。 当我用Google搜索问题时,我知道问题出在注册令牌格式中。所以我想确定我是否发送了正确的令牌。 我所做的是验证用户身份并返回身份验证请求。

{
    "kind": "identitytoolkit#VerifyPasswordResponse",
    "localId": "sQFWGMTlRvd8XgbxC9T6UyyKKNW2",
    "email": "01026525200@zeal.com",
    "displayName": "",
    "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjljYjU0Zjc4OTczNTU4NjU5ZTMxNGFkYzhjMTRkYzVmNjUyMTZmZmQifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vemVhbC1kZXYiLCJhdWQiOiJ6ZWFsLWRldiIsImF1dGhfdGltZSI6MTQ5ODI5ODUxNywidXNlcl9pZCI6InNRRldHTVRsUnZkOFhnYnhDOVQ2VXl5S0tOVzIiLCJzdWIiOiJzUUZXR01UbFJ2ZDhYZ2J4QzlUNlV5eUtLTlcyIiwiaWF0IjoxNDk4Mjk4NTE3LCJleHAiOjE0OTgzMDIxMTcsImVtYWlsIjoiMDEwMjY1MjUyMDBAemVhbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZW1haWwiOlsiMDEwMjY1MjUyMDBAemVhbC5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ.Uuuy7566wziSjp001WD_OwG2OdrsggwbuftCnsdpKTicVKArdayEVGq4-pBNsQOZKYNrhpTmiv86d_lbGeeuu9LNJX0xwjvslGA2EffdS1Vaf_OaBrwlp9rllTdXsIEp5wSpPUX_jSa2dck0lpU5bNPVAPjfw6_q4kmKkf6pMzjKLogGvJmtRJOuA5LMFIbJGrs57QIJfbDbghvG-etYAorgRIXwM1Xfg2eYD5s7sItwv0h9hitkH2R_Fy1yJuml51nbA6GT93YyE05QYowfmrymbfYOCYtOsfdkdL6iU0CLH8I0Cw7sQhGIx1iuQl1Wv5aNN2Z4QAiKERpt2VJ_Hw",
    "registered": true,
    "refreshToken": "ACXxpGEB6dkyDsmRVkaXrTshqAhQPZCSVC8kofhypeWDP473zIIOZQpAF_cMEQP6CaOB2PnyDiYX3cJdYAcG2Wcpyzcpij3s2TauyiaKqfYTy76EtvHDGZrW-FyHXc9fX1sRZWbW4uhslrEZ_tYy2axolmc7g3ZPfWAidqHjEjIzqS2moJTM5lXuvxBRlpZQcNXQFOGtr8E8",
    "expiresIn": "3600"
}

所以我使用idToken发送通知。这是对的还是我做错了什么。

2 个答案:

答案 0 :(得分:1)

您使用的idToken似乎不是FCM的有效注册令牌,因此InvalidRegistration错误。

您提到该值(idToken)来自身份验证后的响应,这可能就是它的原因。根据我对auth的了解,通常只是识别会话并在特定间隔(expiresIn)之后过期。

对于FCM,作为目标的所需值是通过调用getToken从客户端生成的实际令牌。来自docs

  

检索当前注册令牌

     

当您需要检索当前令牌时,请调用getToken。未授予权限时,此方法返回null。否则,它会返回一个令牌或因错误而拒绝承诺。

  // Get Instance ID token. Initially this makes a network call, once retrieved
  // subsequent calls to getToken will return from cache.
  messaging.getToken()
  .then(function(currentToken) {
    if (currentToken) {
      sendTokenToServer(currentToken);
      updateUIForPushEnabled(currentToken);
    } else {
      // Show permission request.
      console.log('No Instance ID token available. Request permission to generate one.');
      // Show permission UI.
      updateUIForPushPermissionRequired();
      setTokenSentToServer(false);
    }
  })
  .catch(function(err) {
    console.log('An error occurred while retrieving token. ', err);
    showToken('Error retrieving Instance ID token. ', err);
    setTokenSentToServer(false);
  });
}

生成的令牌通常采用以下格式:

 <InstanceID>:<Actual token>

e.g:

 abcd1234:abcdefg123456

仔细检查您是否真的是生成令牌的正确方法。

答案 1 :(得分:0)

我也遇到了这个问题。问题是我在数据库表中的设备令牌列长度。当我将其更改为255时,它可以工作。