読者です 読者をやめる 読者になる 読者になる

NSBlogger

意識高いブログ

Watch Kit AppとiPhone App間でNSUserDefaultsを使ってデータ共有をする

objectivec watchOS

Watch Kit AppとiPhone Appのデータは別管理

基本的にWatch Kit AppとiPhone Appがそれぞれ保持するデータ領域は別々に管理されています。したがって、下記の設定を行わずにNSUserDefaultsを使ってみると、Watch Kit Appで保存したデータはWatch Kit Appからしか利用することはできません。逆もしかり。
Watch Kit AppとiPhone App間でデータ共有できたらいいなぁと考えますよね。
そんなときはApp Groupsを設定してあげればOK。

App Groupsを作る

Watch Kit App はiOSのExtentionと同じ仕組みで動作します。
iPhone Appとのデータ共有をする際は、App GroupsというIdentifierを使う必要があります。
f:id:Kamekiti:20150215234833p:plain
作り方は簡単。iOS Dev Centerの「App Groups」から新規にIdentifierを設定します。
名前は「group.jp.co.hogehoge」みたいな感じで、接頭辞に「group」をつけることが推奨されています。

App GroupsをXcode上で設定する

f:id:Kamekiti:20150215235027p:plain
XcodeのTARGETから「Capability」タブを選択し、App GroupsをONにします。
さきほど作ったIdentifierを設定すれば完了。
ちなみにこの作業はiPhone AppのTARGETとWatch KitのTARGET両方に設定する必要があります。片方にしか設定していないとデータ共有がうまく行われません。

NSUserDefaultsからデータの読み込みおよび保存

App Groupsを作ればあとは、いつものようにNSUserDefaultsを使えばデータを共有することが可能です。

データの保存

NSUserDefaults *storage = [[NSUserDefaults alloc] initWithSuiteName:@"group.jp.co.hogehoge"];
[storage setObject:data forKey:WATCH_APP_KEY];
[storage synchronize];

データの読み込み

NSUserDefaults *storage = [[NSUserDefaults alloc] initWithSuiteName:@"group.jp.co.hogehoge"];
NSData *data = [storage objectForKey:WATCH_APP_KEY];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSUserDefaultsでinitWithSuiteName:を使ってApp GroupsのIdentiferを使って情報取得する必要があります。