昨日は「もくもくiOS勉強会@ネクスト 1周年記念LT会」に参加してきました。
mokumoku-ios-at-next.connpass.com
ネクストさんのもくもく会は以前から気になっていたのですが、今回1周年を迎えられるということで、僭越ながら私も参加させて頂きました。
ネクストさんにお邪魔するのは初めてでしたが、とても綺麗なオフィスでした!ビールもごちそうさまでした🍺
発表した内容
スライドを貼っておきます。
App GroupsでiPhoneとデータを共有できない問題
問題というか、仕様ですね。
watchOS 1ではiPhoneの中で動いてWatchKit Extensionが、watchOS 2ではApple Watch側に移動したので共有できないわけですね。
(▲watchOS 2 Transition Guideより引用)
今後は Watch Connectivity を使ってデータを受け渡すのが良さそうですね。
詳しくは下記の記事を参考にどうぞ!
画像がキャッシュできない問題
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側に転送した画像リソースをキャッシュしておくことに意味がありました。
しかし、watchOS 2ではWatch ExtensionがApple Watch側に移動し、画像リソースも最初からApple Watch側に保存されているため、画像をキャッシュする必要がなくなったのです。
WatchKit Extensionのbundle identifier問題
watchOS 1では次のようなBundle identifierでも問題なく動いていました。
Watch App | com.koogawa.SampleWatchOS2.watchkitapp |
---|---|
WatchKit Extension | com.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 App | com.koogawa.SampleWatchOS2.watchkitapp |
---|---|
WatchKit Extension | com.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
ベースのものに切り替える必要がありそうですね。
参考リンク
- watchOS 2 Transition Guide - Appleによる移行ガイド。一読することをオススメします。
- iOS 9 / watchOS 2 で deprecated になる or 引退していくAPIたち - Qiita