iOS에서 파이어베이스를 쓰는 과정에서 앱권한과 관련한 이슈가 매우 중요하게 다뤄지는거 같아 이를 따로 작성해보려고 한다.
iOS에서는 사용자가 앱에게 알림권한을 부여하지 않으면 "Notification" 해줄 수 없다.
알림권한의 종류는 세가지인데,
권한을 부여받기 위해서는 앱을 처음 실행할 때, 권한요청을 보내주어야 한다.
만약, 사용자가 권한요청을 거절한다면 다시 요청할 수 없으며, 사용자가 직접 iOS 설정에서 변경해야 한다.
권한은 requestPermission
를 통해 요청할 수 있다.
사용자가 한번 권한상태를 설정하고 나면, iOS는 다시 권한 다이얼로그를 띄우지 않고 사용자가 온전히 앱의 알림권한을 통제할 수 있도록 한다.
import messaging from '@react-native-firebase/messaging';
async function requestUserPermission() {
const authStatus = await messaging().requestPermission();
const enabled =
authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
authStatus === messaging.AuthorizationStatus.PROVISIONAL;
if (enabled) {
console.log('Authorization status:', authStatus);
}
}
requestPermission()
에서 자체적으로 권한요청이 있었는지 판별하고, 있다면 다시 요청하지 않는 로직이 담겨있는 것으로 보인다.
requestPermission()
은 파라미터로 세부적인 알림의 설정이 담긴 객체를 전달할 수 있다.
await messaging().requestPermission({
sound: false,
announcement: true,
// ... other permission settings
});
alert(true)
: 유저의 디바이스에 알림을 보여줄 것이냐announcement(false)
: 에어팟과 연동되어 있을 때, 시리가 알림을 읽어줄 수 있느냐badge(true)
: 읽지 않은 알림을 앱아이콘에 띄울 것이냐carPlay(true)
: 기기가 CarPlay와 연결되어있을 때 알림을 띄울 것이냐provisional(false)
: provisional 권한을 부여할 것이냐sound(true)
: 알림이 보여질 때 소리를 낼 것이냐이러한 세부적인 설정들은 iOS 설정에서 확인할 수 있다.
특정 상황에서 알림권한을 읽어오고 싶을 때가 있다.
import messaging from '@react-native-firebase/messaging';
async function checkApplicationPermission() {
const authorizationStatus = await messaging().requestPermission();
if (authorizationStatus === messaging.AuthorizationStatus.AUTHORIZED) {
console.log('User has notification permissions enabled.');
} else if (authorizationStatus === messaging.AuthorizationStatus.PROVISIONAL) {
console.log('User has provisional notification permissions.');
} else {
console.log('User has notification permissions disabled');
}
}
이 때, 부여된 권한의 값을 정수로 반환해주게 된다.
-1
= messaging.AuthorizationStatus.NOT_DETERMINED
0
= messaging.AuthorizationStatus.DENIED
1
= messaging.AuthorizationStatus.AUTHORIZED
2
= messaging.AuthorizationStatus.PROVISIONAL
Provisional authorization 은 iOS 12+ 버전부터 지원하고 있으며, 사용자에게 알림권한 요청을 하지 않고 즉각적으로 알림권한이 부여된다.
그러나 알림권한이 무조건적으로 부여되는 만큼, 알림이 기기의 "notification center" 에서만 확인할 수 있다.
즉, 알림이 조용하게 보여지는 것이다.
iOS 설정에서 특정 앱의 알림설정으로 들어가면, 바로 앱의 내부 설정으로 이동하여 알림 설정을 할 수 있도록 해준다.
providesAppNotificationSettings
부여하기await messaging().requestPermission({ providesAppNotificationSettings: true });
background state
에서 처리하기//index.js
import { AppRegistry } from 'react-native'
import messaging from '@react-native-firebase/messaging'
messaging().setOpenSettingsForNotificationsHandler(async () => {
//MMKV 패키지가 무엇일까..
MMKV.setBool(openSettingsForNotifications, true)
})
AppRegistry.registerComponent(appName, () => App)
//app.js
const App = () => {
const [openSettingsForNotifications] = useMMKVStorage('openSettingsForNotifications', MMKV, false)
useEffect(() => {
if (openSettingsForNotifications) {
navigate('NotificationsSettingsScreen')
}
}, [openSettingsForNotifications])
}
quit state
에서 처리하기//app.js
const App = () => {
useEffect(() => {
messaging()
.getDidOpenSettingsForNotification()
.then(async didOpenSettingsForNotification => {
if (didOpenSettingsForNotification) {
navigate('NotificationsSettingsScreen')
}
})
}, [])
...
}
다음 포스팅에서는 FCM에서 보낸 메시지를 React Native 앱이 받는 로직을 다뤄볼 것이다.
👉 [FCM: 4편]메시징 사용하기