我正在使用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);
答案 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
上设置endpoint
和amplifyConfig
属性,会发生什么?它应自行使用device token
更新端点地址。您以后可以使用用户ID Analytics.updateEndpoint({optOut: 'NONE', UserId: 'xxx'})
ps .:我遇到了一个相关问题,现在终于可以工作了,但是我使用Amplify CLI设置了后端,因此可能有些不同