AppleWatchから送られてくるメッセージを表示したい
- 評価
- クリップ 0
- VIEW 985
Applewatchアプリ開発の勉強を始めたばかりの者です。
実装をしたのですが、方法がわからず悩んでおります。
AppleWatchからiphoneへデータを送る方法をサイトを参考に実装したのですが
(参考サイト様:https://qiita.com/koogawa/items/b39e1419cbbcda8efc07)
「iphoneにAppleWatchから送信したテキストを表示する」という部分がうまくいきません。
やりたいことはApplewatchのボタンをタップすると、iphone側にデータ(テキスト)を送り、
Applewatchから送信したテキストをiphoneの画面(ラベル)に表示したいです。
Watch側で送った"hoge" : "huga"を受け取ってwatchMessageLabelに表示したいのですが
方法がわかりません。
helloLabelには”メッセージを受け取りました”と画面に表示されるので、そこの処理は通っているのですが
メッセージを受け取って表示させる方法はどのように実装したら良いのでしょうか。
他に必要なメソッドがいるのでしょうか。
勉強不足で申し訳ありませんが、どなたかお知恵を頂きたいです。
宜しくお願い致します。
- ViewController.swift
import UIKit
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
//didReceiveMessageが通っているか確認
@IBOutlet weak var helloLabel: UILabel!
//AppleWatchから送られるメッセージを表示
@IBOutlet weak var watchMessageLabel: UILabel!
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
print("activationDidCompleteWith")
}
func sessionDidBecomeInactive(_ session: WCSession) {
print("sessionDidBecomeInactive")
}
func sessionDidDeactivate(_ session: WCSession) {
print("sessionDidDeactivate")
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if (WCSession.isSupported()) {
let session = WCSession.default
session.delegate = self
session.activate()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
replyHandler(["reply" : "OK"])
helloLabel.text = "メッセージを受け取りました"
//Applewatchから送られるメッセージを表示したい
//watchMessageLabel.text =
}
}
- InterfaceController.swift
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var textlabel: WKInterfaceLabel!
let wcSession = WCSession.default
override func awake(withContext context: Any?) {
super.awake(withContext: context)
}
override func didAppear() {
super.didAppear()
}
override func willActivate() {
super.willActivate()
let session = WCSession.default
session.delegate = self
session.activate()
}
override func didDeactivate() {
super.didDeactivate()
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
let text = session.isReachable ? "reachable" : "unreachable"
DispatchQueue.main.async {
self.textlabel.setText(text)
print("メインスレッドです")
}
}
@IBAction func buttonTap() {
if (WCSession.default.isReachable) {
let message = ["hoge" : "huga"]
WCSession.default.sendMessage(message,
replyHandler: { (reply) -> Void in
DispatchQueue.main.async {
self.textlabel.setText("ok")
}
},
errorHandler: { (error) -> Void in
DispatchQueue.main.async {
self.textlabel.setText("error")
}
}
)
}
}
}
実装環境
Xcode 10.0
Swift 4.2
AppleWatch series1
WatchOS 4.3.2
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
WCSessionのdidReceiveMessageで受け取ってLabelに表示とか
// get message from watch
func session(_ session: WCSession, didReceiveMessage message: [String: Any], replyHandler: @escaping ([String: Any]) -> Void) {
if let watchMessage = message["toParent"] as? String {
self.label.text = watchMessage
}
else{
print("error: session receive")
}
}
Swift3の内容ですが、参考にされたものよりは新しいかもしれません
4.2に合わせてください
リンク内容
リンク内容
厄介なのはiPhoneはすぐにsleepに入りますからバックグラウンドでの処理をしないといけないのと、watch側からiPhoneは起こせない仕様で第三者は制限があります(変わっているかもしれませんが)Appleのアプリはもちろんできますよ
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/10/22 14:20
記載していただいたソースでiPhone側にメッセージを表示することができました。
助かりました。ありがとうございます!!
>厄介なのはiPhoneはすぐにsleepに入りますからバックグラウンドでの処理をしないといけないのと、watch側からiPhoneは起こせない仕様で第三者は制限があります(変わっているかもしれませんが)
なるほど。
やはりwatchもiPhoneも起動しているという前提になりますよね。
iPhoneのバックグラウンド処理についても挑戦してみます!
ありがとうございました!