거의 모든 앱에 푸시가 들어가고, FCM을 사용한다
당연하게도 Push에 대한 권한 작업을 해줘야한는데
IOS
Android < SDK 33
Android >= SDK 33
보통 세 타입으로 구분 한다
/ | 첫 설치시 권한 | 사용자 Alert | Has Permanently Denied | 권한 확인 / 획득 |
---|---|---|---|---|
IOS | X | 첫 한번만 O | X | FirebaseMessaging |
ANDROID < 33 | O | X | X | FirebaseMessaging |
ANDROID >= 33 | X | 첫 두번만 O | O | Permission Handler |
우선 IOS와 ANDROID < 33에는 Permanently Denied 권한이 없다.
즉 아래 두개를 통해 얻고, 요청 결과 받는 Permission을 그대로 쓰면 되고
아래 두 경우에는
해서
상태 | 호출 |
---|---|
AuthorizationStatus.notDetermined | FirebaseMessaging.instance.requestPermission |
AuthorizationStatus.denied | AppSettings.openAppSettings(type: AppSettingsType.notification) |
AuthorizationStatus.authorized | Authorized |
AuthorizationStatus.provisional | Authorized |
로 사용 하면 된다.
하지만 ANDROID >= 33 에서는 조금 다르다. 이제 다른 Android
Permission들 처럼 Permanently Denied 를 처리 해줘야한다.
// AndroidManifest.xml
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS"
android:minSdkVersion="33" />
// app level gradle
android {
defaultConfig {
targetSdkVersion 33
앱 실행시 초기 상태 값 가져오기
IOS 나 ANDROID < 33 에서는 FirebaseMessaging.instance.getNotificationSettings로
가져오면 됐지만. 이제는 안된다. AuthorizationStatus에 Permanently Denied가 없기 때문에
권한 요청시 request를 할지 / AppSetting으로 이동해야 할지 모르기 때문이다...
하여 적절한 시점(보통 앱 초기화 끝 or 홈 화면 진입) 시에
(DeviceInfo - https://pub.dev/packages/device_info_plus)
if (Platform.isAndroid) {
final int sdkInt = (await DeviceInfoPlugin().androidInfo).version.sdkInt;
if (sdkInt >= 33) {
Permission.notification.request()
}
}
를 통해 초기 상태 값을 가져와야 한다. 당연히 request이기 때문에
이미 Permanently Denied가 아니라면, 허용 권한 알림 상자를
보여줄 것이다. 싫지만 다른 방법이 없다... 혹 아시는분 ?
권한 요청하기
마찬가지로 Permission.notification.request()를 통해 권한 요청도 해야한다.