この記事はWanoグループ Advent Calendar 2016の最終日です。
ちょっと前にうちの会社の上司からApple Watchをお下がりでもらったんですよ。
なのでちょっと寿司を回してみようと。
ついでにGet Wildも流してみようと。
それでね、クリスマスを迎えて今年を締めればいいじゃない。
作りました。
概要
- Apple Watchで寿司を表示する。
- iPhoneのアプリを起動する。
- Apple Watchに寿司をタップする.
- 寿司がまわる
- 同時にiPhoneからYoutubeの音楽が流れる。
- うれしい
以上。
ちなみにGet WildはYoutubeのこれを表示しています。
ハマった所
sendMessageがiPhone側で受け取れない
Apple WatchからiPhoneを操作する時に、WCSessionのsendMessageを使うんですよ。
これがなぜか何度やっても動かない。
2016-12-25 18:42:49.692848 GetWildAndSushi WatchKit Extension[17803:213358] [WC] -[WCSession _onqueue_notifyOfMessageError:withErrorHandler:] errorHandler: NO with WCErrorCodeDeliveryFailed
messageを送るとこんなエラーが出てiPhone側でメッセージを受け取れなかった。
原因
最初はこんな感じでApple Watchの送信側を書いてました。
// open func sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? = nil)
WCSession.default().sendMessage(["Get": "Wild"], replyHandler: nil, errorHandler: nil)
定義は上のコメントの通り。
最初のDictionaryはiPhone側に送るデータ。
replyHandlerは、iPhone側でメッセージを受け取った時に、任意のタイミングで実行するコールバック関数。
errorHandlerはエラー時に呼ばれるコールバック関数を渡す。
ここで定義だとreplyHandlerはoptionalなので、適当にnilを渡してたのだが、これがいけなかったらしい。
以下のように適当な関数を渡したらいけた。
WCSession.default().sendMessage(["Get": "Wild"], replyHandler: {_ in}, errorHandler: nil)
なんで定義がoptionalやねん(´・ω・`)
というわけでみんなも寿司を回すと良いよ
Happy Merry Christmas!!!!🎉