[FCM: 3편]iOS 알림권한

Felix, JooHwan Yeon·2022년 1월 19일
0
post-thumbnail

☕️ 공식문서

iOS에서 파이어베이스를 쓰는 과정에서 앱권한과 관련한 이슈가 매우 중요하게 다뤄지는거 같아 이를 따로 작성해보려고 한다.

🛠 iOS 권한

iOS에서는 사용자가 앱에게 알림권한을 부여하지 않으면 "Notification" 해줄 수 없다.
알림권한의 종류는 세가지인데,

  • granted
  • not determined(default)
  • declined

권한을 부여받기 위해서는 앱을 처음 실행할 때, 권한요청을 보내주어야 한다.

만약, 사용자가 권한요청을 거절한다면 다시 요청할 수 없으며, 사용자가 직접 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

Provisional authorization 은 iOS 12+ 버전부터 지원하고 있으며, 사용자에게 알림권한 요청을 하지 않고 즉각적으로 알림권한이 부여된다.
그러나 알림권한이 무조건적으로 부여되는 만큼, 알림이 기기의 "notification center" 에서만 확인할 수 있다.
즉, 알림이 조용하게 보여지는 것이다.

iOS 설정의 UI 건드리기

iOS 설정에서 특정 앱의 알림설정으로 들어가면, 바로 앱의 내부 설정으로 이동하여 알림 설정을 할 수 있도록 해준다.

  1. providesAppNotificationSettings 부여하기
await messaging().requestPermission({ providesAppNotificationSettings: true });
  1. 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])

}
  1. quit state에서 처리하기
//app.js
const App = () => {
useEffect(() => {
    messaging()
        .getDidOpenSettingsForNotification()
        .then(async didOpenSettingsForNotification => {
            if (didOpenSettingsForNotification) {
                navigate('NotificationsSettingsScreen')
            }
        })
}, [])

    ...
}

다음 포스팅에서는 FCM에서 보낸 메시지를 React Native 앱이 받는 로직을 다뤄볼 것이다.
👉 [FCM: 4편]메시징 사용하기

profile
🚀 세상과 인간이 궁금한 사상가, 그 속에서 가치를 찾는 공학자이자 사업가

0개의 댓글