51
Watch Connectivityについて 成田 元輝

Watch connectivity

Embed Size (px)

Citation preview

Page 1: Watch connectivity

Watch Connectivityについて成田 元輝

Page 2: Watch connectivity

自己紹介

Page 3: Watch connectivity

自己紹介

• 成田元輝(@mo_to_44)

• 株式会社ネクストでHOME’SのiOSアプリを開発しています

Page 4: Watch connectivity

引越しの際に使っていただけると嬉しいです! HOME’Sアプリ作ってます!

Page 5: Watch connectivity

Apple Watch対応!

現在地から家賃相場を検索したり、全国の家賃相場を当てる家賃相場クイズ機能!

Page 6: Watch connectivity

WWDC2015行ってきました!

Page 7: Watch connectivity

“WWDC ホテルがなかった”で検索するとブログが出てくるので読んでみてください

Page 8: Watch connectivity

Watch Connectivity

Page 9: Watch connectivity

watchOS1をおさらい

Page 10: Watch connectivity

watchOS1のiPhoneとAppleWatch

WatchKit App

iOS App

WatchKit Extension

watchOS 1

Data Store

Introducing Watch Connectivityより

Page 11: Watch connectivity

watchOS1まで• ExtensionがiPhone側にあった

• 基本的にiPhoneで処理される

• データもiPhone側に置かれていた(Apple Watch側に置かれるのはStoryboardとリソースファイルのみ)

• iPhoneからデータを取って来る際はopenParentApplication:を使用していた

Page 12: Watch connectivity

watchOS2から

Page 13: Watch connectivity

watchOS2からのiPhoneとAppleWatchIntroducing Watch Connectivityより

iOS AppWatchKit

App

WatchKit Extension

watchOS 2

Data Store

Data Store

Page 14: Watch connectivity

watchOS2から

• ExtensionがAppleWatchに置かれるようになった→ネイティブ!

• Watch側にデータが保存可能に!

• iPhoneからデータを取って来る際はWatchConnectivityを使う

Page 15: Watch connectivity

Introducing Watch Connectivityより

WatchConnectivity NSURLSession

Page 16: Watch connectivity

WatchConnectivity

• iPhone ⇄ Apple Watchでデータのやり取りを可能にする

• リアルタイムでの通信とバックグラウンドでの通信の2種類

Page 17: Watch connectivity

“Watch Connectivity”で検索すればリファレンス見つかりますhttps://developer.apple.com/library/prerelease/ios/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html

Page 18: Watch connectivity

WatchConnectivity.Frameworkに含まれるクラス

Page 19: Watch connectivity

WCSession&

WCSessionDelegate

Page 20: Watch connectivity

WCSession

• データ通信を可能にするにはセッションをアクティベートする必要がある

• iPhoneとApple Watchの接続状態をトラッキングするためのプロパティが定義されている

Page 21: Watch connectivity

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() }

Page 22: Watch connectivity

WCSessionDelegate

• iPhone or Apple Watchから送信したデータをApple Watch or iPhoneで受け取るデリゲートメソッド

• WCSessionオブジェクトの状態変わったことを確認するためのデリゲートメソッド

• データ転送が終わったタイミングを知るためのデリゲートメソッド

Page 23: Watch connectivity

iPhoneとApple Watchの接続状態を知る

Page 24: Watch connectivity

• paird→ iPhoneとApple Watchがペアリングされているか

• watchAppInstalled → そのアプリのWatch appがインストールされているか

接続状態を知るためのWCSessionのプロパティ

Page 25: Watch connectivity

• complicationEnabled→ complicationがApple Watchのフェイスに設定されているか

• reachable→ 対応するiPhoneアプリ/Watch appがアクティブで通信可能な状態になっているか

接続状態を知るためのWCSessionのプロパティ

Page 26: Watch connectivity

• sessionWatchStateDidChange→ paired, watchAppInstalled, complicationEnabled, watchDirectoryURLなどに変化があった際に呼ばれる

• sessionReachabilityDidChange→ 対になるアプリのreachabilityに変化があった際に呼ばれる

接続状態が変わったことを受け取るWCSessionDelegateのデリゲートメソッド

Page 27: Watch connectivity

iPhone⇄Apple Watch データのやり取り

Page 28: Watch connectivity

データを送る方法• Background Transfers

• Interactive Messaging

Page 29: Watch connectivity

• OSがいい感じのタイミングで転送してくれるらしい

Background Transfers

Page 30: Watch connectivity

Interactive Messaging

• すぐに転送してくれる

Page 31: Watch connectivity

• Application Context

• User Info Transfer

• File Transfer

Background Transfers

Page 32: Watch connectivity

Background TransfersApplication Context

• 押さえておくべきこと

• 更新すると上書きされる

• Dictionary([String:AnyObject])型のデータが格納可能

• session:didReceiveApplicationContextで対になるアプリからのデータを受け取る

Page 33: Watch connectivity

Background TransfersApplication Context

• updateApplicationContext:error:メソッドを使用してapplicationContextを更新

• WCSessionオブジェクトのapplicationContextプロパティでupdateApplicationContext:error:で送ったデータの確認が可能

