ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

2018年10月版:Xcode 10.0 + Swift 4.2 + NCMB iOS SDK 3.0.0でのプッシュ通知実装

f:id:mbaasdevrel:20180914104933p:plain

Swiftの進化は速く、年ごとにバージョンが上がっています。iOS/Xcodeももちろんバージョンアップしており、それに伴って実装方法が変わってきます。Swift + iOS SDKでプッシュ通知を実装する記事は幾つかありますが、コードが若干変わってきています。

そこで今回は2018年10月時点での最新のXcode/Swift/iOSでのプッシュ通知実装方法を紹介します。iOS12対応版です。

iOSの証明書を作成する

このステップは飛ばします。プッシュ通知用の証明書を作成してください。

f:id:mbaasdevrel:20180914105000p:plain

iOS SDKをインストールする

今回はCocoaPodsを使っています。作成後、 ncmbPush-Bridging-Header.h といったファイルを作って読み込みます。

#import <NCMB/NCMB.h>

このファイルは Build Settings のObjective-C Bridging Headerの中でパスを指定します。

f:id:mbaasdevrel:20180914105016p:plain

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にします。

f:id:mbaasdevrel:20180914105035p:plain

これで準備完了です。

プッシュ通知を許可する

アプリを実機でビルドするとプッシュ通知の許可を求めるダイアログが表示されます。

f:id:mbaasdevrel:20180914110403p:plain

許可するとmBaaSの管理画面でinstallationクラスにデバイストークンが登録されているのが確認できます。

f:id:mbaasdevrel:20180914110416p:plain

プッシュ通知を送信する

mBaaSの管理画面でiOSに対してプッシュ通知を送るには、まず証明書の登録が必要です。iOS Member Centerで作成した鍵をキーチェーンアプリを使ってエクスポートします。この時、公開鍵だけを出力しなければなりません。

f:id:mbaasdevrel:20180914110453p:plain

そして作成した公開鍵(p12ファイル)を管理画面でアップロードします。この時、プッシュ通知を許可するのを忘れないでください。

f:id:mbaasdevrel:20180914110543p:plain

後はプッシュ通知の作成画面で送信するだけです。

f:id:mbaasdevrel:20180914110555p:plain

数秒待つとプッシュ通知がデバイスに届きます。

f:id:mbaasdevrel:20180914110616p:plain

プッシュ通知を開くと指定したペイロードが届いているのが確認できるでしょう。

[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が変わった程度です。これまでの実装とほぼ変わらないので問題ないかと思いますが、もし不明点などがあったら、ユーザコミュニティにて質問してください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。