Swiftの進化は速く、年ごとにバージョンが上がっています。iOS/Xcodeももちろんバージョンアップしており、それに伴って実装方法が変わってきます。Swift + iOS SDKでプッシュ通知を実装する記事は幾つかありますが、コードが若干変わってきています。
そこで今回は2018年10月時点での最新のXcode/Swift/iOSでのプッシュ通知実装方法を紹介します。iOS12対応版です。
iOSの証明書を作成する
このステップは飛ばします。プッシュ通知用の証明書を作成してください。
iOS SDKをインストールする
今回はCocoaPodsを使っています。作成後、 ncmbPush-Bridging-Header.h
といったファイルを作って読み込みます。
#import <NCMB/NCMB.h>
このファイルは Build Settings のObjective-C Bridging Headerの中でパスを指定します。
AppDelegate.swiftの実装
まず UserNotifications
をインポートします。
import UserNotifications
さらにデリゲートを追加します。
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
次に didFinishLaunchingWithOptions
の実装です。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // アプリケーションキーの取得。今回はcocospads-keysを使っています let keys = NcmbPushKeys() NCMB.setApplicationKey(keys.applicationKey, clientKey: keys.clientKey) // デバイストークンの取得ここから if #available(iOS 10.0, *){ /** iOS10以上 **/ let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .badge, .sound]) {granted, error in if error != nil { // エラー時の処理 return } if granted { // デバイストークンの要求 UIApplication.shared.registerForRemoteNotifications() } } } else { /** iOS8以上iOS10未満 **/ //通知のタイプを設定したsettingを用意 let setting = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) //通知のタイプを設定 application.registerUserNotificationSettings(setting) //DevoceTokenを要求 UIApplication.shared.registerForRemoteNotifications() } return true }
さらに didRegisterForRemoteNotificationsWithDeviceToken
を追加します。これはデバイストークンを取得した際に呼び出されるメソッドで、ここでデバイストークンをmBaaSに保存します。
// デバイストークンが取得されたら呼び出されるメソッド func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // 端末情報を扱うNCMBInstallationのインスタンスを作成 let installation : NCMBInstallation = NCMBInstallation.current() // デバイストークンの設定 installation.setDeviceTokenFrom(deviceToken) // 端末情報をデータストアに登録 installation.saveInBackground {error in if error != nil { // 端末情報の登録に失敗した時の処理 print(error ?? "Error") } else { // 端末情報の登録に成功した時の処理 print("登録しました") } } }
そしてプッシュ通知を受け取ったときのメソッド didReceiveRemoteNotification
を追加します。
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { if userInfo.count > 0 { print(userInfo) } }
さらにプロジェクトのCapabilitiesにて、Background Modes のRemote notificationsを有効にし、Push NotificationsをONにします。
これで準備完了です。
プッシュ通知を許可する
アプリを実機でビルドするとプッシュ通知の許可を求めるダイアログが表示されます。
許可するとmBaaSの管理画面でinstallationクラスにデバイストークンが登録されているのが確認できます。
プッシュ通知を送信する
mBaaSの管理画面でiOSに対してプッシュ通知を送るには、まず証明書の登録が必要です。iOS Member Centerで作成した鍵をキーチェーンアプリを使ってエクスポートします。この時、公開鍵だけを出力しなければなりません。
そして作成した公開鍵(p12ファイル)を管理画面でアップロードします。この時、プッシュ通知を許可するのを忘れないでください。
後はプッシュ通知の作成画面で送信するだけです。
数秒待つとプッシュ通知がデバイスに届きます。
プッシュ通知を開くと指定したペイロードが届いているのが確認できるでしょう。
[AnyHashable("a"): b, AnyHashable("com.nifty.PushId"): 1aDH6hjq4zpxGTBD, AnyHashable("aps"): { alert = { body = "\U30c6\U30b9\U30c8"; title = "<null>"; }; sound = default; }, AnyHashable("com.nifcloud.mbaas.PushId"): 1aDH6hjq4zpxGTBD]
まとめ
SwiftはiOS11では4.1系、iOS12では4.2系とマイナーアップデートに留まっています。そのお陰もあって、iOS11と12ではプッシュ通知の実装方法に大きな違いはありません。NCMBのSDKについても、3系になってリクエスト先のURLが変わった程度です。これまでの実装とほぼ変わらないので問題ないかと思いますが、もし不明点などがあったら、ユーザコミュニティにて質問してください。