ラベル Xcode 6.0 beta 2 の投稿を表示しています。 すべての投稿を表示
ラベル Xcode 6.0 beta 2 の投稿を表示しています。 すべての投稿を表示

2014年6月25日水曜日

App Extension や Widgets に App Container を使わないで簡単にデータを渡す方法

iOS 8から利用できるApp Extensionはアプリ本体とは別のプロセスとして動作するため、そのままでは簡単にデータを渡すことができません。公式のドキュメントではApp Containerという仕組みを使う方法が推奨されていますが、この方法はiOS Dev Center上でApp IDの設定が必要になったりするなど面倒がつきまといます。そこでより簡単にApp Extensionにデータを渡す方法がないか調べてみました。

方法1: UIPasteboardを使う方法

一番おすすめなのがこちらです。UIPasteboardというのは要するにコピペ用のクリップボードみたいなものなのですが、こちらシステムが用意している共通のもの以外にも自分のTeam IDでコードサインされたアプリ間すべてで共用できるPasteboardを作成する機能があります。この機能を使用すると非常に簡単にデータをやりとりすることができます。面倒な設定も不要ですし、persistentプロパティを設定することでディスクへの永続化も面倒を見てくれます。

以下にサンプルコードを掲載します。本体アプリのUIApplicationDelegate内でクリップボードを作成してデータを突っ込み、App ExtensionのWidgetViewController内でその値を使用するサンプルです。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Create a pasteboard, and pass some data to it
// the created pasteboard can be specified as persistent as well
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"Widget" create:YES];
pasteboard.persistent = YES;
pasteboard.string = @"やっほー!";
return YES;
}
view raw AppDelegate.m hosted with ❤ by GitHub
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Get some data from the created pasteboard
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"Widget" create:NO];
if (pasteboard) {
self.titleLabel.text = pasteboard.string;
}
}

注意点として、UIPasteboardのnameはあなたの作成したアプリ全体(同じTeam IDでコードサインされたアプリ全体)で共有になります。ですのでWidgetですとかTestのような単純な名前ではなく、com.akisute.MyApp.Widgetのような一意になる名前をつけることをおすすめします。

UIPasteboardについての詳しい使い方については、以下の記事をご覧ください。

方法2: Keychainを使う方法(未確認)

未確認なので確定情報ではありませんが、Keychainには複数のアプリ間で値を共有する機能がありますので、そちらを使えばおそらくアプリ本体とApp Extensionの間で値を共有する事が可能になります。詳しくは以下の記事をご覧ください。