iOS8の新機能、App Extensionでアプリを作ってる上で必要になったので、AppGroupを使ってみました。
・アプリとApp Extension間でのデータのやりとりをしたかった
・App Extensionでファイルの読み書きをしたかった
ってところらへんが背景にあります
ということで備忘録代わりに早速書いていきます
準備
App Groupを使うためにはiOS Dev CenterでApp Groupを登録する必要があります。
まずiOS Dev CenterのApp Groups上でGroup IDを追加します。
"group.com.test.apps"という感じで、アプリのBundle Identifierの前に"group."をつける形が良いかと思います
(そもそも登録時にデフォルトでgroup.って入ってますしね)
次に、共有したいアプリをXcodeで開いて、
Project > Capabilities > App GroupsをONにします。
ONにすると、先ほどiOS Dev Centerで登録したGroup IDが表示されるので、チェックボックスにチェックを入れます。
※このXcode上で行う設定は、共有したいアプリ全てに設定してください。
実装
準備ができたら実装に移ります。
プロジェクト内のファイルを、共通領域のshared containerに配置します。
//共通領域のファイルパスを取得
NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test.apps"];
fileURL = [fileURL URLByAppendingPathComponent:@"test.txt"];
//ファイルが存在するかチェック
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:[fileURL path]];
if (!fileHandle) {
//ファイルがなかったらApp Group領域へ
NSString *src = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
NSData *textData = [NSData dataWithContentsOfFile:src];
//共通領域にファイルを生成する
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL result = [fileManager createFileAtPath:[fileURL path] contents:textData attributes:nil];
if (result) {
NSLog(@"create file success >> %@", fileURL);
} else {
NSLog(@"create file error");
return NO;
}
} else {
//ファイルがあったら何もしない
NSLog(@"file already exists >> %@", fileURL);
}
こんな感じです。
ファイルをNSDataに落としてから、ファイルを生成し直すという処理にしてますが、ファイルコピーをすることができなかったのでこんな感じにしてます。
生成されたファイルを読み込むには、上述したソースの冒頭と全く一緒ですが、
//共通領域のファイルパスを取得
NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test.apps"];
fileURL = [fileURL URLByAppendingPathComponent:@"test.txt"];
で、ファイルパスは取れるので、後は読みこむなり、書き込むなり、煮るなり焼くなり好きにしてください。
◯余談
今回は使わなかったのですが、NSUserDefaultsもアプリ間で共有できるようです。
// Save to shared UserDefaults
NSUserDefaults *ud = [[NSUserDefaults alloc] initWithSuiteName:@"group.test.apps"];
[ud setObject:@"hogehoge" forKey:@"testKey"];
[ud synchronize];
// Load to shared UserDefaults
NSString *test = [ud objectForKey:@"testKey"];
NSLog(@"shared defaults value >>>> %@",test); // shared defaults value >>>> hogehoge
こんな感じかな・・。
App ExtensionやらApp Groupやら、まだまだ情報が少ないので気づいたことがあれば徐々に掲載していきたいですね。