APNsとは?

目次

Appleによると、APNsは(Apple Push Notificationサービス)リモート通知機能の中核であり、iOS(および間接的にwatchOS)、tvOS、macOSの各デバイスにアプリケーションのデベロッパーが情報を配信するための、堅牢かつ安全で非常に効率的なサービスです。

要するに、ユーザーのスマートフォンにインストールされている全てのアプリはユーザーにプッシュ通知を送ることができるというサービスです。

可能なこと

  • メッセージの表示
  • サウンドの再生
  • アプリのアイコンをセット
  • アプリを開いても開かなくてもアクションできる
  • 画像もしくはメディアの表示
  • アプリをバックグラウンドで起動させる

APNsの設定のために必要なもの

  • iOS実機:シュミレーターは使えません。
  • Apple Developer Programのメンバーシップ:有料で加入する必要があります。
  • 実機にプッシュ通知を送ることのできる環境:Pusher appをインストールするのがもっとも簡単です。

APNsの設定と実装方法

ステップ1: Projectを作成する

iOSアプリを作成する時と同様に「Project」を作成しましょう。 ここでは「Unicorner」というProject名を付けました。この「Project」はユーザーの誰かがユニコーンの画像を撮ると、全ての「Unicorner」ユーザーにその画像がプッシュ通知が送られるように設定します。

ステップ2:APNsを有効にする

Xcodeの「Target」を選択し、アプリ名を選択してください。 「Capability」の中にある「Push Notification」のスイッチをONにしましょう。

ステップ3:APNsの証明書を獲得する

Apple Developerのアカウントでログインしましょう。 「Certificates, IDs&Profile > Identifiers > Apple IDs」をクリックして、自分のアプリの「identifier」を見つけたらプッシュ通知を作成するアプリを選択してください。「Push Notification」は「Configurable」が有効になっていることを確認しましょう。

ページの下部にある「Edit」ボタンをクリックすると「Push Notifications」が表示されるので確認してください。

必要なのは「Development SSL Certificate」です。(Developmentとproductionの違いは後ほど説明します)「Create Certificate」ボタンをクリックしてください。説明にしたがってCSRファイルを作成しましょう。Macを使っている場合、「command」キーと「space」キーでspotlight検索が出てきますので「Keychain Access」と打ち込むと下記Keychain Access Appが出てきます。

「Keychain Access」メニューが出てきたら「Certificate Assistant」の「Request a Certificate from a Certificate Authority」を選択してください。

「Certificate Information」に情報を入力し、「.cert-SigningRequest file」をパソコン上に保存してください。

DL画面が出てきたら先ほど保存した「.cert-SigningRequest file」をDLしてください。

作成されたCertificateファイルをDLして、「Keychain Access」にインストールされた「.cer file」をダブルクリックしてください。

再度、「Certificates, IDs & Profiles > Identifiers > App IDs」を選択するとPush NotificationsがDevelopment Enable (有効) になっているので確認してください。

ステップ4: コーディング

Certificate取得作業は時間がかかりますが、セキュリティのためにも重要な作業なので必ず行ってください。ここからはコーディングに入ります。

Projectに戻ってAppDelegate.swiftファイルを開きましょう。この作業でユーザーにプッシュ通知で許諾許可を取ることができます。

AppDelegate.swiftファイルの最初に

import UserNotifications

を入れてください。

次にAppDelegate classの中に下記を入れてください。

func registerForPushNotifications() {
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            print("Permission granted: \(granted)")
            // 1. Check if permission granted
            guard granted else { return }
            // 2. Attempt registration for remote notifications on the main thread
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }

このコードはUserNotificationCenterインスタンスにアクセスし、ユーザーにアラート、サウンド、バッジを使ったプッシュ通知を送っていいか許可を取るものです。

許可を取ることができたら、shared applicationインスタンスのregisterForRemoteNotifications()関数をmainスレッドで呼び出します。 ここでmainスレッドで呼び出さないとバックグラウンドでの実行となり、エラーメッセージが出てしまいます。

次にapplication(_:didFinishLaunchingWIthOptions:)の最後にあるregisterForPushNotifications()関数を呼び出します。 return trueの前に、regiserForPushNotifications()を入れてください。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        registerForPushNotifications()
        return true
    }

これで、ユーザーがアプリを初回起動する際にプッシュ通知の許可ダイアログが出ます。 プロジェクトを実行してみると下記が表示されるはずです。

Allowが押されれば、プッシュ通知が届くようになります。しかし、ユーザーはシステム設定でプッシュ通知をオフにすることもできるのです。 プッシュ通知の許諾率をあげる方法はこちらをご覧ください。

最後に2つ関数を追加します。一つはdevice tokenを取得する関数、もう一つはエラーハンドリングをする関数です。

   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // 1. Convert device token to string
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        // 2. Print device token to use for PNs payloads
        print("Device Token: \(token)")
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // 1. Print out error if PNs registration not successful
        print("Failed to register for remote notifications with error: \(error)")
    }

didRegister…関数は一見変わったコードですが、tokenを取得しているだけです。

ステップ5: プッシュ通知を送る

「Pusher」を開いてください。

ドロップダウンから「Keychain Access」にある証明書が表示されるので、アプリの証明書を選択しましょう。

選択したら、「Xcode console」に表示された「device token」を貼り付けてください。 (device tokenはアプリを削除したりインストールし直すと変わります) 以下はconsoleで表示されるdevice tokenの例です。

Pusherでは、Appleが定義するkeyをJSON dictionary keyとしてデフォルトpayloadを提供してくれています。 JSON keyでは、

  • alert keyは”Testing…”と表示します
  • badge keyはアプリのアイコンに「1」とバッジを付けます
  • sound keyはデフォルトの通知サウンドを鳴らします。

これでアプリはできましたので、PusherのPushボタンを押してみましょう。

APNs証明書に関する追加情報

APNs証明書について、この記事の中でXcodeを使ってアプリを作成した際にdevelopment certificateを使用しましたが、TestFlightでβバージョンをリリースしたい際やAppStoreにプロダクションバージョンをリリースしたい際はproduction certificateを使う必要があります。

また、APNS Auth Keyを使ってもPush通知のセットアップをすることができます。 これには2点の利点があります。

・毎年証明書を発行し直さなくて良い
・一つのauth keyを複数のアプリで使えるためアプリごとに証明書を管理しなくて良い。

まとめ

今回はAPNsについてと、APNsの機能の一部をご紹介しました。 APNsの機能はまだまだあるので、より理解を深めて、活用してみてください。