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

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

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

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

Swift

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

AppleWatch

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

Q&A

解決済

1回答

663閲覧

Apple WatchからiPhoneへWatch Connectivityによるデータの共有について

kenkenpa0907

総合スコア55

Xcode

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

Swift

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

AppleWatch

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

0グッド

0クリップ

投稿2022/04/28 05:51

swift初学者です。

現在、AppleWatchとiPhoneの連動したアプリの開発を行なっています。
具体的には、AppleWatchにてボタンを押したら現在時刻を取得し、そのデータをラベルで表示。そのテキストデータをiPhoneの親アプリと共有したいと思っています。
データの共有方法として、Watch Connectivityのフレームワークを使用しているのですが、うまくデータが反映されず詰まってしまったため相談をしたいです。

プログラムは下記の通りです。

ViewController

1import UIKit 2import WatchConnectivity 3 4class ViewController: UIViewController,WCSessionDelegate { 5 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 6 7 } 8 9 func sessionDidBecomeInactive(_ session: WCSession) { 10 11 } 12 13 func sessionDidDeactivate(_ session: WCSession) { 14 15 } 16 17 //Apple Watchからデータの取得 18 func session (_ session: WCSession, didReceiveMessage message: [String : Any],replyHandler:@escaping ([String : AnyObject]) -> Void){ 19 guard case let message = ["sendTime1"] as? String else { 20 return 21 } 22 DispatchQueue.main.async(){ 23 24 25 self.time1.text = message 26 } 27 let reply = ["answer" : ""] 28 29 } 30 31 //ラベル アウトレット 32 @IBOutlet weak var time1: UILabel! 33 34 35 override func viewDidLoad() { 36 super.viewDidLoad() 37 // Do any additional setup after loading the view. 38 39 //WCSession セットアップ 40 if (WCSession.isSupported()){ 41 let session = WCSession.default 42 session.delegate = self 43 session.activate() 44 } 45 } 46 47 48} 49 50 51

InterfaceController

1import WatchKit 2import Foundation 3import WatchConnectivity 4import UIKit 5 6 7class InterfaceController: WKInterfaceController, WCSessionDelegate { 8 9 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 10 11 } 12 //ラベル アウトレット 13 @IBOutlet weak var watchTime1: WKInterfaceLabel! 14 15 //session インスタンス 16 let session = WCSession.default 17 18 //データフォーマッター インスタンス 19 let formatter = DateFormatter() 20 21 //ボタンアクション 22 @IBAction func timeMemory() { 23 //現在時刻取得 24 let date = Date() 25 self.watchTime1.setText(formatter.string(from:date )) 26 27 //以下 アイフォンへテキストデータの送信 28 guard session != nil else{ 29 30 return 31 32 } 33 34 let message = ["sendTime1" : watchTime1 ] 35 36 session.sendMessage(message, replyHandler: {(responses) -> Void in 37 if let answer = responses["answer"] as? String{ 38 self.label.setText(answer) 39 } 40 41 },errorHandler: {(error) -> Void in 42 print(error) 43 }) 44 45 46 47 } 48 49 50 51 override func awake(withContext context: Any?) { 52 // Configure interface objects here. 53 54 //データフォーマッターの設定 55 formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "MdHms", options: 0, locale: Locale(identifier: "ja_JP")) 56 } 57 58 override func willActivate() { 59 // This method is called when watch view controller is about to be visible to user 60 //WCSession セットアップ 61 if (WCSession.isSupported()){ 62 let session = WCSession.default 63 session.delegate = self 64 session.activate() 65 } 66 } 67 68 override func didDeactivate() { 69 // This method is called when watch view controller is no longer visible 70 } 71 72} 73

コードは以上になります。

一応、エラー自体は出ていないのですが、AppleWatchのボタンを押しても現在時刻の取得はできるものの、そのデータがiPhoneの親アプリで共有されない状態です。
どこを修正すれば実現できるかがわかりません。

Watch Connectivityに関する資料やサイトがあまりなく、色々試してみたのですが解決できません。(SwiftUIでの記事はいくつか見つけれたのですが、自分はStoryboardで開発を行なっているため、参考にできませんでした。)

なお、参考にしていたサイトは以下のリンクになります。
https://www.storange.jp/2016/03/watch-connectivity.html

具体的な質問になっていないかもしれませんが、よければご教授いただきたいです。
また、根本的なコードが違えばご指摘して頂けると助かりますし、他に参考になる記事等があれば教えて頂けると嬉しいです
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
ありがとうございました。

投稿2022/06/25 13:26

kenkenpa0907

総合スコア55

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問