戻る
■考察: 処理の流れについて
※ログインして使うアプリの設計メモ ※ユーザ情報のテーブルとデバイス情報のテーブルがある想定 ※「ログインしなくても基本機能は使える」「プッシュの送信を許可しなかった」も考慮する ※デバイストークンは非同期で取得されるので、 「アプリ起動時に端末情報を同期」と「アプリ起動時にデバイストークンを同期」の計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