iOS10とiOS9にプッシュ通知を送るための最低限の処理


iOS10では、新しく従来以上にリッチな通知の制御を扱うためのUser Notification Frameworkが追加されます。

User Notification Frameworkが追加されたことによる変更点は、通知に画像などのファイルを付与できる、通知のビューをカスタマイズできる、位置情報をもとに通知ができる、など多数あります。
またそれに伴い、ユーザから通知の許可を得るための処理も、従来の方法はiOS10ではdeprecatedとなりました。

というわけで、最新OSとそれ以前のOSに対してプッシュ通知を送るために必要な最低限の手順を簡単に整理してみます。

なお、環境は以下の通りです。

  • OS X El Capitan(10.11.5)
  • Xcode 8.0 GM
  • iOS 10.0.1 GM seed, iOS 8.3

変更点

ユーザから許可を得るための流れとしては、従来と変わらず以下の通りです。

  1. ユーザから通知の許可を得る
  2. デバイストークンを発行する
  3. 発行されたデバイストークンをサーバに登録する

この中で大きく変更になったのはユーザから通知の許可を得るための処理の記述方法です。

iOS10では以下のようになりました。

UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { granted, error in

    guard error == nil else {

        // error handling
        return
    }

    if granted {

        // デバイストークンを発行
        UIApplication.shared.registerForRemoteNotifications()
    }
}

処理の流れとしては、UNUserNotificationCenter.requestAuthorization(_: completionHandler:)を実行してユーザに通知を行う許可を求め、クロージャでユーザの応答に応じた処理を行う、というものです。

なお、これ以降の処理は従来通りで、registerForRemoteNotifications()でデバイストークンを発行し、

application(_:didRegisterForRemoteNotificationsWithDeviceToken:)でデバイストークンを取得し、サーバに登録すればOKです。

iOS9以前にも対応する

iOS9およびiOS8ではUser Notification Frameworkは利用できないので、OSのバージョンに応じて処理を分岐する必要があります。

if #available(iOS 10.0, *) {

    // iOS10.0以上
    UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { granted, error in

        guard error == nil else {

          // error handling
           return
        }

        if granted {

            UIApplication.shared.registerForRemoteNotifications()
        }
    }
} else {

    // それ以外
    let settings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)

    UIApplication.shared.registerUserNotificationSettings(settings)
     UIApplication.shared.registerForRemoteNotifications()
}

 

この記述内容で実現できること

上記の記述をすることで、iOS10とiOS9(またはiOS8)の端末にプッシュ通知を送ることができます。

ですが、ビューのカスタマイズや添付された画像の表示などを行うには、別途Notification Service Extensionを実装する必要があります。
また、アプリ起動時に通知が届いた際などの処理はUNUserNotificationCenterDelegateを実装する必要があります。
(※これらについてはまた別の記事でまとめる予定です)