[iPhone] APNs プッシュ通知、デバイストークンの取得

プッシュ通知の実装ができれば、ユーザーに対して色々な情報、広告などを定期的に提供でき、ユーザー側は、メルアドや名前などの個人情報を提供すること無しに価値ある情報を取得できるメリットがあります。
 

Swift 3.0.2
Xcode 8.2.1

 

デバイストークン取得

 
プッシュ通知の大まかな流れをアプリ側から見るとこうなります

  1. Client App から端末に APNs にSSL接続させ deviceToken を取得
  2. Client App が Provider に deviceToken を送出
  3. Provider がその deviceToken を使って特定端末に通知を送る
  4. Client App リモート通知受信のケース分け

公式ガイドは以下にあります
Apple Push Notificationサービス
これにによると、プロバイダ(独自のサーバ)からクライアントアプリケーションへのプッシュ通知の流れはこうなります
 
apns_1

Ref:プロバイダーからアプリケーションにリモート通知を配送する様子

 
メールやその他アプリからの通知はこのようにAPNsを介します
 
では、APNsはどうして個別の端末を特定できるのでしょうか?
それは、最初のアプリの起動時に通知の許可をユーザーに尋ね、許可されたときに端末固有のデバイストークンが生成され、以後このトークンを使って端末を特定して通知情報を送る訳です。
 
先のガイドによれば
「APNsはデバイス証明書に含まれている情報を使用してデバイストークンを生成します。
このデバイストークンには、デバイスの識別子が含まれています。
次に、トークンキーを利用してデバイストークンを暗号化してデバイスに返します。」
 
apns_2

Ref:複数のプロバイダーから複数のデバイスにリモート通知をプッシュする様子

 
ここでは1の deviceToken を取得するところを探っていきますがその前にそれ用のProvisioning Profileが必要です。

  1. Provisioning Profileの作成
  2. デバイストークンを取得するコーディング

 

Provisioning Profileの作成

 
最終的にはPush Notificationsが設定されたProvisioning Profileを作成するのが目的です。
プッシュ通知を行うためのプロジェクトを作成するために
具体的に必要なファイルは

  1. CertificateSigningRequest.certSigningRequest :CSR、証明書署名要求のことです
  2. aps_development.cer / aps.cer:開発証明書(鍵)と配布証明書(鍵)
  3. xxx.mobileprovision / yyy.mobileprovision:開発用と配布用の Provisioning Profile

a. 証明書を要求するための準備

 
CertificateSigningRequest.certSigningRequest を作成します。Certificateの作り方は他のアプリでよくわかっているという方はとばしてください。
これは、ローカルでCSR(Certificate Signing Request)を作り
iOS Dev Center にアップロードして証明書と鍵を受け取るのが目的です
 
Macにある「キーチェーンアクセス」にアクセス
「アプリケーション」「ユーティリティ」
キーチェーンアクセス.app を起動
 

 
キーチェーンのメニューから環境設定を呼び出す。
「メニュー」「環境設定」
 
– 証明書のタブを選択
– オンライン証明書状況プロトコル(切)
– 証明書失効リスト(切)
 
となっていると思いますが確認します
 

 
認証局に証明書を要求 を呼び出す
「キーチェーンアクセス」「証明書アシスタント」「認証局に証明書を要求」
 

 
証明書アシスタントに以下を入力
 
– ユーザーのメールアドレス : 開発者のメールアドレス
– 通称:適当な名前、何でもよい
– CAのメールアドレス : 無記入でよい
– 要求の処理 : ディスクに保存鍵ペア情報を指定にチェック
 

 
CertificateSigningRequest.certSigningRequest をデスクトップに保存するように設定
 

 
鍵のサイズ : 2084ビット / アルゴリズム : RSA であることを確認し 続ける
(鍵ペアを設定しないとこれが出てこないので注意)
 

 
CertificateSigningRequest.certSigningRequest がデスクトップに保存される。
Finderを確認するとファイルができています。
 

b. App IDs の作成

 
iOSアプリでは App ID が通常必要ですが、プッシュ通知では Push Notifications の Service がenableとなっていないといけません。
 
iOS Dev Center からL開発者登録されているID、パスワードでLog inして
「「Certificates, Identifiers & Profiles」に入ります。
尚、ブラウザは Safari が推奨です。
  
Identifiers のカテゴリ下に
App IDs があり、ここに登録します
 
「+」をクリックして新規登録画面に入ります
 


 

