Я пытаюсь настроить 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"
}