読者です 読者をやめる 読者になる 読者になる

koogawa log

iOS、Android、foursquareに関する話題

自作アプリをwatchOS 2対応した話をしてきたよ

昨日は「もくもくiOS勉強会@ネクスト 1周年記念LT会」に参加してきました。

mokumoku-ios-at-next.connpass.com

ネクストさんのもくもく会は以前から気になっていたのですが、今回1周年を迎えられるということで、僭越ながら私も参加させて頂きました。

ネクストさんにお邪魔するのは初めてでしたが、とても綺麗なオフィスでした!ビールもごちそうさまでした🍺

発表した内容

スライドを貼っておきます。

App GroupsでiPhoneとデータを共有できない問題

問題というか、仕様ですね。

watchOS 1ではiPhoneの中で動いてWatchKit Extensionが、watchOS 2ではApple Watch側に移動したので共有できないわけですね。

c725d420-826b-9431-26d8-69a920e19443.png (▲watchOS 2 Transition Guideより引用)

今後は Watch Connectivity を使ってデータを受け渡すのが良さそうですね。

詳しくは下記の記事を参考にどうぞ!

qiita.com

画像がキャッシュできない問題

watchOS 2では、WKInterfaceDevice によるイメージキャッシュができなくなっています。

- (BOOL)addCachedImage:(UIImage *)image name:(NSString *)name WK_AVAILABLE_IOS_ONLY(8.2);
- (BOOL)addCachedImageWithData:(NSData *)imageData name:(NSString *)name WK_AVAILABLE_IOS_ONLY(8.2);
- (void)removeCachedImageWithName:(NSString *)name WK_AVAILABLE_IOS_ONLY(8.2);
- (void)removeAllCachedImages WK_AVAILABLE_IOS_ONLY(8.2);
@property (nonatomic, readonly, strong) NSDictionary<NSString*, NSNumber*> *cachedImages WK_AVAILABLE_IOS_ONLY(8.2);

上記メソッドを使おうとすると、全てエラーになります。

これもWatchKit Extensionが、Apple Watch側に移動したことが原因です。

watchOS 1では、Watch ExtensionがiPhone側にあったため、Apple Watch側に転送した画像リソースをキャッシュしておくことに意味がありました。

f:id:koogawa:20150929182829p:plain

しかし、watchOS 2ではWatch ExtensionがApple Watch側に移動し、画像リソースも最初からApple Watch側に保存されているため、画像をキャッシュする必要がなくなったのです。

f:id:koogawa:20150929182846p:plain

WatchKit Extensionのbundle identifier問題

watchOS 1では次のようなBundle identifierでも問題なく動いていました。

Watch Appcom.koogawa.SampleWatchOS2.watchkitapp
WatchKit Extensioncom.koogawa.SampleWatchOS2.watchkitextension

これをwatchOS 2環境でビルドしようとしたら

Embedded binary's bundle identifier is not prefixed
 with the parent app's bundle identifier.

というエラーが。

つまり、WatchKit Extensionのbundle identifierが、親のWatchAppのbundle identifierをPrefixに持ってないとダメってことらしいです。

watchOS 2では次のように修正しないといけません。

Watch Appcom.koogawa.SampleWatchOS2.watchkitapp
WatchKit Extensioncom.koogawa.SampleWatchOS2.watchkitapp.watchkitextension

この状態でビルドすると、問題なく動きます。

アプリ独自のプロビジョニングプロファイルを作っている場合は、AppIDを修正して新しい物を作り直さないとダメですね。

startUpdatingLocationが使えない問題

これは、WWDC 2015のビデオでも解説されていましたね。

watchOS 2では startUpdatingLocation のように位置情報を継続的に取得し続けるメソッドが使えなくなりました。

代わりに、一度きりの位置情報取得が可能な

- requestLocation

メソッドを使えば良さそうです。

NSURLConnection がエラーになる問題

Transition Guide にもある通り、watchOS 2からは NSURLSession を使って Apple Watch 単体でサーバとの通信ができるようになりました。

一方、NSURLConnection による通信を実行しようとすると次のようなエラーが出るようになりました。

Error Domain=NSURLErrorDomain Code=-1009 "The Internet 
connection appears to be offline." 

NSURLConnection ベースで書かれたライブラリを使っている場合は NSURLSession ベースのものに切り替える必要がありそうですね。

参考リンク