アプリ道場 Advent Calender 2015の二番煎じではなくて二番手の@sohichiroです。
せっかく記事を書くということで前から気になっていたwatchOS2においての通信部分の速度について調べてみました。
iPhone - Apple Watchとの通信に使うWatch Connectivityについて
iPhoneとApple Watchがデータを送信しあうには、以下のAPIを用います。
public func sendMessage(message: [String : AnyObject], replyHandler: (([String : AnyObject]) -> Void)?, errorHandler: ((NSError) -> Void)?)
public func sendMessageData(data: NSData, replyHandler: ((NSData) -> Void)?, errorHandler: ((NSError) -> Void)?)
これらは、APIをコールすると、その場でデータを送信し、通信の成否によってクロージャを実行します
即座にデータを送信することを、「Interactive Messaging」とAppleは表現しています。
上記に対して、送信するタイミングが、システムの状態(OSの都合)に依存するのが以下の3つのAPIになります。
public func updateApplicationContext(applicationContext: [String : AnyObject]) throws
public func transferUserInfo(userInfo: [String : AnyObject]) -> WCSessionUserInfoTransfer
public func transferFile(file: NSURL, metadata: [String : AnyObject]?) -> WCSessionFileTransfer
これらは、APIをコールすると、データをキューイングし、OSの都合の良いタイミングで、データを送信していきます。
Interactive Messagingで使用するAPIよりも比較的大きなデータを送受信するときに使用します。
ここでは、Interactive Messagingでデータを送信する際の制約について調査してみました。
なお今回の検証は、iPhoneからApple Watchへのデータ送信のみとなっています。
送信できるデータサイズは?
これは、実際どれくらいまで大きなデータが送信できるのかを、実際に送って確認してみました。
まずは、sendMessage()において確認。
送信するデータは、Stringに何文字入るか?というところで確認してみたところ。。
65525文字!
65525といえば、、2バイトデータよりちょっとだけ少ない。。
続いて、sendMessageData()。
こちらはStringをNSDataにエンコーディングして何文字のデータが送れるか?というところで確認してみたところ。。
65536文字!!
この数字は、文字数(1から始めてる)ですので、sendMessageData()に送信可能なデータ量は、2バイトで表されるデータ量ということのようです。
sendMessage()の方は、DictionaryのKeyの領域が割り当てられているでしょうか。。
送信にかかる時間は?
iPhone6Plus + Apple Watch 38mmの環境において確認しました。
送信時間は、データの大きさに依存します。
sendMessage()、sendMessageData()いずれの場合も、最も大きなデータ量(65525or65536文字)を送信した際は、約1.1sかかっています。まれに1.2sとかもあるので、1.5sぐらいがセーフティなところでしょうか。。
それに対し、データ量を最小にした場合は、約0.3sかかっています。
終わりに
確認に使用したコードを以下にアップしておきます。
ご参考になれば幸いです。
(コード汚いorz..)
https://github.com/sohichiro/watchConnectivityTime