Apple Watchサンプルアプリ「Lister」のビルド方法

# 目次
1. はじめに
2. 実行要件（ビルドに必要なもの）
3. ダウンロードURL
4. フォルダ構成
5. プロビジョニングファイルの作成
6. ListerアプリのbundleIDを5のIDに変更
7. 各ターゲットのチームを自分のものに変更
8. プロビジョニングファイルを発行
9. iOSのアプリを実行
10. スキーム変更してWatchAppを実行
11. 実行結果
12. 番外編（エラー）

## はじめに
Apple Watchが今年の３月末に発売されるという噂で、自分も開発したい！と思ったところ、
Apple公式のサンプルで「Lister」というサンプルアプリのコードが公開されていました。
ToDo管理アプリでiPhoneとAppleWatchのデータの連携ができるとのこと。
これを参考にすれば、自分でAppleWatchのアプリが作れる！と意気込んでみたものの、
プロビジョニングファイルの登録などけっこう前処理が必要なアプリでした。
これができないと実行すらできない。。
ということで、「Lister」を実行するにあたっての前処理をまとめます。

「Lister」はiOSとMacのアプリとして提供されていますが、この記事ではiOSアプリの実行を紹介します。


## 実行要件（ビルドに必要なもの）
「Lister」を実行するには以下が必要です。

* Xcode6.2（2015年1月28日現在beta4がダウンロードできます。）
* iOS Developer Programの登録（2015年1月28日現在年間11,800円掛かるそう）

現在AppleWatchを開発するにはXcode6.2が必要なのでそれをダウンロードします。
「Lister」はToDoリストのデータをiPhone(iPad)とAppleWatchでやりとりするために
「iCloud Document Storage」　と　「App Groups」というAppleのサービスとを利用しているとのことです。
その利用にDeveloper Programの登録が必要です。

## サンプルコードダウンロードURL

* [Lister (for Apple Watch, iOS, and OS X)](https://developer.apple.com/library/prerelease/ios/samplecode/Lister/Introduction/Intro.html)

## フォルダ構成
ダウンロードすると以下のフォルダ構成になっていると思います。


```
ListerforAppleWatchiOSandOSX
│
├About Lister.pdf
│
├iOS and Watch Quick Start.pdf
│
├LICENSE.txt
│
├Mac Quick Start.pdf
│
├Objective-C/
│
├README.md
│
├Swift/

```
`Objective-C/`フォルダにObjective-cでのアプリコードが、`Swift/`フォルダにSwiftのコードがあります。
どちらも同じ機能を持つアプリになってます。

## プロビジョニングファイルの作成
さて、いよいよ前処理です。
まず、iOS Member Centerにログインして、【Certificates, Identifiers & Profiles】>【Certificates】
で登録画面に行ってこの「Lister」用のプロビジョニングファイルを作成します。

`Identifiers` > `App IDs` で追加で登録する際に、`App ID Suffix`の`Bundle ID`はよく覚えておいてください。
あとでXcodeに登録する際にここの`Bundle ID`をあわせる必要があります。

登録したら`Provisioning Profiles`からダウンロードします。

> 参考：[[iOS 7] アプリ開発入門 1からはじめるiOS7 – プロビジョニングプロファイルの作り方](http://dev.classmethod.jp/references/generate-provisioning-ios7/)

ダウンロードしたらXcodeに今ダウンロードしたプロビジョニングファイルが登録しているかを確認します。
Xcode6.2を立ち上げて、以下を確認。

`Xcodeタブ`>`Preferences` > `Accounts` > `Apple IDs`で`View Details...`をクリックで確認できます。


![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/31587/cadb9a2b-1272-fdd4-2472-66b08078e757.png "qiita1.png")

## ListerアプリのbundleIDを5のIDに変更
デフォルトでは、Appleの方でbundleIDのプレフィックスが設定されています。それを先ほど設定した自分のbundleIDへ変更する必要があります。

1. Xcodeのプロジェクトナビゲーターから「Lister」のターゲットを選択
2. `Build Settings`　> `User-Defined`を確認(一番最後にある）
3. `LISTER_BUNDLE_PREFIX`の値を`com.example.apple-samplecode`(これがデフォルト）から自分のものに変更。

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/31587/ab73751b-8c04-41ea-8802-af8584516f76.png "qiita2.png")

## 各ターゲットのチームを自分のものに変更
以下のターゲットの`Identity`の`Team`を自分のものに変更

* Lister(iOSのListerアプリ)
* ListerToday(iOSのListerのウェジェット)
* ListerWatch(AppleWatchのためにWatchKit extension）
* Lister Watch App（AppleWatchアプリ）

キャプチャはListerWatchのもの

![qiita3.png](https://qiita-image-store.s3.amazonaws.com/0/31587/185421ac-5c5d-0310-b8f9-34c1febdd065.png "qiita3.png")

## プロビジョニングファイルを発行
各ターゲットに自分のチームを設定すると以下のターゲットでワーニングが出ます。

* Lister
* ListerToday
* ListerWatch

`Fix Issue`ボタンを押すとXcodeの方で足りないプロビジョニングファイルを作成してくれます。

## iOSのアプリを実行
前処理が終わりました。
うまく行けばアプリを実行できるはずです。
まずiOSのアプリから実行します。

schemeのリストから`Lister`を選択しシュミレーターを選んでRunします。
今回はiPhone6を選びました。

![qiita4.png](https://qiita-image-store.s3.amazonaws.com/0/31587/dfb860b3-96fe-37ed-6ae2-616f3f005869.png "qiita4.png")

iPhoneのシュミレーターが立ち上がるのを待ちます。

シュミレータのタブから`Hardware`>`External Displays`>`Apple Watch 38mm(42mmでも可)`を選択します。
AppleWatchのシュミレーターが立ち上がります。

## スキーム変更してWatchAppを実行
次にschemeリストから`Lister Watch App`を選択してiOSアプリで実行したのと同じデバイス(今回はiPhone6)を選択して実行します。
上手く行けば、AppleWatchのシュミレーターでListerアプリが立ち上がります。

## 実行結果
こんな風にデータが同期されます。
![yL93QAcKIy.gif](https://qiita-image-store.s3.amazonaws.com/0/31587/30cd6097-571b-c254-0333-a85761d1ecf8.gif "yL93QAcKIy.gif")



## 番外編（エラー）

```
target specifies product type 'com.apple.product-type.application.watchapp', but there's no such product type for the 'iphonesimulator' platform

```
![チャプxcode.png](https://qiita-image-store.s3.amazonaws.com/0/31587/c8d0377e-6de9-6446-d032-63a7867cd87e.png "チャプxcode.png")

`Lister`のサンプルコードをダウンロードしてプロジェクト開いて実行してみたら、このエラーがでて実行に失敗することがありました。
budleIDその他前処理は大丈夫なはずで、他に不備はないはずと１時間ぐらい悩んでいたんですが、
なんてことはない。実行しているXcodeのバージョンが6.1でした。。

このエラーが出たら、実行しているXcodeのバージョンをご確認ください。

>参考：[Xcode getting target specifies product type 'com.apple.product-type.application.watchapp'](http://www.mysteryzillion.org/discussion/13843/xcode-getting-target-specifies-product-type-com-apple-product-type-application-watchapp)