Я внедрил реактивную базу-огонь и использую функции облачных сообщений для отправки push-уведомлений нашим пользователям. Он прекрасно работает, пока приложение не будет обновлено. При обновлении из магазинов устройства перестают получать push-уведомления.
Это собственное приложение реагирования, и я использую функцию getToken в firebase в componentDidMount в моем Home-компоненте (первая страница после аутентификации (с использованием реакции-навигации)).
Я думал, что onTokenRefresh-listener обновит токен после обновления, но, очевидно, нет, так как он обновляет только эти действия:
- Приложение удаляет идентификатор экземпляра
- Приложение восстановлено на новом устройстве
- Пользователь удаляет / переустанавливает приложение
- Пользователь очищает данные приложения
// Home-component
componentDidMount(){
this.checkPermission();
}
async checkPermission() {
firebase.messaging().hasPermission()
.then(enabled => {
if (enabled) {
// user has permissions
this.getToken();
this.createNotificationListeners();
} else {
// user doesn't have permission
this.requestPermission();
}
})
.catch(error => {
console.log('Check - Error', error);
});
}
async getToken() {
const value = await AsyncStorage.getItem('fcmToken');
firebase.messaging().getToken().then((fcmToken) => {
if (fcmToken) {
// user has a device token
if(value !== fcmToken){
AsyncStorage.setItem('fcmToken', fcmToken);
this.save_token_to_db(fcmToken);
}
}
})
}
async requestPermission() {
firebase.messaging().requestPermission()
.then(() => {
// User has authorised
this.getToken();
this.createNotificationListeners();
})
}
save_token_to_db = () => {
// just an update-call to our servers
}
async createNotificationListeners() {
this.onTokenRefreshListener =
firebase.messaging().onTokenRefresh(fcmToken => {
this.save_token_to_db(fcmToken);
});
this.notificationDisplayedListener =
firebase.notifications().onNotificationDisplayed((notification:
Notification) => {
});
this.notificationListener =
firebase.notifications().onNotification((notification) => {
const { title, body } = notification;
});
this.notificationOpenedListener =
firebase.notifications().onNotificationOpened((notificationOpen) => {
const { title, body } = notificationOpen.notification;
});
const notificationOpen = await
firebase.notifications().getInitialNotification();
if (notificationOpen) {
const { title, body } = notificationOpen.notification;
}
this.messageListener = firebase.messaging().onMessage((message) => {
});
}
componentWillUnmount(){
this.notificationListener();
this.notificationOpenedListener();
this.onTokenRefreshListener();
this.notificationDisplayedListener();
}
Я ожидал, что onTokenRefreshListener получит обновленный токен при appupdate. Но это не так.
Затем я попытался выполнить getToken для каждого монтирования Home-компонента (убедившись, что это происходит только один раз при каждой загрузке приложения, чтобы минимизировать вызовы (код для этого не включен)), проверяя, не соответствует ли он тому, который сохранен в AsyncStorage. Но это все еще не работает. Push-уведомления работают после переустановки приложения, но не при appupdate.