Asking Permission to Use Notifications

Panther·2021년 8월 17일
0

https://developer.apple.com/documentation/usernotifications/asking_permission_to_use_notifications

"Request permission to display alerts, play sounds, or badge the app’s icon in response to a notification."

노티피케이션의 응답으로 알림, 소리 재생, 앱의 아이콘에 badge를 다는 것에 대한 요청 허용입니다.

Overview

로컬 및 원격 노티피케이션은 알림, 소리 재생, 앱의 아이콘에 badge를 다는 것을 표시해서 사용자의 주의를 가져옵니다. 이와 같은 상호작용은 앱이 실행중이지 않거나 백그라운드에 있을 때 발생합니다. 이들은 사용자가 앱이 사용자와 관련이 있는 정보를 갖고 있음을 알 수 있도록 해줍니다. 사용자가 노티피케이션 기반 상호작용이 불편하다고 느낄 수 있기 때문에 이들을 사용함에 있어 허용을 받아야 합니다.

Explicitly Request Authorization in Context

권한을 요청하려면 공유된 UNUserNotificationCenter 인스턴스를 가져오고 이 인스턴스의 requestAuthorization(options:completionHandler:) 메소드를 호출해야 합니다. 사용하고자 하는 모든 상호작용 타입을 구체화해야 합니다. 예를 들어 알림, 앱 아이콘에 badge 추가, 소리 재생을 표시하기 위해 권한을 요청할 수 있습니다.

let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
    
    if let error = error {
        // Handle the error here.
    }
    
    // Enable or disable features based on the authorization.
}

앱이 처음으로 이 권한 요청을 하면 시스템은 사용자에게 승인 혹은 거절할 것을 프롬프트하고 사용자의 응답을 기록합니다. 후속 권한 요청은 사용자에게 프롬프트되지 않습니다.

사용자가 왜 앱이 권한을 요구하는지 파악할 수 있도록 컨텍스트를 갖고 요청해야 합니다. 리마인더 노티피케이션을 보내는 작업을 추적하는 앱에서 사용자가 첫 번째 작업을 스케줄링한 후 요청을 만들 수 있습니다. 컨텍스트를 갖고 요청을 보내는 것은 처음 launch에서 권한을 자동으로 요청하는 것보다 더 나은 사용자 경험을 제공합니다. 왜냐하면 사용자는 노티피케이션이 제공하고자 하는 목적이 무엇인지 더 쉽게 볼 수 있기 때문입니다.

Use Provisional Authorization to Send Trial Notifications

노티피케이션을 보내기 위한 허용을 명시적으로 요청하면, 사용자는 앱으로부터 노티피케이션을 보기 전에 허용에 대한 승인 및 거절을 결정해야 합니다. 권한 요청 전에 신중하게 컨텍스트를 설정했을지라도 사용자는 의사결정을 하기에 충분한 정보를 갖지 못할 수 있고, 그러면 권한을 거절할 것입니다.

노티피케이션을 보내기 위해서 시도적인 기반으로 임시 권한을 사용하시기 바랍니다. 그러면 사용자는 노티피케이션을 평가할 수 있고 권한을 줄 것인지 여부를 결정할 수 있습니다. 시스템은 임시 노티피케이션을 조용히 보냅니다(사용자를 소리 혹은 배너로 방해하지 않으며, 잠근 화면에서도 나타나지 않습니다). 대신 노티피케이션 센터의 히스토리에서만 나타납니다. 이러한 노티피케이션은 사용자가 노티피케이션을 지속하거나 끌 수 있는 프롬프트인 버튼을 포함할 수 있습니다.