App ID Description: アプリの名前を登録します
 

 
「Explicit App ID」を選択してBundle ID を決めます
ドメイン名をひっくり返した形で作ることを推奨されていますがAndroid と同じです
 
例えばあなたのドメインが
http://hoge.com/ でアプリ名が hageapp だと
com.hoge.hageapp とします
これは後々いろんなところで設定するケースがありますのでメモっておきましょう
 

 
そして重要なこととして「Push Notifications」にチェクを入れます。
 
全てできたら「Continue」をクリックします
 

 
「Register」「Done」とするとApp IDs のリストに新しいIDが載っています
 

 
新しくできたできたIDをクリックすると
Push Notifications が Configurable で黄色のままです、これをGreenの Enable にします
注)この段階でダウンロードしてしまうと、後でデバイストークンを取得できません
 
 
「Edit」をクリックして Push Notifications の項目には

  • Development SSL Certificate
  • Production SSL Certificate

の2つがあります。どちらかを「Create Certificate」をクリックします
(注)このまま両方ともPush Notificationsをenableにてしまうと「Production」が優先されて「Development」が機能しないようです。順を追って確認していきたい場合は注意です。
 

 
ここでa.で行ったCSRの作成方法が記述されています。「Continue」
 

 
先ほど作成した「CertificateSigningRequest.certSigningRequest」を選択します
 

 
「Your certificate is ready.」となります
「Download」として出来上がった Certificate をダウンロードします
 

 
App IDに戻るとPush Notificationsはこのようになっています。
 

 
ダウンロードした xxx.cer ファイルをダブルクリックすると
 
 

キーチェーンに登録されます
 
 

c. Provisioning Profile の作成

 
Apple Developer Certificates, Identifiers & Profiles に戻ります
 
Provisioning Profiles の Development あるいは Distribution に Profile を作成して
ダウンロードしていきます
 
まず「+」をクリックして新規登録です
 

 
画面下に入力フォームが出てきます
「Development」 の場合は「iOS App Development」 を選択
「Distribution」の場合でのテストは「Ad Hoc」を
最終的にリリースする場合は「Distribution」の「App Store」を選びます。
 

 
Select App ID では
前に設定した App ID のリストが出てきますので
今回作成したものを選択
 

 
Certificates を選択

 

 
また、登録してある端末を選択
profile の名前を適当に決める(Development かDistributionがわかるように)
 

 
profile が作成されます
「Download」ボタンをクリックして Mac に落とします
 

 
最後にこの xxx.mobileprovision をダブルクリックして
Xcode に反映させます
 

既に作成されリリースしているアプリの場合は、App IDから順番にPush Notifications を設定して最終的にProvisioning Profileを作ってXcodeに反映させ流れです。
 

デバイストークンを取得するコーディング

 
App ID と Provisioning profile が出来たので
Xcode でプロジェクトを作成しデバイストークンを取得しましょう
 
Xcode でプロジェクトを作成します
プロジェクトの「TARGETS」->「General」にある
「Bundle identifier」を App ID で決めた Bundle ID にします
 

 
Projectで作ったプロジェクト名とアプリ名とが合わない場合、App ID で作成した Bundle ID とプロジェクトの名前が合わないなどは「TARGETS」「Info」の Bundle identifier をマクロを消すことで直接書き込みます。
例えばApp IDで com.hoge.hage と設定されていても、プロジェクトでは com.hoge.Hage になってしまっているケースがあります。
 

 
次に、コードの記述をします
 
AppDelegate.swift

 
「Capabilities」の設定として「Push Notifications 」をenableにします。
 

 
これを設定しないと以下のようなエラーになります。

 
これでビルドし実機で Run します。simulatorでは確認できません。
こんなエラーになります
 

 
最初の起動後に許可を求めるダイアログが出ます。
 

 
「許可」を選択するとデバックログにデバイストークンが出力されます
このトークンは後で使いますので、メモっておきましょう。
(注)トークンはBuild、installするたびに変わることがあります。
 

 
ここまで、デバイストークンを取得するところまでです
次は、サーバーへの送信について
 

  1. Client App から端末に APNs にSSL接続させ deviceToken を取得
  2. Client App が Provider に deviceToken を送出
  3. Provider がその deviceToken を使って特定端末に通知を送る
  4. Client App リモート通知受信のケース分け

ページのトップへ戻る

シェアする

  • このエントリーをはてなブックマークに追加

フォローする