App Groupでアプリ間データ共有

そろそろ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がリリースされてから、実機であらためて確認したほうがよさそうですね。

リンク