メモ > 技術 > サービス: AmazonSNS > 考察: 処理の流れについて
考察: 処理の流れについて
※ログインして使うアプリの設計メモ。
※ユーザ情報のテーブルとデバイス情報のテーブルがある想定。
※「ログインしなくても基本機能は使える」「プッシュ通知の送信を許可しなかった」も考慮する。
※デバイストークンは非同期で取得されるので、
「アプリ起動時に端末情報を同期」と「アプリ起動時にデバイストークンを同期」の計2つのAPIが必要になる。
■前提
起動時にアプリから実行するAPIは以下の2つ。
ただしプッシュ通知が許可されない(デバイストークンを取得できない)場合は前者のみ実行する。
アプリ起動時に端末情報を同期。(OSバージョンやアプリバージョンなど、デバイストークン以外の情報を同期。)
/api/device/sync
アプリ起動時にデバイストークンを同期。
/api/device/sync_token
■アプリ初回起動時
「アプリ起動時に端末情報を同期」を使用し、アプリからPHPに、OSバージョンやアプリバージョンなどを送る。
PHPがDBに、OSバージョンやアプリバージョンなどを記録する。さらに全端末でユニークな識別コードを作成し、合わせてDBに保存する。
PHPからアプリに、識別コードを返す。アプリはこの値を保存しておく。
プッシュ通知が許可されるとデバイストークンを取得できるようになる。
「アプリ起動時にデバイストークンを同期」を使用し、アプリからPHPに、識別コードとともにデバイストークンを送る。
PHPがAmazonSNSから、エンドポイントを取得する。
PHPがDBに、デバイストークンとエンドポイントを記録する。
PHPからアプリに、識別コードを返す(正常終了の判定などに使う。)
■アプリ次回起動時
「アプリ起動時に端末情報を同期」を使用し、アプリからPHPに、識別コードとともにOSバージョンやアプリバージョンなどを送る。
PHPがDBに、OSバージョンやアプリバージョンなどを記録する。(最新情報として上書き更新する。)
プッシュ通知が許可されていればデバイストークンを取得できる。
「アプリ起動時にデバイストークンを同期」を使用し、アプリからPHPに、識別コードとともにデバイストークンを送る。
PHPがAmazonSNSから、エンドポイントを取得する。
PHPがDBに、デバイストークンとエンドポイントを記録する。(対象データは、識別コードをもとに判断する。)
PHPからアプリに、識別コードを返す。(正常終了の判定などに使う。)
■プッシュ通知拒否時
アプリ初回起動時にプッシュ通知の送信を拒否した場合、デバイストークンの取得ができない。
この場合、「プッシュ通知が許可されていれば」の処理は行われないので、デバイストークンやエンドポイントは無いままで動作する。
■端末ごとの設定
端末ごとの設定を持ちたければ devices のレコードに保存する。
必要に応じて、設定は端末内にもキャッシュとして保存しておく。(インターネットに繋がっていなくても設定内容を参照できるように。)
■ログイン時
アプリ内でユーザ名とパスワードを入力し、その値をPHPに送る。
認証情報が正しければ、データベーステーブルのデバイス情報をユーザ情報に紐付ける。
デバイス情報にはログイン中か否かのステータスも持たせておき、そのステータスをログイン中にする。
(厳密なログイン判定が不要なら、デバイス側に単純なログインフラグを持たせておくか。厳密なログイン判定が必要なら、ユーザ情報にも識別コードを持たせてそれをアプリ内に記録させ、アプリ起動時に毎回サーバ側でチェックするか。)
以降のログインは、アプリ内に保存されている識別コードをもとに行う。
■別端末でログイン時
上とまったく同じ流れでデバイストークンやエンドポイントを記録する。
端末情報テーブルには、同じユーザIDのデータが別途作成される。
■ログアウト時
アプリからPHPに、デバイストークンを投げてくる。
データベーステーブルのデバイス情報とユーザ情報の紐付けを解除する。
ログイン中か否かのステータスをログアウトにする。
■ログアウトして別ユーザでログイン時
「ログアウト時」の手順でログアウトし、「ログイン時」の手順でログインする。
■プッシュ通知送信時
PHPがAmazonSNSを使って、エンドポイントに対してプッシュ通知を送信する。
1ユーザが複数の端末を持っていれば、それぞれにプッシュ通知が送信される。
■セッションタイムアウト時
デバイストークンはDBにあるので、それをもとにプッシュ通知は届き続ける。
アプリを立ち上げると、その時点でデバイストークンの更新処理が走る。
※iOSアップデートのタイミングでデバイストークンが変わる可能性があるらしい。
デバイストークンが変わるタイミングは不定らしいので、デバイストークンがいつ変わっても大丈夫な仕組みにする必要がある。
iOS 9からAPNsデバイストークンがアプリインストールの度に変わるようになったようです - Qiita
https://qiita.com/mono0926/items/9ef83c8b0de0e84118ac