xyk blog

最近は iOS 開発の記事が多めです。

プッシュ通知受信時に呼ばれるメソッドについて

環境: Swift2.3

前提となるCapabilitiesの設定

- Push Notifications -> ON  
- Background Modes -> OFF  

プッシュ通知受信時に呼ばれるメソッド

プッシュ通知受信時に呼び出されるメソッドに
1. application:didReceiveRemoteNotification:
2. application:didReceiveRemoteNotification:fetchCompletionHandler:
という似たメソッドが存在するがこの違いについてメモしておく。

// 1
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    // userInfo の処理

}

// 2
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                 fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // userInfo の処理

}

基本的には、この2つのメソッドのどちらか片方のみ実装することになる。
両方とも実装していた場合は
2. application:didReceiveRemoteNotification:fetchCompletionHandler:
の方が優先されて呼び出され、
1. application:didReceiveRemoteNotification:
の方は呼び出されないので注意。


1. application:didReceiveRemoteNotification:を実装してプッシュ通知を受信

アプリ未起動時

画面上部に通知表示。
通知をタップすると
application:didFinishLaunchingWithOptions:のみ呼び出される。
application:didReceiveRemoteNotification:は呼ばれない。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] {
        // userInfo の処理
    }

}
フォアグラウンド時

通知表示はない。
application:didReceiveRemoteNotification:のみ呼び出される

バックグラウンド時

画面上部に通知表示。
通知をタップするとapplication:didReceiveRemoteNotification:のみ呼び出される


2. application:didReceiveRemoteNotification:fetchCompletionHandler: を実装してプッシュ通知を受信

アプリ未起動時

画面上部に通知表示。
通知をタップすると
application:didFinishLaunchingWithOptions:が呼び出される。
その後
application:didReceiveRemoteNotification:fetchCompletionHandler:が呼び出される。
ここが1とは違い必ず呼び出される。

フォアグラウンド時

通知表示はない。
application:didReceiveRemoteNotification:fetchCompletionHandler:のみ呼び出される

バックグラウンド時

画面上部に通知表示。
通知をタップするとapplication:didReceiveRemoteNotification:fetchCompletionHandler:のみ呼び出される