У меня есть приложение React Native, которое использует Firebase Cloud Messaging с пакетомact-native-firebase.
Я делаю это на первом экране приложения React Native, поэтому через 5 секунд пользовательбудет отправлен на новый экран, который объясняет, почему push-уведомления полезны, и дает им кнопку для запуска диалога, в котором они могут принять или отклонить разрешение.
setTimeout(() => {
firebase.messaging().hasPermission()
.then(enabled => {
if (enabled) {
// user has permissions
} else {
// user doesn't have permission
this.props.navigation.navigate('EnableNotificationPermissionScreen')
}
});
},
5000);
На экране EnableNotificationPermissionScreen естькнопка, подобная этой:
<Button onPress={this.onSetNotificationPref.bind(this)} title="Set Notification Preference" color="#4ab2fc"/>
, которая обрабатывается таким событием:
onSetNotificationPref() {
firebase.messaging().requestPermission()
.then(() => {
// User has authorized
firebase.analytics().logEvent('messaging_permission_accepted');
this.props.navigation.navigate('App');
})
.catch(error => {
// User has rejected permissions
firebase.analytics().logEvent('messaging_permission_rejected');
this.props.navigation.navigate('App');
});
}
Если пользователь принимает, все работает, как я надеюсь, и у пользователя будет разрешениеи не будет переходить к этому экрану снова.
Однако, если пользователь отклоняет разрешение, я не хочу снова переходить к нему. Как есть, они будут перемещаться туда снова, потому что hasPermission будет ложным. Кроме того, нажатие кнопки для выполнения requestPermission на этом экране ничего не изменит, поскольку ОС заблокирует requestPermission ().
В примерах, которые я видел, requestPermission вызывается всякий раз, когда разрешение не включено (без пользовательскихэкран как этот);и так или всплывает диалоговое окно, или нет. Однако в потоке, которого я пытаюсь достичь, я хочу перейти к этому пользовательскому экрану только , если у пользователя нет разрешения, потому что его не спрашивали. Если их спросили и отклонили, они не должны переходить на этот экран.
Есть ли способ добиться этого с помощью функций в firebase.messaging (), или мне нужно использовать постоянное хранилище, например async? -хранилище, чтобы самостоятельно отслеживать, был ли показан диалог?