diff --git a/permissions-notifications/src/iosMain/kotlin/dev/icerock/moko/permissions/notifications/RemoteNotificationPermissionDelegate.kt b/permissions-notifications/src/iosMain/kotlin/dev/icerock/moko/permissions/notifications/RemoteNotificationPermissionDelegate.kt index 0b741a4..7c188d3 100644 --- a/permissions-notifications/src/iosMain/kotlin/dev/icerock/moko/permissions/notifications/RemoteNotificationPermissionDelegate.kt +++ b/permissions-notifications/src/iosMain/kotlin/dev/icerock/moko/permissions/notifications/RemoteNotificationPermissionDelegate.kt @@ -25,10 +25,29 @@ import kotlin.coroutines.suspendCoroutine internal class RemoteNotificationPermissionDelegate : PermissionDelegate { override suspend fun providePermission() { - val currentCenter: UNUserNotificationCenter = UNUserNotificationCenter - .currentNotificationCenter() + return provideNotificationPermission( + getPermissionStatus() + ) + } + + override suspend fun getPermissionState(): PermissionState { + val status: UNAuthorizationStatus = getPermissionStatus() + + return when (status) { + UNAuthorizationStatusAuthorized, + UNAuthorizationStatusProvisional, + UNAuthorizationStatusEphemeral, + -> PermissionState.Granted + + UNAuthorizationStatusNotDetermined -> PermissionState.NotDetermined + UNAuthorizationStatusDenied -> PermissionState.DeniedAlways + else -> error("unknown push authorization status $status") + } + } - val status: UNAuthorizationStatus = suspendCoroutine { continuation -> + private suspend fun getPermissionStatus(): UNAuthorizationStatus { + val currentCenter = UNUserNotificationCenter.currentNotificationCenter() + return suspendCoroutine { continuation -> currentCenter.getNotificationSettingsWithCompletionHandler( mainContinuation { settings: UNNotificationSettings? -> continuation.resumeWith( @@ -39,10 +58,19 @@ internal class RemoteNotificationPermissionDelegate : PermissionDelegate { } ) } + } + + private suspend fun provideNotificationPermission( + status: UNAuthorizationStatus + ) { when (status) { - UNAuthorizationStatusAuthorized -> return + UNAuthorizationStatusAuthorized, + UNAuthorizationStatusProvisional, + UNAuthorizationStatusEphemeral -> return + UNAuthorizationStatusNotDetermined -> { - val isSuccess = suspendCoroutine { continuation -> + // User has not yet chosen permission, request permission + val newStatus = suspendCoroutine { continuation -> UNUserNotificationCenter.currentNotificationCenter() .requestAuthorizationWithOptions( UNAuthorizationOptionSound @@ -51,48 +79,18 @@ internal class RemoteNotificationPermissionDelegate : PermissionDelegate { .or(UNAuthorizationOptionCarPlay), mainContinuation { isOk, error -> if (isOk && error == null) { - continuation.resumeWith(Result.success(true)) + continuation.resumeWith(Result.success(UNAuthorizationStatusAuthorized)) } else { - continuation.resumeWith(Result.success(false)) + continuation.resumeWith(Result.success(UNAuthorizationStatusDenied)) } } ) } - if (isSuccess) { - providePermission() - } else { - error("notifications permission failed") - } + provideNotificationPermission(newStatus) } UNAuthorizationStatusDenied -> throw DeniedAlwaysException(Permission.REMOTE_NOTIFICATION) - else -> error("notifications permission status $status") - } - } - - override suspend fun getPermissionState(): PermissionState { - val currentCenter = UNUserNotificationCenter.currentNotificationCenter() - - val status = suspendCoroutine { continuation -> - currentCenter.getNotificationSettingsWithCompletionHandler( - mainContinuation { settings: UNNotificationSettings? -> - continuation.resumeWith( - Result.success( - settings?.authorizationStatus ?: UNAuthorizationStatusNotDetermined - ) - ) - } - ) - } - return when (status) { - UNAuthorizationStatusAuthorized, - UNAuthorizationStatusProvisional, - UNAuthorizationStatusEphemeral, - -> PermissionState.Granted - - UNAuthorizationStatusNotDetermined -> PermissionState.NotDetermined - UNAuthorizationStatusDenied -> PermissionState.DeniedAlways - else -> error("unknown push authorization status $status") + else -> error("unknown notifications authorization status $status") } } }