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にしてください。

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

ステップ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してください。

<.cer 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の中に下記を入れてください。

このコードはUserNotificationCenterインスタンスにアクセスし、ユーザーにアラート、サウンド、バッジを使ったプッシュ通知を送っていいかの許可を取っているものです。もし、許可が取れたらshared applicationインスタンスのregisterForRemoteNotifications()関数をmainスレッドで呼び出します。 ここでmainスレッドで呼び出さないとバックグラウンドでの実行となりエラーメッセージが出てしまいます。

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

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

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

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

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ボタンを押してみましょう。

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

リッチ通知を試してみる

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

Appleのページにおいて、

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

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

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

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

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

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から値を引き出しているのです。コードを書き換えたら、テストをしてみてください。プッシュ通知にユニコーンの画像が出てきます。

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

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

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

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

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

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

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

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

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

まとめ

今回は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.


モバイルアプリの成長支援パートナー「Repro」

「Growth Hack Journal」を運営している「Repro」は、アプリ解析・マーケティングツールの提供からユーザ獲得やユーザ定着のためのマーケティング支援等のソリューションまでワンストップで提供、アプリの成長を支援しています。

提供サービスについて詳細はこちら


【毎月5社 限定】ASO無料診断実施中!

ユーザーがアプリ見つけやすいよう、アプリストア内のコンテンツを最適化することは重要です。ASOの改善余地について、無料で診断します。

お問い合わせはこちら

プッシュ通知許諾率無料診断実施中!

自社アプリのプッシュ通知の許諾率の解析、および許諾率を改善した場合に増加するユーザーの再訪数やコンバージョン数を無料でシミュレーションします。

お問い合わせはこちら