사용자가 유지 버튼을 누르면 시스템은 영구적 혹은 조용한 노티피케이션을 선택할 수 있도록 프롬프트합니다. 사용자가 영구적인 노티피케이션을 선택하면 앱은 임시 권한에 대한 요청에 포함된 모든 권한을 갖습니다. 사용자가 조요한 노티피케이션을 받길 선택하면 시스템은 노티피케이션 전송에 대한 권한을 갖지만, 알림, 소리 재생, 앱 아이콘에 badge를 추가하는 것을 드러낼 승인은 주지 않습니다. 노티피케이션은 노티피케이션 센터 히스토리에만 나타납니다.

사용자가 끄기 버튼을 누르면 시스템은 추가적인 노티피케이션 전송을 위한 권한을 거부하기 전에 사용자의 선택을 받아들입니다. 임시 권한을 요청하려면 노티피케이션을 보내기 위한 허용 요청 시 임시 옵션을 추가하시기 바랍니다.

let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge, .provisional]) { granted, error in
    
    if let error = error {
        // Handle the error here.
    }
    
    // Provisional authorization granted.
}

명시적으로 권한을 요청하는 것과 다르게 이 코드는 노티피케이션을 받기 위한 승인을 사용자에게 프롬프트하지 않습니다. 대신 처음 이 메소드를 호출하면, 이 메소드는 자동으로 권한을 승인합니다. 그러나 사용자가 노티피케이션에 대해 명시적으로 유지 혹은 끄기를 선택하기까지 권한 상태는 UNAuthorizationStatus.provisional입니다. 사용자가 어느 시점에서라도 권한 상태를 변경시킬 수 있기 때문에 로컬 노티피케이션 스키줄링 전에 상태를 확인해야 합니다.

추가적으로, 임시 권한을 요청하는 경우 앱이 처음 launch될 때 권한을 요청할 수 있습니다. 사용자는 실제로 노티피케이션을 받을 때, 노티피케이션에 대한 유지 혹은 끄기만을 요청받을 수 있습니다.

Customize Notifications Based on the Current Authorizations

로컬 노티피케이션을 스케줄링하기 전에 앱의 권한 상태를 항상 확인하시기 바랍니다. 사용자는 앱의 권한 설정을 언제든 변경시킬 수 있습니다. 사용자는 앱에 의해 허용된 상호작용의 타입을 변경할 수도 있습니다(앱이 보내는 노티피케이션의 수 혹은 타입을 변경시도록 하는).

사용자에게 최선의 경험을 제공하려면 노티피케이션 센터의 getNotificationSettings(completionHandler:) 메소드를 호출해서 현재 노티피케이션 설정을 가져오시기 바랍니다. 이후 이 설정에 기반해 노티피케이션을 커스터마이징하시기 바랍니다.

let center = UNUserNotificationCenter.current()
center.getNotificationSettings { settings in
    guard (settings.authorizationStatus == .authorized) ||
          (settings.authorizationStatus == .provisional) else { return }

    if settings.alertSetting == .enabled {
        // Schedule an alert-only notification.
    } else {
        // Schedule a notification with a badge and sound.
    }
}

위 예시는 guard 조건을 사용해서 앱이 권한을 갖지 않는 경우 노티피케이션의 스케줄링을 방지하고 있습니다. 이후 코드는 허용된 상호작용의 타입에 기반해 노티피케이션을 설정합니다. 가능한 알림 기반의 노티피케이션의 사용을 선호하고 있습니다.

그러나 앱이 몇 가지 상호작용에 권한이 없음에도 알림, 소리, badge 정보를 갖는 노티피케이션을 설정하길 원할 수도 있습니다. 시스템은 UNNotificationSettings 인스턴스의 notificationCenterSetting 속성이 UNNotificationSetting.enabled로 설정되어 있는 경우 여전히 노티피케이션 센터에서 알림을 표시할 것입니다. 노티피케이션 센터 딜리게이트의 userNotificationCenter(_:willPresent:withCompletionHandler:) 메소드 또한 앱이 포어그라운드에 있을 때 노티피케이션을 받습니다. 그리고 여전히 알림, 소리, badge 정보에 접근할 수 있습니다.

0개의 댓글