引き続き、テキスト漫画サイトのガワネイティブアプリの作成を行っています。
今日は、昨日取得したユーザを識別するID(idfv)をアプリで保存するようにしました。
基本的にidfvは変わらないものなのですが、過去、iOSでアプリをアップデートするとidfvが変わってしまうというバグがあったらしいです。そのため、念のため1度取得したidfvはアプリにデータとして保存し、2回目以降は保存したデータからidfvを取得しようと思います。
こうすることで、もし再度バグなどが発生してidfvが変わってしまっても大丈夫になります。
コードは以下のようになりました。
struct Constants {
enum User : String {
case idfv
}
}
〜 略 〜
// デバイスの識別
let idfv : String!
if UserDefaults.standard.object(forKey: Constants.User.idfv.rawValue) != nil {
// UserDefaultsにある場合、それを使用
idfv = UserDefaults.standard.string(forKey: Constants.User.idfv.rawValue)
} else {
// UserDefaultsにない場合、IDFVを取得
idfv = UIDevice.current.identifierForVendor!.uuidString
// idfvは36文字だが、念のためハイフンをのぞいて32文字以上あれば正常に取得できたと判断して保存
if (32 <= idfv.count) {
// 保存
UserDefaults.standard.set(idfv, forKey: Constants.User.idfv.rawValue)
// 削除する場合は以下
//UserDefaults.standard.removeObject(forKey: Constants.User.idfv.rawValue)
}
}
尚、アプリを再インストールした場合(正確には同一ベンダーのアプリが全てアンインストールされた場合)もidfvが変わってしまいますが、その場合はUserDefaultsも消えてしまうのでどのみちidfvは保持出来ません。
UserDefaultsとは別に、Keychain Servicesというものがあり、こちらを使えばアプリをアンインストールしても値を維持出来そうです。一瞬、これを利用しようかと思いましたが、
めんどうそうなので諦めました。
,! \
,!\ ! \
i \ l \,,..__
,i′ ,\___,,--―l \::゙'冖ーi、、
i :;\::::::::::..l `'‐、、
/__,..;:r---―-、,..__. ,;'il:;} .;:::`L__
,.:f''""゙゙゙´ 、 ̄ヽ,// ...::::::l;;;:;;::::
_/ ...... 、 \//、 ::::::::リ;;:::::::::....
// ......:;::::::::::::. ヽ、\ ゙ヽ ヘ ● ....:::::::::i';;;;::::::::::::
;;/ ::::::::::::;;;;;ノ ̄\:: 〉 〉゙'、 `ヽ_ノ ......:::::::.;;;:ノ:;;;:::::::::::::
/ ..::::、__;;ノ;;;`ヽ_/: / /⌒)メ、_ノ/ .....:::::;;;/;;;:::::;;:::::::::
..:::イ;;.ヽ::;;;;;;;;;(__ノ /'"..:::::::::::::/ ...............:::::::::::;;;,;ノ;;::::::::::::::::
:::::::l;;;;;;;;;\;;;;;;;,.(__ノ;.;:.\:::::::::/::::::::::::::::::::::::::::;;;;;/;:::::::::::::::::
::::::::,!::;;;;;;;;;;:.`゙'-、、 ::: \_/::::::::::;;;___,.;-―''"::::::::::::::::::::::::
..::::::::::,!;;;;;:;;;;;:::;;;;;:::;;;;;;`゙ ̄'''冖''―--―'";;;;;;;;;:::::::::::::::::::::::::