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

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

 

sponsored link

デバイストークン取得

 
公式ガイドは以下にあります
Local および Push Notification プログラミングガイド
これにによると、プロバイダからクライアントアプリケーションへのプッシュ通知の流れはこうなります
 
apns_1
 
メールやその他アプリからの通知はこのようにAPNsを介します
 
では、APNsはどうして個別の端末を特定できるのでしょうか?
それは、最初のアプリの起動時に通知の許可をユーザーに尋ね、許可されたときに端末固有のデバイストークンが生成され、
以後このトークンを使って端末を特定して通知情報を送る訳です
 
先のプログラミングガイドによれば
「APNsはデバイス証明書に含まれている情報を使用してデバイストークンを生成します。
このデバイストークンには、デバイスの識別子が含まれています。
次に、トークンキーを利用してデバイストークンを暗号化してデバイスに返します。」
 
apns_2
 
プッシュ通知の大まかな流れをアプリ側から見るとこうなります

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

ここでは1の deviceToken を取得するところを探っていきます
 
プッシュ通知を行うためのプロジェクトを作成するために
具体的に必要なファイルは

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

 

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

 
CertificateSigningRequest.certSigningRequest を作成します
これは、ローカルでCSR(Certificate Signing Request)を作り
iOS Dev Center にアップロードして証明書と鍵を受け取るのが目的です
 
Macにある「キーチェーンアクセス」にアクセス
「アプリケーション」 ->「ユーティリティ」
キーチェーンアクセス.app を起動
 
スクリーンショット 2014-01-28 13.27.36
 
キーチェーンのメニューから環境設定を呼び出す。
「メニュー」 -> 「環境設定」
 
– 証明書のタブを選択
– オンライン証明書状況プロトコル(切)
– 証明書失効リスト(切)
 
とします
 
スクリーンショット 2014-01-28 13.29.26
 
認証局に証明書を要求 を呼び出す。
「キーチェーンアクセス」 -> 「証明書アシスタント」
->「認証局に証明書を要求」
 
スクリーンショット 2014-01-28 13.30.38
 
証明書アシスタントに以下を入力
 
– ユーザーのメールアドレス : 開発者のメールアドレス
– 通称:適当な名前、何でもよい
– CAのメールアドレス : 無記入でよい
– 要求の処理 : ディスクに保存鍵ペア情報を指定にチェック
 
スクリーンショット 2014-01-28 13.32.52
CertificateSigningRequest.certSigningRequest をデスクトップに保存するように設定
 
スクリーンショット 2014-01-28 13.33.38
 
鍵のサイズ : 2084ビット / アルゴリズム : RSA であることを確認し 続ける
 
スクリーンショット 2014-01-28 13.34.04
 
CertificateSigningRequest.certSigningRequest がデスクトップに保存される。
 
スクリーンショット 2014-01-28 13.34.23
 

b. App IDs の作成

 
アプリ開発では App ID が通常必要ですが
プッシュ通知では Push Notifications の Service がenableとなっていないといけません
 
iOS Dev Center(http://developer.apple.com/devcenter/ios)に入り
Log In から開発者登録されているID、パスワードで入ります
尚、ブラウザは Safari が推奨です。
 
Certificates,Identifiers & Profilesを開きます
 
Identifiers のカテゴリ下に
App IDs があり、ここに登録します
 
「+」をクリックして新規登録画面に入ります
 
app-id_1
 
アプリの名前を登録します
 
app-id_2
 
「Explicit App ID」を選択して
Bundle ID を決めます
ドメイン名をひっくり返した形で作ることを推奨されています
Android と同じですね
 
例えばあなたのドメインが
http://hoge.com/ でアプリ名が hageapp だと
com.hoge.hageapp とします
これは後々いろんなところで設定するケースがありますので
メモっておきましょう
 
app-id_3
 
そして重要なこととして「Push Notifications」にチェクを入れます。
 
全てできたら「Continue」をクリックします
 
apns_3
 
確認画面となり「Submit」をクリックすると
App ID が最終的に出来上がります
「Done」で元に戻り、App IDs のリストに新しいIDが載っています
 
apns_4
 
新しくできたできたIDをクリックすると
Push Notifications が Configurable で黄色くなっています
これをEnable にします
注)この段階でダウンロードしてしまうと、後でデバイストークンを取得できません
 
