watch connectivity

Post on 11-Aug-2015

4.371 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

おわり

top related