質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

Q&A

解決済

1回答

2074閲覧

AppleWatchから送られてくるメッセージを表示したい

bignnerSwift

総合スコア20

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

0グッド

0クリップ

投稿2018/10/22 02:49

編集2018/10/22 03:14

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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のアプリはもちろんできますよ

投稿2018/10/22 04:34

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bignnerSwift

2018/10/22 05:20

aja様 記載していただいたソースでiPhone側にメッセージを表示することができました。 助かりました。ありがとうございます!! >厄介なのはiPhoneはすぐにsleepに入りますからバックグラウンドでの処理をしないといけないのと、watch側からiPhoneは起こせない仕様で第三者は制限があります(変わっているかもしれませんが) なるほど。 やはりwatchもiPhoneも起動しているという前提になりますよね。 iPhoneのバックグラウンド処理についても挑戦してみます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問