Pinpoint / FCM возвращает незарегистрированный или просроченный токен - PullRequest
0 голосов
/ 28 февраля 2019

Я использую 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 голосов
/ 06 марта 2019

Редактировать: Ваша ошибка связана с неверным токеном регистрации: убедитесь, что адрес конечной точки совпадает с токеном регистрации, который клиентское приложение получает от регистрации в FCM - https://developers.google.com/cloud-messaging/http-server-ref#error-codes).

Мне удалось заставить его работать после входа в систему с помощьюполучить deviceToken от AsyncStorage.

Если вы хотите сохранить endpointId и обновить только userId (в каждый момент в систему входит только один пользователь - помните, что вы можете отправлять push-уведомления на конкретный 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 работает!Настройте модуль аналитики перед модулем push-уведомлений (https://aws -amplify.github.io / docs / js / push-уведомления # configure-your-app ).У вас есть звонок на PushNotification.configure()?

Насколько я знаю, вам нужно позвонить на PushNotification.onRegister(), чтобы получить действующую активную конечную точку с таргетингом.

Вы тестируете на реальном устройстве?

А что произойдет, если вы не установите атрибуты endpointId и endpoint на amplifyConfig?Он должен обновить адрес вашей конечной точки с помощью device token самостоятельно.Позже вы сможете обновить свою конечную точку с помощью идентификатора пользователя Analytics.updateEndpoint({optOut: 'NONE', UserId: 'xxx'})

ps .: У меня была связанная проблема, и теперь она наконец работает, но я настроил свой бэкэнд с помощью Amplify CLI, поэтому он может немного отличаться

...