通知を受け取ると、UIApplicationDelegate
の以下のコールバックメソッドが呼ばれます
呼ばれるコールバックメソッドとそのタイミングは、アプリの実行状態により決定されます
事前状態 | タイミング | メソッド |
---|---|---|
未起動 | 通知のタップにより起動 | application(_:didFinishLaunchingWithOptions:) |
Foreground | 通知を受信 | application(_:didReceiveRemoteNotification:fetchCompletionHandler:) |
Background | 通知のタップによりForeground | application(_:didReceiveRemoteNotification:fetchCompletionHandler:) |
これらのコールバック内で、通知のペイロード(通知に含まれるデータ)を取得して処理を行います
Push通知のペイロードは、以下のような形式のJSONです
{
"aps" : {
"alert" : {
"title" : "New Message",
"subtitle" : "You got a new message.",
"body" : "New message has arrived. Open your inbox."
},
"badge" : 3,
"sound" : "default"
}
}
UIApplicationDelegate
のコールバックの引数に格納された状態で渡されますコールバックメソッド | 格納場所 |
---|---|
application(_:didFinishLaunchingWithOptions:) |
第2引数launchOptions ディクショナリ内 |
application(_:didReceiveRemoteNotification:fetchCompletionHandler:) |
第2引数のuserInfo ディクショナリ内 |
今回は、以下の内容のPush通知を送ってみます
{
"aps": {
"alert": "Wake up!",
"sound": "default"
}
}
application(_:didFinishLaunchingWithOptions:)
が呼ばれますlaunchOptions
ディクショナリからキーUIApplication.LaunchOptionsKey.remoteNotification
を指定
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
〜省略〜
// MARK: 01. get notification payload
if let notificationOptions = launchOptions?[.remoteNotification] as? [String: AnyObject] {
guard let apsPart = notificationOptions["aps"] as? [String: AnyObject] else { return true }
guard let vc = window?.rootViewController as? ViewController else { return true }
let text = apsPart.map { (key, value) in "\(key): \(value)" }.joined(separator: "\n")
vc.payloadText = text
vc.backgroundColor = .yellow
}
return true
}
UIApplicationDelegate
プロトコルのapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)
が呼ばれます
userInfo
ディクショナリからキー"aps"でペイロードの内容部分のディクショナリを取得このコールバックを実装した場合、Backgorund ModesをONにすることを求められるので有効にしておきます
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// MARK: 04. get notification payload
guard let apsPart = userInfo["aps"] as? [String: AnyObject] else {
completionHandler(.failed)
return
}
guard let vc = window?.rootViewController as? ViewController else { return }
let text = apsPart.map { (key, value) in "\(key): \(value)" }.joined(separator: "\n")
vc.payloadText = text
vc.backgroundColor = .green
}