apns_5 
「Edit」をクリックして Push Notifications の項目で
「Create Certificate」をクリックして
 
apns_7
 
「Continue」
 
apns_8
 
先ほど作成した「CertificateSigningRequest.certSigningRequest」を選択します
 
apns_9
 
「Your certificate is ready.」となります
「Done」として出来上がった Certificate をダウンロードします
 
apns_10
 
ダウンロードした xxx.cer ファイルをダブルクリックすると
 
apns_11
 
キーチェーンに登録されます
 
apns_12
 
尚、これは開発用なので、同様に製品用も別個に作成します
 

c. Provisioning Profile の作成

 
Apple Developer Certificates, Identifiers & Profiles に戻ります
 
Provisioning Profiles の Development と Distribution に Profile を作成して
ダウンロードしていきます
 
まず「+」をクリックして新規登録です
 
provisioning_1
 
画面下に入力フォームが出てきます
「Development」 の場合は「iOS App Development」 を選択
「Distribution」の場合は「App Store」あるいは「Ad Hoc」を選びます

 
apns_13
 
Select App ID では
前に設定した App ID のリストが出てきますので
今回作成したものを選択
 
provisioning_3
 
Certificates を選択(DevelopementとDistributionそれぞれ)

 
provisioning_4
 
また、登録してある端末を選択
profile の名前を適当に決める(DevelopementとDistributionそれぞれ)
 
provisioning_7
 
profile が作成されます
「Download」ボタンをクリックして Mac に落とします
 
provisioning_6
 
最後にこの xxx.mobileprovision をダブルクリックして
Xcode に反映させます
 
provisioning_8

 

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

 
App ID と Provisioning profile が出来たので
Xcode でプロジェクトを作成しデバイストークンを取得しましょう
 
Xcode でプロジェクトを作成します
プロジェクトの「TARGETS」->「General」にある
「Bundle identifier」を App ID で決めた Bundle ID にします
 
apns_15
 
アプリ名が合わない場合、App ID で作成した Bundle ID とプロジェクトの名前が合わないなど
「TARGETS」->「Info」の Bundle identifier をマクロを消して直接書き込みます
 
apns_14
 
次に、「TARGETS」->「Build Settings」にある
「Code Singing Identity」の Debug Any iOS SDK に
Apple Development iOS Push Services: ……. をセットします
 
apns_16
 
同様に、Release Any iOS SDK に
Apple Production iOS Push Services: ……. をセットします
 
apns_17 
これらの Apple Development iOS Push Services:…
Apple Production iOS Push Services:…… が候補としてあがってこない場合は
キーチェーンアクセスに証明書が登録されているか確認します
 
次に、コードの記述をします
iOS8から取得方法が変わりました
ただ、まだiOS7も市場にあるので切り分けをしないといけません
 

Objective-C のケース

 
AppDelegate.m にある
didFinishLaunchingWithOptions を以下のように修正し
Badge, Sound, Alert を通知対象として登録します
ここでアラートが出て、プッシュ通知の許可をユーザーに尋ねます
 

 
ユーザーが許可をするとデバイストークンを取得します
 

 

Swift のケース

 

 

 
これでビルドし実機で Run します
シミュレータでは確認できません
 
ビルドでこのような Warning が出るかもしれませんが
Fix Issue するとうまく修正してくれます
 
apns_18
 
最初の起動直後に Alert が出ます
 
apns_20
 
「OK」を選択するとデバックログにデバイストークンが出力されます
このトークンは後で使いますので、メモっておきましょう
 
apns_19
 
ここまで、デバイストークンを取得するところまでです
次は、サーバーへの送信について
 

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