19
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

App Groupを使ってみた

Posted at

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に配置します。

sample

    //共通領域のファイルパスを取得
    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に落としてから、ファイルを生成し直すという処理にしてますが、ファイルコピーをすることができなかったのでこんな感じにしてます。

生成されたファイルを読み込むには、上述したソースの冒頭と全く一緒ですが、

sample
    //共通領域のファイルパスを取得
    NSURL *fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test.apps"];
    fileURL = [fileURL URLByAppendingPathComponent:@"test.txt"];

で、ファイルパスは取れるので、後は読みこむなり、書き込むなり、煮るなり焼くなり好きにしてください。

◯余談
今回は使わなかったのですが、NSUserDefaultsもアプリ間で共有できるようです。

sample
   
   // 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やら、まだまだ情報が少ないので気づいたことがあれば徐々に掲載していきたいですね。

19
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?