メモ > 技術 > サービス: 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