【iOS Swift】アプリにプッシュ通知を組み込もう!

20170208更新

画像1

概要

ニフクラmobile backendって何??

スマートフォンアプリのバックエンド機能(プッシュ通知・データストア・会員管理・ファイルストア・SNS連携・位置情報検索・スクリプト)が開発不要、しかも基本無料(注1)で使えるクラウドサービス!

注1:詳しくはこちらをご覧ください

画像2

動作環境

  • Mac OS X 10.10(Yosemite)
  • Xcode ver. 7.2.1
  • iPhone6 ver. 8.2
  • このサンプルアプリは、実機ビルドが必要です
  • Lightningケーブル

※上記内容で動作確認をしています

プッシュ通知の仕組み

  • ニフクラmobile backendのプッシュ通知は、iOSが提供している通知サービスを利用しています
  • iOSの通知サービス APNs(Apple Push Notification Service)

画像1

  • 上図のように、アプリ(Xcode)・サーバー(ニフクラmobile backend)・通知サービス(APNs)の間でやり取りを行うため、認証が必要になります
  • 認証に必要な鍵や証明書の作成は作業手順の「0.プッシュ通知機能を使うための準備」で行います

作業の手順

0.プッシュ通知機能を使うための準備

【iOS】プッシュ通知の受信に必要な証明書の作り方(開発用)

  • 上記のドキュメントをご覧の上、必要な証明書類の作成をお願いします
  • 証明書の作成にはApple Developer Programの登録(有料)が必要です

画像i2

1. ニフクラmobile backendの会員登録とログイン→アプリ作成と設定

  • 上記リンクから会員登録(無料)をします。登録ができたらログインをすると下図のように「アプリの新規作成」画面が出るのでアプリを作成します

画像3

  • アプリ作成されると下図のような画面になります
  • この2種類のAPIキー(アプリケーションキーとクライアントキー)はXcodeで作成するiOSアプリにニフクラmobile backendを紐付けるために使用します

画像4

  • 続けてプッシュ通知の設定を行います
  • ここで⑦APNs用証明書(.p12)の設定も行います

画像5

2. GitHubからサンプルプロジェクトのダウンロード

  • 下記リンクをクリックしてプロジェクトをMacにダウンロードします
  • SwiftPushApp

3. Xcodeでアプリを起動

  • ダウンロードしたフォルダを開き、「SwiftPushApp.xcworkspace」をダブルクリックしてXcode開きます(白い方です)!

画像09 画像06

  • 「SwiftPushApp.xcodeproj」(青い方)ではないので注意してください!

画像08

3. APIキーの設定

  • AppDelegate.swiftを編集します
  • 先程ニフクラmobile backendのダッシュボード上で確認したAPIキーを貼り付けます

