"Send push notifications to a device to signal changes from your server."
서버로부터 변경사항에 대한 신호를 보내기 위해 기기에 푸시 노티피케이션을 보냅니다.
PushKit
프레임워크와 fileProvider
푸시 타입을 사용해서 원격 서버로부터 푸시 노티피케이션을 보내는 것을 통해 변경사항 신호를 보낼 수 있습니다. 이 푸시 노티피케이션은 앱 혹은 확장에 전달되지 않습니다. 대신 시스템은 노티피케이션을 받고, 구체화된 아이덴티파이어를 사용해서 signalEnumerator(for:completionHandler:)
메소드를 호출합니다.
푸시노티피케이션을 사용하려면, 앱에 대한 사이닝(signing) 키를 생성하는 것으로부터 출발합니다. 다음으로 푸시 노티피케이션을 받기 위한 앱 설정을 해야 합니다. 마지막으로 서버로부터 노티피케이션을 보내야 합니다. 이어지는 섹션은 각 단계를 설명합니다.
Important
불필요한 푸시 노티피케이션 전송을 피해야 합니다. 지나치게 많이 보내면, 애플 푸시 노티피케이션 서비스(APNs)가 요청을 제한할 것입니다.
파일과 디렉토리를 여는 경우 파일 제공자 확장이 해당 아이템에 대한 활성화된 열거자를 갖고 있을 때에만 푸시 노티피케이션 전송을 시도하시기 바랍니다. 이는 열거자가 생성되거나 무효화될 때마다 확장이 서버를 업데이트해야 함을 의미합니다. 추가적으로 이와 같은 조정은 인터넷 연결이 사용 불가능하거나 실패할 떄 자동으로 저하됩니다.
작업하고 있는 집합에 속한 아이템의 경우 서버는 항상 푸시푸쉬 노티피케이션을 보내야 합니다.
원격 서버로부터 변경사항에 대한 신호를 보내려면, 제공자 인증 토큰(제공자 자격 인증서가 아닌)을 사용해야 합니다. 앱을 위한 APNs 키를 생성하려면 Communicate with APNs using authentication tokens를 살펴보시기 바랍니다. 서버로부터 노티피케이션을 보낼 때, JSON Web Tokens(JWT)에 서명하기 위한 APNs 키를 사용해야 합니다.
Communicate with APNs using authentication tokens
https://help.apple.com/xcode/mac/current/#/dev54d690a66
노티피케이션을 받으려면 우선 앱에서 푸시 노티피케이션을 활성화해야 합니다. 이후 앱과 확장 모두에 푸시 노티피케이션을 등록합니다. 마지막으로 서버에 기기 토큰을 전송합니다. 아래 섹션은 이러한 단계들을 설명합니다.
iOS 앱에서 푸시 노티피케이션을 활성화합니다(파일 제공자 확장이 아닌). 자세한 내용은 Communicate with APNs using authentication tokens를 살펴보시기 바랍니다.
Communicate with APNs using authentication tokens
https://help.apple.com/xcode/mac/current/#/devdfd3d04a1
앱과 파잎 제공자 확장 모두에 푸시 노티피케이션을 등록합니다.
AppDelegate
와 FileProviderExtension
클래스에서 PKPushRegistryDelegate
프로토콜을 채택합니다.
import PushKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, PKPushRegistryDelegate {
import PushKit
class FileProviderExtension: NSFileProviderExtension, PKPushRegistryDelegate {
또한, 각 클래스에서 pushRegistry
인스턴스 변수를 생성합니다.
var pushRegistry: PKPushRegistry!
AppDelegate
클래스의 application(_:didFinishLaunchingWithOptions:)
메소드에서 푸시 노티피케이션을 등록합니다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
pushRegistry = PKPushRegistry(queue: nil)
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.fileProvider]
return true
}
유사하게 FileProvider
클래스의 init()
메소드에서 푸시 노티피케이션을 등록합니다.
override init() {
super.init()
pushRegistry = PKPushRegistry(queue: nil)
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.fileProvider]
}
마지막으로 pushRegistry(_:didUpdate:for:)
메소드를 AppDelegate
와 FileProvider
클래스 모두에 구현합니다. pushRegistry(_:didInvalidatePushTokenFor:)
메소드는 선택적입니다.
Note
pushRegistry(_:didReceiveIncomingPushWith:for:completion:)
메소드는fileProvider
타입 푸시에서 절대 호출되지 않습니다. 이러한 노티피케이션은 시스템에 의해 자동으로 처리됩니다.
AppDelegate
와 FileProvider
클래스의 pushRegistry(_:didUpdate:for:)
메소드에서 PKPushCredentials
인스턴스를 받을 때, 토큰 속성 값을 추출하고 서버에 보내야 합니다. 이 값은 app-specific 기기 토큰입니다. 서버는 이 기기에 푸시 노티피케이션을 요청하기 위해 기기 토큰을 사용합니다.
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) {
let deviceToken = credentials.token
// Send the device token to your server here...
}
이제 푸시 노티피케이션을 보낼 준비가 되었습니다.
:path
값은 /3/device/<device-token>
입니다. 이 토큰은 pushRegistry(_:didUpdate:for:)
메소드로부터 서버에 보냈었던 기기 토큰입니다.<provider token>
입니다. 이 토큰이 JWT입니다.apns-topic
값은 <bundle identifier>pushkit.fileprovider
입니다. 번들 아이덴티파이어는 앱의 번들 아이덴티파이어입니다.Provider Authentication Tokens
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW3
포스트 요청의 컨텐트는 업데이트를 위해 컨테이너의 아이덴티파이어를 구체화하는 JSON 딕셔너리입니다. 이 아이덴티파이어는 컨테이너의 itemIdentifier
속성에서 사용되는 고유한 스트링이어야 합니다. 루트 컨테이너를 업데이트하기 위해 NSFileProviderRootContainerItemIdentifier
를 사용할 수도 있으며, 혹은 작업하고 있는 집합을 업데이트하기 위해 NSFileProviderWorkingSetContainerItemIdentifier
를 사용할 수도 있습니다.
{
container-identifier = "<identifier>"
}
더 많은 정보는 APNs Notification API를 살펴보시기 바랍니다.
APNs Notification API
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW10