didReceiveRemoteNotificationメソッドがiOS 13以上で呼ばれない理由
特定の手続きをしないと、iOS 13以上でサイレントプッシュを使っている時にAppDelegate
のdidReceiveRemoteNotification
が呼ばれないことがわかりました。
AppDelegate.swift
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("PUSH arrived.")
completionHandler(.noData)
}
サーバー側でヘッダーにapns-push-type: background
を付けるか、もしくは以下のようにペイロードJSONのaps
部分に空のalert
を付けると、無事呼ばれるようになりました。
body.json
{
"aps": {
"alert": {},
"content-available": 1
}
}
WWDC2019で発表された正式な方法らしい前者が理想ですが、もしサーバーがカスタムヘッダーをサポートしていない場合は後者のほうが簡単です。
注意点
ヘッダーにapns-push-type: alert
を明示的につけていると、ペイロードJSONの内容に関わらずサイレントプッシュとみなされなくなり、didReceiveRemoteNotification
が呼ばれないらしいので、気をつけましょう。
参考文献
- iOS 13 beta 7 Silent Push Bug |Apple Developer Forums
-
iOS 13 and Xcode 11 Changes That Affect Push Notifications
- APNS Priority must be set to 5 for background notifications