Renewal
     

APNsとは?

Appleによると、

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

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

APNsでできること

下記はAPNsでできることの例です。

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

本記事はメッセージの表示、画像などのメディアの表示と通知を介して可能なアクションについてご紹介します。

まずはじめに、APNsを始める前に必要な設定について説明します。

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

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

APNsの設定と実装方法

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

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

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

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

APNs <XcodeのPush通知を有効にする>

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

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

APNS

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

APNs

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

APNs

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

APNs

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

APNs

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

APNs <.cer file DL画面>

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

APNs

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

APNs

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

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

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

AppDelegate.swiftファイルの最初に

import UserNotifications

を入れてください。

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

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

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

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

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

APNs

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

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

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

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

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

APNs

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

APNs

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

APNs

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

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

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

APNs

ちゃんと動きましたか?ユニコーンはこの後出てきますのでご安心ください。

リッチ通知を試してみる

プッシュ通知を送るところまではできましたが、この記事を読んでいる人の中では画像やgifが入ったリッチ通知を送りたい人もいるのではないでしょうか?リッチ通知にはService Extensionを使います。Service Extensionでpush payloadにメディアを追加しましょう。

Appleのページにおいて、

App Extensionsでは「ユーザーにiOSとmacOSを通してアプリの機能にアクセスさせることができます。」

と明記されています。 Service Extensionはより見た目の良いプッシュ通知を送ることができるということです。

早速どうやって実装するのか見てみましょう。 XCodeから「File > New > Target」を選択します。

APNs

iOSメニューでフィルターからServiceを選び、Notification Service Extensionを選んでください。

APNs

Nextボタンを押して、名前を付けてください。ここではNotificationServiceと付けます。Finishボタンを押してください。そうすると以下の2つのファイルが生成されます。

APNs

「NotificationService.swift」ファイルを開いてください。コードを一通り確認してみましょう。didReceive(:_withContentHandler:)関数に自分で入れたいメッセージをカスタマイズしていきます。

その前に、「payload aps dictionary」に「notification extension」を追加する必要があります。

“mutable-content”:1

これをすることでOSはservice extensionをinitiateします。

もう一つここで追加したいのがユニコーン画像のURLです。前述の通りこのアプリでは誰かがユニコーンの画像を撮ってサーバーにアップロードすると全ユーザーにプッシュ通知が届くようにしたいです。以下がコードになります。

{
“aps”: {
“alert”:“Testing.. (0)“,
“badge”:1,
“sound”:“default”,
“mutable-content”: 1,
“attachment-url”: “https://tinyurl.com/y9exh3by”
}
}

それではNotificationSerivice.swiftに戻って、Appleの方で提供されているコードを編集しましょう。 <画像URLをダウンロードしてプッシュ通知に画像を添付する関数>

didReceive(_:withContentHandler:)関数に下記のように手を加えます。

複雑に見えますが、要はaps dictionaryから値を引き出しているのです。コードを書き換えたら、テストをしてみてください。プッシュ通知にユニコーンの画像が出てきます。

APNs

カスタムのアクションを追加してみる

リモートプッシュ通知を大分使いこなせるようになったのではないでしょうか?ここからはもうひと手間加えてプッシュ通知を更にかっこよくしてみます。例として、画像をLikeしたり、保存できるアクションを紹介します。

NotificationService.swiftファイルに戻って、//4.と//5.の間に下記の//6.を追加してください。

このコードではアクションを2つ追加してunicorningカテゴリに追加しました。unicorningカテゴリに追加すればaps Notification payloadに追加され、プッシュ通知が送られます。そうすることで、Notification Serviceはどんなアクションをプッシュ通知に表示すればいいのか分かるのです。

それではテストしてみましょう。 プッシュ通知をタップすると大きなユニコーン画像の通知が出てきます。

APNs

しかしまだこの任意のアクションをどこでもハンドリングしていません。 AppDelegate.swiftファイルのAppDelegate classの最後の方に以下を追加してください。

func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void)

ここではユーザーがアクションに対してレスポンスした場合、何をするかを定義しています。 例として、ここではレスポンスに対して、ただコンソールにメッセージを表示します。

テストして、LikeかSaveを押してみてください。コンソールにメッセージが表示されます。 実装する際は意図するロジックを実装してください。

APNs

まとめ

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

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

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

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

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

この記事は、flawless社のブログiOS remote push notifications in a nutshell“を著者の了解を得て日本語に抄訳し掲載するものです。Repro published the Japanese translation of this original article on flawless in English under the permission from the author.

「カテゴリ別6選!アプリ収益化に関わる『KPIツリー』作成事例集」にご興味がある方はこちらからダウンロードください。

関連記事はありません