Mkmapview
AppleWatch
WCSession
地図アプリ
WatchConnectivity

Swift MkMapViewで地図アプリ作成してみた(13)- watchOSからiOSにデータ送信を要求する


記事一覧

Swift MkMapViewで地図アプリ作成してみた(記事一覧)


watchOSからiOSにデータ送信を要求する


sendMessageでiOSにデータ送信を要求する

watchOSのアプリが非アクティブであれば、iOSのアプリからのデータを受け取れない。

そのため、watchOSのアプリがアクティブになった時に、sendMessageでiOSのアプリにデータ送信を要求する。


InterfaceController.swift:

    override func willActivate() {

// This method is called when watch view controller is about to be visible to user
super.willActivate()

// 画面描画時(アクティブになった時)にiOSのアプリにデータ送信を要求する
let contents = ["GET":"LONLAT"]
self.session.sendMessage(contents, replyHandler: { (replyMessage) -> Void in
print (replyMessage);
}) { (error) -> Void in
print(error)
}
}



iOSでメッセージを受信するとwatchOSにデータを送信する


watchOSからのメッセージを受信する

sessionメソッドを定義すると、watchOSからsendMessageで送信したデータを受信できる。

以下の処理はiOSのアプリが起動していれば非アクティブの状態でも動作する。


ViewController.swift:watchOSからのメッセージを受信する

    // watchOSからMessage受信

public func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){
print("receiveMessage::\(message)")
replyHandler(["message" : "received message."])
}


watchOSにデータを送信する

sessionメソッドを実装する。

Swift MkMapViewで地図アプリ作成してみた(12)- iOSから送信したデータをwatchOSで受信するで送信したデータを再送する。


ViewController.swift:watchOSにデータを送信する

    // watchOSからMessage受信

public func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){
print("receiveMessage::\(message)")
replyHandler(["message" : "received message."])

// String型以外は処理しない
guard let getType = message["GET"] as? String else {
return
}

switch getType {
case "LONLAT":
// watchOSにロングタップしてピンを立てた地点の緯度経度を送信
let contents = ["lon":dlon, "lat":dlat]
self.session.sendMessage(contents as [String : Any], replyHandler: { (replyMessage) -> Void in
print ("receive from apple watch");
}) { (error) -> Void in
print(error)
}
default:
print("not exist type.")
}
}


image1.png


参考文書

WCSession - WatchConnectivity | Apple Developer Documentation