Ошибка APNS при передаче на устройство XXXXXXXXXXXXXX со статусом 400 и причиной BadDeviceToken - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь настроить Pu sh Уведомления для приложения RN с использованием Parse Server в качестве бэкэнда. Android работает правильно, но iOS сообщает "Ошибка APNS при передаче на устройство XXXXXXXXXXXXXX со статусом 400 и причиной BadDeviceToken"

Класс установки получает маркер устройства и все данные, которые я отправляю. Токен устройства взят из

let deviceToken;
PushNotificationIOS.addEventListener('register', token => {
deviceToken = token
});

...

async function setInstallationObject(donorId) {
 let installationController = 
 Parse.CoreManager.getInstallationController();

 installationController
 .currentInstallationId()
 .then(function(iid) {
  let installationObject = Parse.Object.extend('_Installation');
  const installation = new installationObject();
  installation.set('GCMSenderId', 'xxxxxxxx');
  installation.set('installationId', iid);
  installation.set('deviceType', iOS ? 'ios' : 'android');
  installation.set('appName', 'MMB');
  installation.set('appIdentifier', DeviceInfo.getBundleId());
  installation.set('channels', []);
  installation.set('timeZone', 'america/los_angeles');
  installation.set('pushType', iOS ? 'APN' : 'GCM');
  installation.set('appVersion', DeviceInfo.getVersion());
  installation.set('deviceToken', deviceToken);
  installation.set('donorId', donorId);
  installation
    .save()
    .then(() => {})
    .catch(() => {});
 }).catch(() => {});
}

Parse настроен с аутентификацией на основе токена (.p8), токен работает на Firebase (я получил тест Pu sh Notification), поэтому я исключаю версию, которая проблема в моем ключе.

Не имеет значения, какую среду я использую, prod или dev, я не вижу уведомлений на каждом из них.

Разбор конфигурации

const express = require('express');
const ParseServer = require('parse-server').ParseServer;
const ParseDashboard = require('parse-dashboard');
const PushAdapter = require('@parse/push-adapter').default;
const path = require('path');
const scheming = require('./helpers/scheming.js');

require('dotenv').config();

const databaseUri = process.env.DATABASE_URI;

if (!databaseUri) {
  console.log('DATABASE_URI not specified, falling back to 
  localhost.');
 }

const pushOptions = {
 ios: {
  token: {
   key: process.env.IOS_key,
   keyId: process.env.IOS_keyId,
   teamId: process.env.IOS_teamId
  },
  topic: process.env.IOS_BundleId,
  production: process.env.IOS_production
 },
 android: {
  apiKey: process.env.Android_APIkey
 }
};

const api = new ParseServer({
 databaseURI: databaseUri, 
 cloud: __dirname+'/cloud/main.js',
 appId: process.env.APP_ID,
 masterKey: process.env.MASTER_KEY,
 serverURL: process.env.SERVER_URL,
 publicServerURL: process.env.SERVER_URL,
 appName: process.env.APP_NAME,
 push: {
  adapter: new PushAdapter(pushOptions)
 }
});

 const dashboardConfig = {
  'allowInsecureHTTP': true,
  'trustProxy': 1,
  'apps': [{
    appId: process.env.APP_ID,
    masterKey: process.env.MASTER_KEY,
    serverURL: process.env.SERVER_URL,
    appName: process.env.APP_NAME
  }],
  'users': [
   {
    'user': process.env.ParseDashboardLogin,
    'pass': process.env.ParseDashboardPass
   }
  ]
 };

Пакеты на сервере

"dependencies": {
 "@parse/push-adapter": "^3.2.0",
 "dotenv": "^8.2.0",
 "express": "^4.17.1",
 "mailgun-js": "^0.22.0",
 "moment": "^2.24.0",
 "moment-business-days": "^1.1.3",
 "parse": "^2.8.0",
 "parse-dashboard": "^2.0.5",
 "parse-server": "^3.9.0",
 "twilio": "^3.37.0"
},
"devDependencies": {
 "csv-parser": "^2.3.2"
}
...