画像07

  • それぞれYOUR_NCMB_APPLICATION_KEYYOUR_NCMB_CLIENT_KEYの部分を書き換えます
  • このとき、ダブルクォーテーション(")を消さないように注意してください!
  • 書き換え終わったらcommand + sキーで保存をします

4. 実機ビルド

  • 始めて実機ビルドをする場合は、Xcodeにアカウント(AppleID)の登録をします
  • メニューバーの「Xcode」>「Preferences...」を選択します
  • Accounts画面が開いたら、左下の「+」をクリックします。
  • Apple IDとPasswordを入力して、「Add」をクリックします

画像i29

  • 追加されると、下図のようになります。追加した情報があっていればOKです
  • 確認できたら閉じます。

画像i30

  • プロジェクトをクリックして、「Build Settings」>「Code Signing」に②開発用証明書(.cer)と⑤プロビジョニングプロファイルを設定します

画像i25

  • 「Code Signing Identity」に②開発用証明書(.cer)を設定しますが、「Provisioning Profile」に作成した⑤プロビジョニングプロファイルを設定すれば、「Code Signing Identity」の部分は「Automatic」で構いません
  • 注意:作成した⑤プロビジョニングプロファイルは一度ダブルクリックをしておかないと、「Provisioning Profile」に設定できません。
  • Bundle ID を設定します
  • 「General」>「Identity」の「Bundle Identifier」に③AppID を作成したときに入力したBundle IDに書き換えてください

画像i26

  • 設定は完了です
  • lightningケーブルで④端末の登録で登録した、動作確認用iPhoneをMacにつなぎます
  • 実機ビルドが初めての場合はこちらをご覧いただき、実機ビルドの準備をお願いします
  • Xcode画面で左上で、接続したiPhoneを選び、実行ボタン(さんかくの再生マーク)をクリックします
  • ビルド時にエラーが発生した場合の対処方法
  • Xcodeのバージョンが古い場合import NCMBにエラーが発生し、上手くSDKが読み込めないことがあります
  • その場合は【Swift】SDKの読み込みにuse framework!が使えない場合の対処方法をご覧いただき、別の読み込み方法をお試しください

5.動作確認

  • インストールしたアプリを起動します
  • プッシュ通知の許可を求めるアラートが出たら、必ず許可してください!
  • 起動されたらこの時点でデバイストークンが取得されます
  • ニフクラmobile backendのダッシュボードで「データストア」>「installation」クラスを確認してみましょう!

画像12

  • 端末側で起動したアプリは一度閉じておきます

6.プッシュ通知を送りましょう!

  • いよいよです!実際にプッシュ通知を送ってみましょう!
  • ニフクラmobile backendのダッシュボードで「プッシュ通知」>「+新しいプッシュ通知」をクリックします
  • プッシュ通知のフォームが開かれます
  • 必要な項目を入力してプッシュ通知を作成します

画像13

  • 端末を確認しましょう!
  • 少し待つとプッシュ通知が届きます!!!

解説

サンプルプロジェクトに実装済みの内容のご紹介

SDKのインポートと初期設定

ロジック

  • AppDelegate.swiftdidFinishLaunchingWithOptionsメソッドにAPNsに対してデバイストークンの要求するコードを記述し、デバイストークンが取得された後に呼び出されるdidRegisterForRemoteNotificationsWithDeviceTokenメソッドを追記をします
  • デバイストークンの要求はiOSのバージョンによってコードが異なります
import UIKit
import NCMB

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    //********** APIキーの設定 **********
    let applicationkey = "YOUR_NCMB_APPLICATIONKEY"
    let clientkey      = "YOUR_NCMB_CLIENTKEY"


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        //********** SDKの初期化 **********
        NCMB.setApplicationKey(applicationkey, clientKey: clientkey)

        /// デバイストークンの要求
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1){
            /** iOS8以上 **/
             //通知のタイプを設定したsettingを用意
            let type : UIUserNotificationType = [.Alert, .Badge, .Sound]
            let setting = UIUserNotificationSettings(forTypes: type, categories: nil)
            //通知のタイプを設定
            application.registerUserNotificationSettings(setting)
            //DevoceTokenを要求
            application.registerForRemoteNotifications()
        }else{
            /** iOS8未満 **/
            let type : UIRemoteNotificationType = [.Alert, .Badge, .Sound]
            UIApplication.sharedApplication().registerForRemoteNotificationTypes(type)
        }

        return true
    }

    // デバイストークンが取得されたら呼び出されるメソッド
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){
        // 端末情報を扱うNCMBInstallationのインスタンスを作成
        let installation = NCMBInstallation.currentInstallation()
        // デバイストークンの設定
        installation.setDeviceTokenFromData(deviceToken)
        // 端末情報をデータストアに登録
        installation.saveInBackgroundWithBlock { (error: NSError!) -> Void in
            if (error != nil){
                // 端末情報の登録に失敗した時の処理

            }else{
                // 端末情報の登録に成功した時の処理

            }
        }
    }
}

参考