精确/ FCM返回未注册或已过期的令牌

时间:2019-02-28 17:28:06

标签: amazon-web-services firebase-cloud-messaging react-native-fcm aws-pinpoint

我正在使用Pinpoint通过FCM推送通知,并且收到了来自AWS的错误:

{
    "ApplicationId": "xxx",
    "RequestId": "yyy",
    "EndpointResult": {
        "5551212": {
            "DeliveryStatus": "PERMANENT_FAILURE",
            "StatusCode": 410,
            "StatusMessage": "{\"errorMessage\":\"Unregistered or expired token\",\"channelType\":\"GCM\",\"pushProviderStatusCode\":\"200\",\"pushProviderError\":\"InvalidRegistration\",\"pushProviderResponse\":\"{\\\"multicast_id\\\":752174934090126,\\\"success\\\":0,\\\"failure\\\":1,\\\"canonical_ids\\\":0,\\\"results\\\":[{\\\"error\\\":\\\"InvalidRegistration\\\"}]}\"}",
            "Address": "userID"
        }
    }

奇怪的是,在启动/加载应用程序时,Amplify.config也不会调用PushNotification.onRegister函数:

const amplifyConfig = {
      Auth: {
        identityPoolId: POOL_ID,
        region: 'us-east-1'
      },
      Analytics: {
        AWSPinpoint: {
              appId: APP_ID,
              region: 'us-east-1',
              mandatorySignIn: false,
              endpointId: '5551212',
              endpoint: { 
                address: 'userID',
                channelType: 'GCM',
                optOut: 'NONE'
              }
        }
      }
    }

    PushNotification.onRegister(t => console.log(`Registration token: ${t}`), onRegister && onRegister());
    PushNotification.onNotification(n => (console.log(n), onNotification && onNotification(n)));
    PushNotification.onNotificationOpened(n => (console.log(n), onNotificationOpened && onNotificationOpened(n)));
    Amplify.configure(amplifyConfig);

1 个答案:

答案 0 :(得分:0)

编辑:您的错误似乎与无效注册令牌有关:确保端点地址与客户端应用从FCM注册-https://developers.google.com/cloud-messaging/http-server-ref#error-codes收到的注册令牌相匹配。

我设法通过登录deviceToken获得AsyncStorage使之正常运行。

如果您想保留endpointId并仅更新userId(每次只有一个用户登录-请记住,您可以向特定userId发送推送通知,该通知可以有多个端点(设备,电子邮件,电话号码):

try {
  const deviceToken = await AsyncStorage.getItem('push_token'+aws_exports.aws_mobile_analytics_app_id)
  if (deviceToken !== null) {
    console.log('device token from AsyncStorage', deviceToken)
    Analytics.updateEndpoint({
      optOut: 'NONE',
      channelType: 'GCM',
      userId: userId,
      address: deviceToken,
    })
  }
} catch (error) {
  console.log('error retrieving device token from AsyncStorage', error)
}

或者,如果您想指定自己的endpointId(通过这种方式,您可以在同一设备中拥有多个用户/端点):

try {
  const deviceToken = await AsyncStorage.getItem('push_token'+aws_exports.aws_mobile_analytics_app_id)
  if (deviceToken !== null) {
    console.log('device token from AsyncStorage', deviceToken)
    Analytics.configure({
      disabled: false,
      AWSPinpoint: {
        appId: aws_exports.aws_mobile_analytics_app_id,
        region: aws_exports.aws_mobile_analytics_app_region,
        endpointId: endpointId,
        endpoint: {
          address: deviceToken,
          channelType: 'GCM',
          optOut: 'NONE',
          userId: userId
        }
      }
    })
    Analytics.updateEndpoint({
      optOut: 'NONE',
    })
  }
} catch (error) {
  console.log('error retrieving device token from AsyncStorage', error)
}

首先,使用window.LOG_LEVEL='DEBUG'

检查调试消息

然后,确保Analytics(分析)正常工作!在“推送通知”模块(https://aws-amplify.github.io/docs/js/push-notifications#configure-your-app)之前配置Analytics(分析)模块。您有打给PushNotification.configure()的电话吗?

据我所知,您需要调用PushNotification.onRegister()才能获得有效的活动可定位端点。

您要在真实设备中进行测试吗?

如果您没有在endpointId上设置endpointamplifyConfig属性,会发生什么?它应自行使用device token更新端点地址。您以后可以使用用户ID Analytics.updateEndpoint({optOut: 'NONE', UserId: 'xxx'})

更新端点

ps .:我遇到了一个相关问题,现在终于可以工作了,但是我使用Amplify CLI设置了后端,因此可能有些不同