[ObjC][Xcode5] 簡単!Keychain Sharingで異なるアプリ間のデータ共有


けっこう簡単にできたのでメモ。

「(同じプロビジョニングを使用した)異なるアプリ間でデータ共有する方法」です。
KeychainSharingを利用するので、アプリを削除してもデータは消えません。
この領域に保存されたものは暗号化される?のでパスワードなどの保存領域として利用するものらしい。

データを保存する側のプロジェクト作成

まずはデータを保存する側のプロジェクトを適当に名前をつけて作成。

0_project

KeyChainGroupのIDをつける

次にKeychain のグループIDを付けます。任意でOKです。
※ここでは「jp.itoz.sample.TestKeyChainSharing」としました。

他のアプリでも同じものを使います。

1_keyChainIdSet

上記グループIDが設定されると、「.entitlements」ファイルが出来ています。
中を覗いてみると、先ほどのIDの前に、$(AppIdentifierPrefix)が付加されていますね。
※このファイルを直接書き換えるとなんかエラるので触らないほうが良いのかも?。(よくわからないだれか教えて。。)

2_entitlement

データを保存してみる

さっそくデータ保存してみます。
今回は、NSUserDefaultsのようにKeychainのデータにアクセスできるというライブラリ、LUKeychainAccess をつかってみます。

cocoapodで提供されているので、普通にPodfileを作成して $pod installします。

3_lukeychainaccess

インストール完了したらXcodeをワークスペースから開き直して、適当にAppDelegateとかイニシャルViewControllerとかで下記のコードを実行。



#import "LUKeychainAccess.h"
NSString * const kKeyDic = @"KEY_CHAIN_SHARING_KEY_DIC";

()

//--------------------------
// 適当なNSDictionaryを作成
//--------------------------
NSDictionary *userDic = @{
              @"userName":@"itoz"
            , @"password":@"aaaaaaaaaaaaa"
            };

//--------------------------
// 保存
//--------------------------
[[LUKeychainAccess standardKeychainAccess] setObject:userDic forKey:kKeyDic];

他のアプリからデータを取得

先ほどと同じ手順で、取得がわの別アプリを作成します。
再度新規プロジェクト作成し、cocoapodでLUKyechainAccessをインストールし、同じKeychainグループIDをセットします。

取得コードはこんな感じ


#import "LUKeychainAccess.h"
NSString * const kKeyDic = @"KEY_CHAIN_SHARING_KEY_DIC";

()
//--------------------------
// 取得
//--------------------------
NSDictionary *userDic = [[LUKeychainAccess standardKeychainAccess] objectForKey:kKeyDic];

NSLog(@"%@",userDic);

とすると、先ほどのアプリで保存したデータが取得できているのが、出力で確認できます!
すごい簡単!

4_nslog

注意

この方法で保存すると、意図的に消さない限りデータは残り続けるのでそのへんは気にした方がいいかも。

最後に

違うよ!もっとこうした方がいいよ!
などありましたらコメントいただけると嬉しいです。