Objective-C
iPhone
Xcode
iOS

iOSでアプリを削除してもデータを保持する方法

More than 1 year has passed since last update.

概要

Keychain Servicesというとパスワードを保存する仕組みだと思われる方が多いと思います。
実際にそうなのですが、Keychainに保存した情報はNSUserDefaultsと違ってアプリを削除した後もデータを保持することができるという別のメリットがあります。
(Keychainの事を知らない人はこちらにとても分かりやすい説明が書いてあります)

そういった要件があるときにNSUserDefaultsのように簡単にデータを保存するライブラリがあったらいいなと思ったら既に作ってる人がいました。
LUKeychainAccessという名前のライブラリです。

Keychain ServicesNSUserDefaultsと違い、気軽に使うにはちょっと面倒な仕組みなのでとてもありがたいです。

追記:

iOSのバックアップを暗号化していない場合はキーチェーンの内容はバックアップされません。
機種変更の時などに初期化されてしまう環境もありますので、その辺も踏まえて利用しましょう。

takayamaさん、ご指摘いただきありがとうございます。

使い方

Security.frameworkをターゲットに追加してください。
次にソースをダウンロードしましょう。

https://github.com/TheLevelUp/LUKeychainAccess

ダウンロードしたソースコード内のLUKeychainAccessディレクトリごとプロジェクトにコピーして、
LUKeychainAccess.hファイルをインポートしましょう。

使い方もとてもシンプルでNSUserDefaultsとほぼ同様の使い方でデータを扱えます。

データの保存

// integer
[[LUKeychainAccess standardKeychainAccess] setInteger:1 forKey:@"integerKey"];
// float
[[LUKeychainAccess standardKeychainAccess] setFloat:1.0 forKey:@"floatKey"];
// double
[[LUKeychainAccess standardKeychainAccess] setDouble:1.0 forKey:@"doubleKey"];
// BOOL
[[LUKeychainAccess standardKeychainAccess] setBool:YES forKey:@"boolKey"];
// NSString
[[LUKeychainAccess standardKeychainAccess] setString:@"string" forKey:@"stringKey"];
// NSObject
[[LUKeychainAccess standardKeychainAccess] setObject:@"object" forKey:@"objectKey"];

セットした値はすぐに保存されます。

保存したデータの読み込み

// integer
NSInteger integerValue = [[LUKeychainAccess standardKeychainAccess] integerForKey:@"integerKey"];
// float
float floatValue = [[LUKeychainAccess standardKeychainAccess] floatForKey:@"floatKey"];
// double
float doubleValue = [[LUKeychainAccess standardKeychainAccess] doubleForKey:@"doubleKey"];
// BOOL
BOOL boolValue = [[LUKeychainAccess standardKeychainAccess] boolForKey:@"boolKey"];
// NSString
NSString *stringValue = [[LUKeychainAccess standardKeychainAccess] stringForKey:@"stringKey"];
// NSObject
NSString *objectValue = [[LUKeychainAccess standardKeychainAccess] objectForKey:@"objectKey"];

と正にNSUserDefaultsと同じ使い勝手でした。