Watch connectivity
-
Upload
motoki-narita -
Category
Technology
-
view
4.371 -
download
2
Transcript of Watch connectivity
Watch Connectivityについて成田 元輝
自己紹介
自己紹介
• 成田元輝(@mo_to_44)
• 株式会社ネクストでHOME’SのiOSアプリを開発しています
引越しの際に使っていただけると嬉しいです! HOME’Sアプリ作ってます!
Apple Watch対応!
現在地から家賃相場を検索したり、全国の家賃相場を当てる家賃相場クイズ機能!
WWDC2015行ってきました!
“WWDC ホテルがなかった”で検索するとブログが出てくるので読んでみてください
Watch Connectivity
watchOS1をおさらい
watchOS1のiPhoneとAppleWatch
WatchKit App
iOS App
WatchKit Extension
watchOS 1
Data Store
Introducing Watch Connectivityより
watchOS1まで• ExtensionがiPhone側にあった
• 基本的にiPhoneで処理される
• データもiPhone側に置かれていた(Apple Watch側に置かれるのはStoryboardとリソースファイルのみ)
• iPhoneからデータを取って来る際はopenParentApplication:を使用していた
watchOS2から
watchOS2からのiPhoneとAppleWatchIntroducing Watch Connectivityより
iOS AppWatchKit
App
WatchKit Extension
watchOS 2
Data Store
Data Store
watchOS2から
• ExtensionがAppleWatchに置かれるようになった→ネイティブ!
• Watch側にデータが保存可能に!
• iPhoneからデータを取って来る際はWatchConnectivityを使う
Introducing Watch Connectivityより
WatchConnectivity NSURLSession
WatchConnectivity
• iPhone ⇄ Apple Watchでデータのやり取りを可能にする
• リアルタイムでの通信とバックグラウンドでの通信の2種類
“Watch Connectivity”で検索すればリファレンス見つかりますhttps://developer.apple.com/library/prerelease/ios/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html
WatchConnectivity.Frameworkに含まれるクラス
WCSession&
WCSessionDelegate
WCSession
• データ通信を可能にするにはセッションをアクティベートする必要がある
• iPhoneとApple Watchの接続状態をトラッキングするためのプロパティが定義されている
WCSessionを開始Introducing Watch Connectivityより
Setup
Always set your apps up to receive incoming WatchConnectivity contentif (WCSession.isSupported()) { let session = WCSession.defaultSession() session.delegate = self // conforms to WCSessionDelegate session.activateSession() }
WCSessionDelegate
• iPhone or Apple Watchから送信したデータをApple Watch or iPhoneで受け取るデリゲートメソッド
• WCSessionオブジェクトの状態変わったことを確認するためのデリゲートメソッド
• データ転送が終わったタイミングを知るためのデリゲートメソッド
iPhoneとApple Watchの接続状態を知る
• paird→ iPhoneとApple Watchがペアリングされているか
• watchAppInstalled → そのアプリのWatch appがインストールされているか
接続状態を知るためのWCSessionのプロパティ
• complicationEnabled→ complicationがApple Watchのフェイスに設定されているか
• reachable→ 対応するiPhoneアプリ/Watch appがアクティブで通信可能な状態になっているか
接続状態を知るためのWCSessionのプロパティ
• sessionWatchStateDidChange→ paired, watchAppInstalled, complicationEnabled, watchDirectoryURLなどに変化があった際に呼ばれる
• sessionReachabilityDidChange→ 対になるアプリのreachabilityに変化があった際に呼ばれる
接続状態が変わったことを受け取るWCSessionDelegateのデリゲートメソッド
iPhone⇄Apple Watch データのやり取り
データを送る方法• Background Transfers
• Interactive Messaging
• OSがいい感じのタイミングで転送してくれるらしい
Background Transfers
Interactive Messaging
• すぐに転送してくれる
• Application Context
• User Info Transfer
• File Transfer
Background Transfers
Background TransfersApplication Context
• 押さえておくべきこと
• 更新すると上書きされる
• Dictionary([String:AnyObject])型のデータが格納可能
• session:didReceiveApplicationContextで対になるアプリからのデータを受け取る
Background TransfersApplication Context
• updateApplicationContext:error:メソッドを使用してapplicationContextを更新
• WCSessionオブジェクトのapplicationContextプロパティでupdateApplicationContext:error:で送ったデータの確認が可能
• updateApplicationContext:error:を呼ぶごとにデータが上書きされる
• session:didReceiveApplicationContextで対になるアプリからのデータを受け取る
Background Transfers
• 押さえておくべきこと
• Application Contextと異なり上書きされずキューイングされる
• Dictionary([String:AnyObject])型のデータが格納可能
• session:didReceiveUserInfo:で対になるアプリからのデータを受け取る
User Info Transfer
Background TransfersUser Info Transfer
• transferUserInfo:メソッドを使用してデータをキューイングする
• WCSessionオブジェクトのoutstandingUserInfoTransfersプロパティでキューイングされているデータを確認することが可能
• WCSessionUserInfoTransferというオブジェクトでoutstandingUserInfoTransfersプロパティに保存されている
• session:didReceiveUserInfo:で対になるアプリからのデータを受け取る
• session:didFinishUserInfoTransfer:error:で転送完了、あるいはエラーが発生した場合の処理
Background Transfers
• 押さえておくべきこと
• キューイングなどはUserInfoと基本的に同じ
• ファイルの転送が可能
• メタデータを付与することが可能([String:AnyObject])
• session:didReceiveFile:で対になるアプリからのデータを受け取る
File Transfer
Background TransfersFile Transfer
• transferFile:メソッドを使用してファイルの送信が可能
• データ容量の大きいファイル(画像、ドキュメントなど)を転送したい場合に転送する
• WCSessionオブジェクトのoutstandingFileTransfersプロパティでキューイングされているデータを確認することが可能
• WCSessionFileTransferというオブジェクトでoutstandingFileTransfersプロパティに保存されている
• session:didReceiveFile:で対になるアプリからのデータを受け取る
• session:didFinishFileTransfer:error:で転送完了、あるいはエラーが発生した場合の処理をする
Interactive Messaging
Interactive Messaging• リアルタイムにやり取りができる
• テキストのやり取りだけでなく、画像などのデータのやり取りも可能(大きすぎるデータはダメ)
• iPhone/Apple Watchが通信可能な状態(reachable)であることが条件
• Apple Watch→iPhoneの場合のみ、iPhoneアプリをBackgroundで動作させることが可能
通信可能な状態とは?• iPhone側でWCSessionオブジェクトのreachable=trueになるのは、BluetoothでApple Watchと通信が可能な状態で、なおかつWatch appがフォアグラウンドにある状態
iPhone側でreachableな状態Interactive MessagingReachability: iPhone
Devices connectedWatch app foreground
iOS App Watch App
session.reachable == true
Introducing Watch Connectivityより
通信可能な状態とは?
• Apple Watch側でWCSessionオブジェクトのreachable=trueになるのは、BluetoothでiPhoneと通信が可能な状態→iPhoneアプリがフォアグラウンドであるかどうかは関係ない
Interactive Messaging
Devices connectedWatchKit extension foreground
Watch App
WatchKit Extension
session.reachable == true
Reachability: Apple Watch
Apple Watch側でreachableな状態
Introducing Watch Connectivityより
iOSはバックグラウンド動作可能• Apple Watch → iPhoneの場合はiPhoneをバックグラウンドで動作させることが可能
• watchOS1のopenParentApplication:と同じようにデータを取ってくることも可能
Interactive MessagingInteractive MessagingBackground launching: iOS app only
Run Tracker App
WatchKit Extension
iOS App Background
Introducing Watch Connectivityより
Interactive Messaging• 送信可能なデータ
• Dictionary([String:AnyObject])型のデータが格納可能
• NSData=画像なども送信可能
Interactive Messaging
• 以下のメソッドを使用してデータ送信
• sendMessage:replyHandler:errorHandler:
• sendMessageData:replyHandler:errorHandler:
Interactive Messaging• 以下のメソッドを使用してデータを受け取る
• session:didReceiveMessage:
• session:didReceiveMessage:replyHandler:
• session:didReceiveMessageData:
• session:didReceiveMessageData:replyHandler:
Interactive Messaging• 以下のメソッドを使用してデータを受け取る
• session:didReceiveMessage:
• session:didReceiveMessage:replyHandler:
• session:didReceiveMessageData:
• session:didReceiveMessageData:replyHandler:
replyHandlerを利用して通信結果などの情報を送信側に返した方が良さそう
• 押さえておくべきこと
• データ送信前に通信可能であること(=reachable)であることを確認する
• Apple Watch→iPhoneの場合はiOSアプリをバックグランドで動作させることが可能
• Dictionary([String:AnyObject])に加えて、NSData型データの送信も可能
Interactive Messaging
おわり