そろそろiOS8の正式なリリースも間近になってきましたね。 iOS8のリリースと同時に、新しいアプリ間情報共有機能、 App Groupが使えるようになります。 iOS8 の新機能、App Extension にも必須な機能なので、使い方をちょっとまとめてみました。
App Groupとは
App Groupとは、複数のアプリの間でデータを共有できるようになる新しい機能です。
今までも Keychainの仕組みを使うことでアプリ間のデータ共有はできました。 でもKeychainの使い方ってちょっとめんどうだったり、機種変更したときにデータが復元されないこともあったり、あまり使い勝手がよくないところもありますよね。
App Groupを使うと、今までと同じNSUserDefaultsなどを利用してデータ共有をすることができます。 また、App Extensionではこの仕組みを使うとアプリとExtension間のデータ受け渡しが楽になります。 App Extensionを使う方は是非チェックしてみてください。
App Groupで共有できる範囲
App Groupでは、アプリとアプリの間、アプリとApp Extensionの間でデータ受け渡しをすることができます。
ただし、違う会社からリリースされているアプリの間での情報共有はできません。 App Groupの設定をするためには、同じ Developerからリリースされているアプリである必要があります。
App Groupを使うと、NSUserDefaultsを使った設定情報の共有とNSFileManagerを使ったファイルの共有ができます。
App Group を使った情報共有方法(準備)
さて、 App Groupを使うためには、まず iOS Dev Centerで App GroupのGroup IDを登録します。 「group.com.example.mygroup」というように、Bundle Identifierと同じようにドメイン名などから生成した一意な文字列の先頭に「group」をつけるのがいいでしょう。
Dec Centerでの設定が終わったら、共有したいアプリをXcodeで開きます。 ProjectファイルのCapability タブを開き、 App Groupの設定をonにします。 App Groupの機能をonにすると、さきほど iOS Dev Centerで設定した Group IDが表示されるので、チェックボックスをonにします。
すると、プロジェクトにEntitlementファイルが追加されます。 共有をしたいアプリやExtensionのすべてについてこの設定を行ってください。
App Group を使った情報共有 - shared userdefaults
ProjectファイルのApp Groupの設定が完了したら、アプリ間で共通につかえるデータ領域が確保されます。
まずは、共通の設定領域、shared userdefaultsから試してみましょう。
まずは設定した Group IDを使って、NSUserDefaultsのインスタンスを生成します。 あとは、通常のNSUserDefaults処理と同じように使えます。
// Save to sharedDefaults NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.example.mygroup"]; [sharedDefaults setObject:@"Kaoru" forKey:@"MyName"]; [sharedDefaults synchronize];
shared userdefaultsからの読み込みもほぼ同様です。
// Load from sharedDefaults NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.example.mygroup"]; NSString* strValue = [sharedDefaults objectForKey:@"MyName"]; NSLog(@"strValue is %@",strValue);
App Group を使った情報共有 shared container
さて、次はNSFileManagerを使って、共通領域、shared container のファイルを読み書きしてみましょう。
NSFileManagerのcontainerURLForSecurityApplicationGroupIdentifierを使い、Group IDを指定して shared container のパスへのNSURLを取得します。 そのパスにファイル名を付加して、あとは通常通りにsave/loadをすれば大丈夫です。
// Save to sharedContainer NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.example.mygroup"]; fileURL = [fileURL URLByAppendingPathComponent:@"data.plist"]; NSDictionary* dict = @{ @"place":@"Tokyo", @"tel":@"03-1234-5678"}; [dict writeToURL:fileURL atomically:YES];
shared containerからの読み出しも同様です。
// Load from sharedContainer NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.example.mygroup"]; fileURL = [fileURL URLByAppendingPathComponent:@"data.plist"]; NSDictionary* dict = [[NSDictionary alloc] initWithContentsOfURL:fileURL]; NSString* strPlace = [dict valueForKey:@"place"]; NSLog(@"strPlace is %@",strPlace);
App Groupで保存された情報
さて、これで複数のアプリから、同じ領域のNSUserDefautlsやファイルにアクセスできるようになりました。
ただ、App Group機能については、まだまだ詳細な情報は少ないです。 iOS8がリリースされてから、実機であらためて確認したほうがよさそうですね。