リモート通知(Push通知) [Swift][iOS8] (2/2)

2015年6月4日

ios

 

 

前回の記事においてiOS Dev Center等での作業が済んだので、

Swift(Xcode6.3/iOS8.3)及びプロバイダ側(PHP/MySQL)の作業に移る。

 

 

以下リモート通知の一般的な流れに沿って説明する。

 

Pushフロー

 

 

1.プッシュ通知の許可/デバイストークンの受け取り


 

■通知の許可

 

前回記事にて作成した「PushApp」プロジェクトを開き、

AppDelegate.swiftのdidFinishLaunchingWithOptionsメソッドに

以下のようにコードを記述する(以下全てAppDelegate.swiftにコードを記述)。

 

実機(iPhone等のデバイス)に「PushApp」アプリをインストールし起動させると初めの一回だけ、ユーザにはダイアログが表示され通知の許可が問われる。「OK」をクリックすると「APNs(アップルの通知サービス)」にデバイスが登録される。登録に成功すると「APNs」からデバイス固有のデバイストークンが送られてくる。

 

Push許可

 

 

■デバイストークンの受け取り

 

「APNs」から送られてくる「デバイストークン」を受け取るには

didRegisterForRemoteNotificationsWithDeviceTokenメソッドを追加する。

didFailToRegisterForRemoteNotificationsWithErrorメソッドは

トークンをうまく受け取れなかった場合に呼ばれる。

 

実質的にアプリ側は上記のコードのみで通知を受け取ることができる。(もちろんプロバイダ側としてはこれから説明する準備が必要)。

SwiftでPush通知を参照。

 

 

 

2.デバイストークンをプロバイダへ送る


 

「APNs」から受け取ったデバイストークンをプロバイダ(PHP/MySQL)へ送る。

(APNs → デバイス → PHP →MySQL)

 

デバイストークンを受け取り、MySQLへ登録するPHPのファイル名は「register.php」にした。

 

Xcode(Swift)

didRegisterForRemoteNotificationsWithDeviceTokenメソッドに

以下のようにコードを追記する(13〜27行目)。

 

次にデータベースを用意して、デバイストークンを登録するテーブルを作成する。

 

テーブル名は「push_device」にして、以下のようなテーブル構造にした。

 

phpMyAdminでの表示

push_device

 

 

register.php

 

アプリからデバイストークンを受け取ったら(21行目)、 「push_device」テーブルにトークンがあるかを確認する(36行目)。新しいトークンが送られた場合、テーブルに入力される。

 

 

 

3./4.プロバイダからリモート通知をおこなう


 

プロバイダからAPNsに接続し、リモートをおこなう。そのためのPHPファイルを作成する。名前はpush.phpした。

 

 

■ペイロードとは?

 

プロバイダでは通知するタイミングやその通知内容を決める。通知内容のデータはペイロードと呼ばれ、APNs定義のプロパティ(キーapsとalertなどのもう一つのキー)を含むプロパティリスト(JSON)で構成される。iOS8以降ではこのペイロードのサイズはAPNsによって最大2キロバイトまでが許されているが、それ以前のバージョンでは256バイトまでとなっている。

 

APNs定義の基本的なプロパティキー

・alert(テキスト)

・badge(アイコンに表示される数字)

・sound(指定しない場合はデフォルト)

 

また上記(apns名前空間)の他にカスタム情報を付け加えることができる。

 

詳しくはプログラミングガイド(PDF)を参照。

 

 

■APNsとの接続(ソケット接続)

 

リモート通知する際のプロバイダの構成(push.php)はおおよそ以下のようになる。

 

・ペイロードを作成する。

・データベース(MySQL)に保存してあるデバイストークン(今回はpush_deviceテーブル)を抽出し、それぞれのトークンに対してAPNsに通知する。

 

 

push.php

 

最後にXcodeにてAppDelegate.swiftに

didReceiveRemoteNotificationメソッドを追加しておく。

 

以上を実装し、push.phpを実行すれば、APNsからデバイスに通知がおこなわれるようになる。

 

アプリを起動させたままでの通知、もしくは通知からアプリを起動させた場合、Xcodeのログを見ると、apsキー(alert/badge)と自分で決めたカスタムキー(custom_text)によって構成されているペイロードがちゃんと表示されていることが分かる。

 

ちなみに通知を受け取った際のデリゲートは2つ。

 

didFinishLaunchingWithOptions
アプリが起動していない時、アプリが起動する時に呼ばれる。

didReceiveRemoteNotification
アプリが起動している状態、通知から起動する時に呼ばれる。

 

 

プロバイダのディレクトリ

作成したSSL証明書(今回は開発用)も忘れずに。

ディレクトリ

 

今回作成したのはアプリをダウンロードしたデバイス全てに通知をおこなうシステムだが、実際にはトークンのみならずデバイスのiOSバージョン等をプロバイダに登録し、ユーザーごとに振り分けて通知をおこなうことができる。

 

 

 

実際の運用を巡って


 

今回作成したのはメッセージを送るためだけのアプリであり、単純化してプロバイダなどを構築している。趣味で利用するテストアプリなら問題ないが、実際のリモート通知運用には以下の実装等が必要となる。

 

・プロバイダから通知する際に、無効となったデバイストークン(端末からアプリが削除されるなど)は、あらかじめはじいて処理をする。

 

・APNsに対する一度の通信である限度を超えると、APNsから通信を遮断されてしまうのでその対策をしなければならない。

 

その他にも、ユーザー数が増えたアプリともなるとスケーラビリティの処理などが発生するため、apnsPHPのようなライブラリーの活用、もしくはAmazon SNSなどの外部サービスの検討が必須となってくる。

 

関連ページ

Amazon SNSでリモート通知(Push通知)をおこなう

 

 

■参照サイト

 

これは罠。PHPでiPhone端末にPUSH通知を送る際の落とし穴

 

APNs通知が送信出来た! その後にやること

 

以上

 

 

参照文献


 

プロバイダとしてapnsPHPライブラリーを活用している。

 

新しい本ではないが、リモート通知に関しての説明は分かりやすい。

本ブログにおいてpush.phpでのソケット通信実装の参考にさせて頂いた。

Copyright © 2019 アクト・オブ・リーディング All Rights Reserved.  プライバシーポリシー