• updateApplicationContext:error:を呼ぶごとにデータが上書きされる

• session:didReceiveApplicationContextで対になるアプリからのデータを受け取る

Page 34: Watch connectivity

Background Transfers

• 押さえておくべきこと

• Application Contextと異なり上書きされずキューイングされる

• Dictionary([String:AnyObject])型のデータが格納可能

• session:didReceiveUserInfo:で対になるアプリからのデータを受け取る

User Info Transfer

Page 35: Watch connectivity

Background TransfersUser Info Transfer

• transferUserInfo:メソッドを使用してデータをキューイングする

• WCSessionオブジェクトのoutstandingUserInfoTransfersプロパティでキューイングされているデータを確認することが可能

• WCSessionUserInfoTransferというオブジェクトでoutstandingUserInfoTransfersプロパティに保存されている

• session:didReceiveUserInfo:で対になるアプリからのデータを受け取る

• session:didFinishUserInfoTransfer:error:で転送完了、あるいはエラーが発生した場合の処理

Page 36: Watch connectivity

Background Transfers

• 押さえておくべきこと

• キューイングなどはUserInfoと基本的に同じ

• ファイルの転送が可能

• メタデータを付与することが可能([String:AnyObject])

• session:didReceiveFile:で対になるアプリからのデータを受け取る

File Transfer

Page 37: Watch connectivity

Background TransfersFile Transfer

• transferFile:メソッドを使用してファイルの送信が可能

• データ容量の大きいファイル(画像、ドキュメントなど)を転送したい場合に転送する

• WCSessionオブジェクトのoutstandingFileTransfersプロパティでキューイングされているデータを確認することが可能

• WCSessionFileTransferというオブジェクトでoutstandingFileTransfersプロパティに保存されている

• session:didReceiveFile:で対になるアプリからのデータを受け取る

• session:didFinishFileTransfer:error:で転送完了、あるいはエラーが発生した場合の処理をする

Page 38: Watch connectivity

Interactive Messaging

Page 39: Watch connectivity

Interactive Messaging• リアルタイムにやり取りができる

• テキストのやり取りだけでなく、画像などのデータのやり取りも可能(大きすぎるデータはダメ)

• iPhone/Apple Watchが通信可能な状態(reachable)であることが条件

• Apple Watch→iPhoneの場合のみ、iPhoneアプリをBackgroundで動作させることが可能

Page 40: Watch connectivity

通信可能な状態とは?• iPhone側でWCSessionオブジェクトのreachable=trueになるのは、BluetoothでApple Watchと通信が可能な状態で、なおかつWatch appがフォアグラウンドにある状態

Page 41: Watch connectivity

iPhone側でreachableな状態Interactive MessagingReachability: iPhone

Devices connectedWatch app foreground

iOS App Watch App

session.reachable == true

Introducing Watch Connectivityより

Page 42: Watch connectivity

通信可能な状態とは?

• Apple Watch側でWCSessionオブジェクトのreachable=trueになるのは、BluetoothでiPhoneと通信が可能な状態→iPhoneアプリがフォアグラウンドであるかどうかは関係ない

Page 43: Watch connectivity

Interactive Messaging

Devices connectedWatchKit extension foreground

Watch App

WatchKit Extension

session.reachable == true

Reachability: Apple Watch

Apple Watch側でreachableな状態

Introducing Watch Connectivityより

Page 44: Watch connectivity

iOSはバックグラウンド動作可能• Apple Watch → iPhoneの場合はiPhoneをバックグラウンドで動作させることが可能

• watchOS1のopenParentApplication:と同じようにデータを取ってくることも可能

Page 45: Watch connectivity

Interactive MessagingInteractive MessagingBackground launching: iOS app only

Run Tracker App

WatchKit Extension

iOS App Background

Introducing Watch Connectivityより

Page 46: Watch connectivity

Interactive Messaging• 送信可能なデータ

• Dictionary([String:AnyObject])型のデータが格納可能

• NSData=画像なども送信可能

Page 47: Watch connectivity

Interactive Messaging

• 以下のメソッドを使用してデータ送信

• sendMessage:replyHandler:errorHandler:

• sendMessageData:replyHandler:errorHandler:

Page 48: Watch connectivity

Interactive Messaging• 以下のメソッドを使用してデータを受け取る

• session:didReceiveMessage:

• session:didReceiveMessage:replyHandler:

• session:didReceiveMessageData:

• session:didReceiveMessageData:replyHandler:

Page 49: Watch connectivity

Interactive Messaging• 以下のメソッドを使用してデータを受け取る

• session:didReceiveMessage:

• session:didReceiveMessage:replyHandler:

• session:didReceiveMessageData:

• session:didReceiveMessageData:replyHandler:

replyHandlerを利用して通信結果などの情報を送信側に返した方が良さそう

Page 50: Watch connectivity

• 押さえておくべきこと

• データ送信前に通信可能であること(=reachable)であることを確認する

• Apple Watch→iPhoneの場合はiOSアプリをバックグランドで動作させることが可能

• Dictionary([String:AnyObject])に加えて、NSData型データの送信も可能

Interactive Messaging

Page 51: Watch connectivity

おわり