iOS8のウィジェットを作ってみよう

2014年11月10日月曜日 takahashi

はじめましてtakahashiです。
iPhoneアプリの開発やってます。どうぞよろしく。

先日iPhone6と6プラスがテスト用に届きました。
大きな画面に違和感を感じつつもゴニョゴニョしています。


さて今回はiOS8から追加されたウィジェットを実際に動かしてみようと思います。
ネットで検索すればいろいろ見つかるので、難しいことはそちらに任せて
とりあえず簡単なところを試してみようと思います。



手順1 ターゲットの追加

適当にプロジェクトを用意します。新規プロジェクトでもOKです。
File->New->Target...と選択します。
「Application Extension」から「Today Extension」を選択して「Next」ボタンを押します。

設定画面が表示されるので「Prodcuct Name」を入力します。他の設定はデフォルトのままでOKです。
ウィジェットを使うのに必要なファイルが自動で作られてプロジェクトに追加されます。

手順2 とりあえず実行

この状態で実行すると、もうウィジェットが動作します。
通知センターの編集ボタンをタップし、作成したウィジェットを追加します。

通知センターに「Hello World」の文字が表示されます。
これがウィジェットが表示している状態です。


手順3 表示内容の編集

表示する中身はviewController&storyboardでいろいろいじる事が出来ます。
ウィジェット用のviewController&storyboardが自動で作成されているので
それをいじるのが楽です。

viewController内の
「widgetPerformUpdateWithCompletionHandler:」
がウィジェットの更新時に呼ばれるメソッドで定期的に呼ばれます。
この中でいろいろ表示する内容を更新します。

手順4 アプリとウィジェット間のデータの受け渡し

アプリとウィジェットは直接データのやり取りが出来ません。
いくつか方法はあるみたいですが、今回は「App Group」という仕組みがあるので
そちらを使用してみたいと思います。

まず「iOS Dev Center」の「Identifiers」から「App Groups」を選択します。
追加ボタンでApp Groupの名前とidを入力して登録します。

プロジェクトを開き、アプリのターゲットの「Capabilities」から「App Groups」を有効にし、一覧に先ほど追加したidが表示されるのでチェックを付けます。
同様にウィジェットのターゲットでも「App Groups」を有効にしてチェックを付けます。

あとは
NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"id"];

[userDefaults setObject:@"value" forKey:@"key"]
でアプリ側で保存して

NSUserDefaults* userDefaults = [[NSUserDefaults allocinitWithSuiteName:@"id"];

id value = [userDefaults objectForKey:@"key"]
でウィジェット側で取り出せばOKです。

アプリで入力した文字が

こんな感じで取り出せます。


最後に

ウィジェットはそれほど難しくはないですが、どちらかというと何を表示したら便利に使えるかを考えるのが大変そうです。
センス次第ってとこでしょうか...。