#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
- Принять запрос на получение разрешения
- Поместите приложение в фоновый режим
- Перейдите в настройки устройства и отключите разрешение на уведомления
- Возобновление работы приложения из фонового режима
- Всплывающее предупреждение не отображается
- Поместите приложение в фоновый режим
- Возобновление работы приложения из фонового режима
- Отображение только всплывающего предупреждения
Тестовый пример 2
- Отклонить запрос на разрешение
- Поместите приложение в фоновый режим
- Перейдите в настройки устройства и включите разрешение на уведомления
- Возобновление работы приложения из фонового режима
- Всплывающее предупреждение по-прежнему отображается
- Поместите приложение в фоновый режим
- Возобновление работы приложения из фонового режима
- Всплывающее предупреждение больше не отображается
В моем коде, как показано ниже, я реализовал функции в 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 => {
});
}
}