プッシュ通知を表示する（UIKit::UIApplication.registerForRemoteNotifications）

# リモート通知（プッシュ通知）表示

記事が対象としている読者的に、mBaaSの使用を前提
プッシュ通知の送れるmBaaSの例

- [Microsoft Azure Mobile Apps](https://azure.microsoft.com/ja-jp/services/app-service/mobile/)
- [Amazon SNS](http://aws.amazon.com/jp/sns/)
- [NIFTY Cloud mobile backend](http://mb.cloud.nifty.com/)
- [Kii Cloud](https://jp.kii.com/index.html)
- [GMO mBaaS](http://www.gmo-mbaas.com/)
- [Appiarie](http://www.appiaries.com/jp/)

プッシュ通知は、サーバによってApple Push Notificationサービス（APNs）に送信され、そこからデバイスに配信（プッシュ）
ユーザにとってはローカル通知もプッシュ通知も同じに見える

## 通知タイプ登録

通知のタイプを何も登録しなければ、システムは画面に何も表示することなく、リモート通知をアプリケーションにプッシュする

```swift:AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func applicationDidFinishLaunching(application: UIApplication) {
        let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
    }
    
    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
        print(notificationSettings.types)
    }
```

## デバイストークン登録

プッシュ通知受領登録

```swift:AppDelegate.swift
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
```

デバイストークン取得・保存・登録

```swift:AppDelegate.swift
        print(notificationSettings.types)
    }
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        // Save device token and Send it to provider
    }
    
    func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
        print(error.description)
    }
```

*デバイストークンは変化することがあるので、アプリケーションは起動の都度、登録し直す必要がある*

## アプリケーションがフォアグラウンドで動作中に通知を受け取った場合の処理

```swift:AppDelegate.swift
        print(error.description)
    }
    
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        // Handle notification
    }
```

## アプリケーションがフォアグラウンドで動作中以外に通知を受け取った場合の処理

```swift:AppDelegate.swift
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        // Handle notification
    }
    
    func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
        print("Identifier is \(identifier)")
    }
```

## 通知をタップしてアプリケーションが起動された場合の処理

```swift:AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        if let options = launchOptions {
            let payload = options[UIApplicationLaunchOptionsRemoteNotificationKey] as! NSDictionary
            if let data = payload.objectForKey("key") {
                print("data for key: \(data)")
            }
        }
```

## 参考情報

[Local および Push Notification プログラミングガイド](https://developer.apple.com/jp/documentation/RemoteNotificationsPG.pdf)