watchos 2 新機能の細かい話
TRANSCRIPT
watchOS 2 新機能の細かい話堤 修一 @shu223 2015.6.16 potato tips #18
• 堤 修一(つつみ しゅういち)
• iOS専業フリーランス
• ブログ『Over&Out その後』
• 著書『iOS×BLE Core Bluetoothプログラミング』『iOSアプリ開発 達人のレシピ100』
自己紹介
お手伝いしたプロダクト(BLE関連)
Music for the Deaf
iOS Sampler シリーズ
watchOS-2-Sampler
watchOS-2-Sampler• watchOS 2 新機能のサンプルコード集
watchOS-2-Sampler• watchOS 2 新機能のサンプルコード集
• 現在の収録サンプル:14種類 - Accelerometer - Gyroscope - Pedometer - Heart Rate - Table Animations - Animated Properties - Audio Rec & Play - Picker Styles - Taptic Engine - Alert - Animation with Digital Crown - Interactive Messaging - Open System URL - Audio File Player
今日話すこと
今日話すこと• watchOS-2-Sampler 実装にあたって気付いた細かい諸々について
今日話すこと• watchOS-2-Sampler 実装にあたって気付いた細かい諸々について- 新機能やそのサンプルをひとつひとつ紹介するのではなく、実装上の注意点とか、調べてわかったこととか
今日話すこと• watchOS-2-Sampler 実装にあたって気付いた細かい諸々について- 新機能やそのサンプルをひとつひとつ紹介するのではなく、実装上の注意点とか、調べてわかったこととか
- 全部で5つ
今日話すこと• watchOS-2-Sampler 実装にあたって気付いた細かい諸々について- 新機能やそのサンプルをひとつひとつ紹介するのではなく、実装上の注意点とか、調べてわかったこととか
- 全部で5つ
※用いている画像はすべてAppleによる公開ドキュメント(WWDCセッション動画やスライドetc..)からのものです
1/5 2つのアセットカタログの
使い分け
watchOS 2 から、ネイティブ動作するようになった!
watchOS 2 から、ネイティブ動作するようになった!
→ Extension のコードもウォッチ側で実行される
watchOS 2 から、ネイティブ動作するようになった!
→ Extension のコードもウォッチ側で実行される
→ Watch Extension の Asset Catalog も、Watch App の
Asset Catalog もウォッチ側にある
watchOS 2 から、ネイティブ動作するようになった!
→ Extension のコードもウォッチ側で実行される
→ Watch Extension の Asset Catalog も、Watch App の
Asset Catalog もウォッチ側にある
→ どっちに置いてもいいんじゃ・・・?
watchOS 2 から、ネイティブ動作するようになった!
→ Extension のコードもウォッチ側で実行される
→ Watch Extension の Asset Catalog も、Watch App の
Asset Catalog もウォッチ側にある
→ どっちに置いてもいいんじゃ・・・?
→ そんなことはない!
Watch Extension 側リソースを利用するケース
• wathOS-2-Sampler の Coordinated Animations サンプル
Watch Extension 側リソースを利用するケース
• wathOS-2-Sampler の Coordinated Animations サンプル
Watch App 側リソースを利用するケース
• wathOS-2-Sampler の Picker Styles サンプル
Watch App 側リソースを利用するケース
• wathOS-2-Sampler の Picker Styles サンプル
• Watch App 側リソースを利用
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
- IB からセットする場合
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
- IB からセットする場合- (名前をセットしたものがプレビューされてるだけなので、結局は上と同じ)
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
- IB からセットする場合- (名前をセットしたものがプレビューされてるだけなので、結局は上と同じ)
• Watch Extension 側リソースを利用
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
- IB からセットする場合- (名前をセットしたものがプレビューされてるだけなので、結局は上と同じ)
• Watch Extension 側リソースを利用
- UIImage 等の WatchKit 以外のクラスから参照する場合
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
- IB からセットする場合- (名前をセットしたものがプレビューされてるだけなので、結局は上と同じ)
• Watch Extension 側リソースを利用
- UIImage 等の WatchKit 以外のクラスから参照する場合
• 参考
• Watch App 側リソースを利用
- WKImage や WKInterfaceImage 等の WatchKit のクラスから name
で参照する場合
- IB からセットする場合- (名前をセットしたものがプレビューされてるだけなので、結局は上と同じ)
• Watch Extension 側リソースを利用
- UIImage 等の WatchKit 以外のクラスから参照する場合
• 参考
- WWDC15 セッション 207 “WatchKit in depth Part1” スライドp40~
2/5 メディアデータの 保存場所
新たに追加されたマイク録音UI
新たに追加されたマイク録音UI• presentAudioRecordingControllerWithOutputURL:preset:maximumDuration:actionTitle:completion: を呼ぶ
新たに追加されたマイク録音UI• presentAudioRecordingControllerWithOutputURL:preset:maximumDuration:actionTitle:completion: を呼ぶ
• 第1引数にオーディオファイル出力先の NSURL オブジェクトを渡す
新たに追加されたマイク録音UI• presentAudioRecordingControllerWithOutputURL:preset:maximumDuration:actionTitle:completion: を呼ぶ
• 第1引数にオーディオファイル出力先の NSURL オブジェクトを渡す
→ documents 配下のパスを渡す
新たに追加されたマイク録音UI• presentAudioRecordingControllerWithOutputURL:preset:maximumDuration:actionTitle:completion: を呼ぶ
• 第1引数にオーディオファイル出力先の NSURL オブジェクトを渡す
→ documents 配下のパスを渡す
→ シミュレータでは動作するのに、実機で動作しない!
Must use a shared container
• って WWDC15 セッション207 “WatchKit in depth part1” スライド p59 に書いてある
Must use a shared container
• って WWDC15 セッション207 “WatchKit in depth part1” スライド p59 に書いてある
• “WatchKitAudioRecorder” の実装もそうなってる
Must use a shared container
• って WWDC15 セッション207 “WatchKit in depth part1” スライド p59 に書いてある
• “WatchKitAudioRecorder” の実装もそうなってる
• Watch の Extension と App で “App Groups” を有効にする
Must use a shared container
• って WWDC15 セッション207 “WatchKit in depth part1” スライド p59 に書いてある
• “WatchKitAudioRecorder” の実装もそうなってる
• Watch の Extension と App で “App Groups” を有効にする
• なぜ?(メディアリソースは Extension と App で共用するから?)
Must use a shared container
3/5 WKAudioFilePlayer
• 要ウォッチとの Bluetooth Headset ペアリング
• 要ウォッチとの Bluetooth Headset ペアリング
- ウォッチ側スピーカーからのオーディオファイル再生は presentMediaPlayerControllerWithURL:options:completion: を利用しないとできない?
• 要ウォッチとの Bluetooth Headset ペアリング
- ウォッチ側スピーカーからのオーディオファイル再生は presentMediaPlayerControllerWithURL:options:completion: を利用しないとできない?
• WKAudioFilePlayerItem: でオブジェクト生成直後に play しようとしてはいけない
• 要ウォッチとの Bluetooth Headset ペアリング
- ウォッチ側スピーカーからのオーディオファイル再生は presentMediaPlayerControllerWithURL:options:completion: を利用しないとできない?
• WKAudioFilePlayerItem: でオブジェクト生成直後に play しようとしてはいけない
×
• 要ウォッチとの Bluetooth Headset ペアリング
- ウォッチ側スピーカーからのオーディオファイル再生は presentMediaPlayerControllerWithURL:options:completion: を利用しないとできない?
• WKAudioFilePlayerItem: でオブジェクト生成直後に play しようとしてはいけない
• status プロパティが ReadyToPlay になれば再生OK
×
4/5 ウォッチ側 Bluetooth の
(直接)利用
• watchOS Developer Library には Core Bluetooth のドキュメントはない
• watchOS Developer Library には Core Bluetooth のドキュメントはない
• ドキュメントは置き忘れてるだけかもしれない
• watchOS Developer Library には Core Bluetooth のドキュメントはない
• ドキュメントは置き忘れてるだけかもしれない
• ということで「念のため」 Watch Extension 側のコードで import してみた
• watchOS Developer Library には Core Bluetooth のドキュメントはない
• ドキュメントは置き忘れてるだけかもしれない
• ということで「念のため」 Watch Extension 側のコードで import してみた
• watchOS Developer Library には Core Bluetooth のドキュメントはない
• ドキュメントは置き忘れてるだけかもしれない
• ということで「念のため」 Watch Extension 側のコードで import してみた
• (やはり)ダメでした・・・
5/5 Watch Connectivity
のメッセージ送信可否の条件
• Watch Connectivity
• Watch Connectivity
- Phone - Watch 間で相互にメッセージやデータを送れる
• Watch Connectivity
- Phone - Watch 間で相互にメッセージやデータを送れる
- 前からあった openParent~ は Watch → Phone だけ(ただし Phone から Reply を返すことは可)
• Watch Connectivity
- Phone - Watch 間で相互にメッセージやデータを送れる
- 前からあった openParent~ は Watch → Phone だけ(ただし Phone から Reply を返すことは可)
• メッセージ送信可否のチェック
Reachable なケース その1:
両者共にフォアグラウンド
Reachable なケース その2:
iOS側だけバックグラウンド
• 要は、Watch App がバックグラウンドのときは iPhone
側からのメッセージを受け取れない
• 要は、Watch App がバックグラウンドのときは iPhone
側からのメッセージを受け取れない
• あくまで WCSession の reachable の話。Application
context や User info transfer, File transfer を使えば Wacth
App がバックグラウンドのときも Phone → Watch へ情報を送れるかも(後日試してサンプル追加予定)
• 要は、Watch App がバックグラウンドのときは iPhone
側からのメッセージを受け取れない
• あくまで WCSession の reachable の話。Application
context や User info transfer, File transfer を使えば Wacth
App がバックグラウンドのときも Phone → Watch へ情報を送れるかも(後日試してサンプル追加予定)
• 参考:WWDC15 セッション713 “Introducing Watch Connectivity”
watchOS-2-Sampler
GitHub: shu223/watchOS-2-Sampler
Blog: watchOS 2 の新機能のサンプルコード集『watchOS-2-Sampler』
- Accelerometer - Gyroscope - Pedometer - Heart Rate - Table Animations - Animated Properties - Audio Rec & Play - Picker Styles - Taptic Engine - Alert - Animation with Digital Crown - Interactive Messaging - Open System URL - Audio File Player