Ionic Cordova iOS — разрешение на получение push-уведомлений по одному сигналу, возобновленное в фоновом режиме, не работает должным образом

#android #ios #ionic-framework #onesignal #cordova-ios

#Android #iOS #ionic-framework #OneSignal #Cordova-iOS

Вопрос:

Я хочу проверить, отключил ли пользователь разрешение на push-уведомления в настройках устройства как для iOS, так и для Android, каждый раз во время запуска приложения и возобновления работы в фоновом режиме. Если пользователь отклонил разрешение на уведомления, я отправлю пользователю предупреждающее сообщение. Я использовал один Signal SDK для реализации этой функции.

iOS

  • Я использую функцию addPermissionObserver для проверки принятия или отклонения пользователем запроса разрешения
  • Впоследствии я использую функцию getPermissionSubscriptionState, чтобы проверить, разрешил ли пользователь разрешение на уведомление в настройках устройства.

Android

  • Я использую функцию getPermissionSubscriptionState, чтобы проверить, разрешил ли пользователь разрешение на уведомление в настройках устройства.

Я тестировал для Android, он работает отлично. Однако я столкнулся с проблемой для iOS при отображении всплывающего предупреждения пользователю, если у него запрещено разрешение на уведомления.

Воспроизведите шаги, как показано ниже

Тестовый пример 1

  1. Принять запрос на получение разрешения
  2. Поместите приложение в фоновый режим
  3. Перейдите в настройки устройства и отключите разрешение на уведомления
  4. Возобновление работы приложения из фонового режима
  5. Всплывающее предупреждение не отображается
  6. Поместите приложение в фоновый режим
  7. Возобновление работы приложения из фонового режима
  8. Отображение только всплывающего предупреждения

Тестовый пример 2

  1. Отклонить запрос на разрешение
  2. Поместите приложение в фоновый режим
  3. Перейдите в настройки устройства и включите разрешение на уведомления
  4. Возобновление работы приложения из фонового режима
  5. Всплывающее предупреждение по-прежнему отображается
  6. Поместите приложение в фоновый режим
  7. Возобновление работы приложения из фонового режима
  8. Всплывающее предупреждение больше не отображается

В моем коде, как показано ниже, я реализовал функции в App.Component.ts

 export class AppComponent {
    firstLaunch = false;


    constructor(
        private platform: Platform,
        private alertController: AlertController,
        private storage: Storage
        ) {
        this.initializeApp();
    }

    initializeApp() {
        this.platform.ready().then(() => {
            this.checkNotificationPermission();
        });

        this.platform.resume.subscribe((result) => {
            this.checkNotificationPermissionState();
        });
    }

    checkNotificationPermission() {
        this.storage.get('firstLaunch').then(value => {
            this.firstLaunch = value;

            if (this.firstLaunch) {
                this.checkNotificationPermissionState();
            } else {
                //First time launch and update the flag
                this.storage.set('firstLaunch', true).then(() => {
                    if (this.platform.is('ios')) {
                        //User accept or decline the permission prompt
                        this.oneSignal.addPermissionObserver().subscribe(async data => {
                            if (data.to.status == 1) {
                                const alert = await this.alertController.create({
                                    header: 'Test',
                                    mode: 'ios',
                                    message: 'You have disallowed',
                                    buttons: ['Ok']
                                });
                                alert.present();
                            }
                        });
                    }
                });
            }
        });
    }

    checkNotificationPermissionState() {
        this.oneSignal.getPermissionSubscriptionState().then(async status => {
            //iOS only: Integer: 0 = Not Determined, 1 = Denied, 2 = Authorized
            //Android only: Integer: 1 = Authorized, 2 = Denied
            if (status.permissionStatus.state == 2 || status.permissionStatus.status == 1) {
                const alert = await this.alertController.create({
                    header: 'Test',
                    mode: 'ios',
                    message: 'You have disallowed',
                    buttons: ['Ok']
                });
                alert.present();
            }
        }).catch(respError => {
        });
    }
}