ios - Apple Watch 无法将数据传递至 iPhone - Swift

标签 ios iphone swift watchkit apple-watch

我正在尝试将字符串从 Apple Watch 传递到 iPhone,但似乎无法连接。这是我的代码:

ViewController.swift:

import UIKit
import WatchConnectivity

class ViewController: UIViewController, WCSessionDelegate {

    @IBOutlet weak var lablel: UILabel!
    var string = "Hello World"
    let session = WCSession.default()


    override func viewDidLoad() {
        super.viewDidLoad()

        session.delegate = self
        session.activate()

    }


    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
        let msg = message["StringValueSentFromiWatch"] as! String
        lablel.text = "Message : \(msg)"

        print("iphone recieved message")
    }

    func session(_ session: WCSession,
                 activationDidCompleteWith activationState: WCSessionActivationState,
                 error: Error?) {

    }

    func sessionDidBecomeInactive(_ session: WCSession) {

    }

    func sessionDidDeactivate(_ session: WCSession) {

    }
}

InterfaceController.swift:

import WatchKit
import Foundation
import WatchConnectivity


class InterfaceController: WKInterfaceController, WCSessionDelegate {

     let session = WCSession.default()

    override func willActivate() {
        super.willActivate()

        session.delegate = self
        session.activate()
    }

    @IBAction func SendPressed() {

        //Send Data to iOS
        let msg = ["StringValueSentFromiWatch" : "Hello World"]
        session.sendMessage(msg, replyHandler: { (replay) -> Void in
            print("apple watch sent")
        }) { (error) -> Void in
         print("apple watch sent error")
        }

    }

    func session(_ session: WCSession,
                 activationDidCompleteWith activationState: WCSessionActivationState,
                 error: Error?){
    }

}

我正在尝试将“Hello World”发送到 iPhone,但我在控制台中收到以下打印输出:

errorHandler: YES with WCErrorCodePayloadUnsupportedTypes

和“Apple Watch 发送错误”。

我知道它没有发送,但我不知道为什么。有谁知道为什么这不起作用?

注意:我运行的是模拟器,但我相当确定这不是问题。

最佳答案

我认为您在 sendMessage() 中搞砸了,我无法计算出replyHandler 语法,并且您错过了 errorHandler: 参数。

无论如何,我已经尝试过您的代码,并且经过一些更改就可以工作。

1).在 InterfaceController 中,sendPressed():

    var count = 0    
@IBAction func SendPressed() {
    //Send Data to iOS
    let msg = ["Count" : "\(count)"]

    if session.isReachable {
        session.sendMessage(msg, replyHandler: nil, errorHandler: { (error) -> Void in
            print("Error handler: \(error)")
        })
        count += 1
    }
}

我添加了一个计数,因为每次调用的消息都必须有所不同(以节省电池),因此您现在可以连续按几次按钮。并进行检查以验证主机应用程序是否可访问。

2.) 在 ViewController 中,记得在主线程上更新 GUI:

    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
    DispatchQueue.main.async {
        self.lablel.text = "Message : \(message)"
    }
}

否则,当您收到数据时,标签将不会更新。

如果对您有帮助,请告诉我!

关于ios - Apple Watch 无法将数据传递至 iPhone - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41465911/

相关文章:

ios - 配套应用程序如何(如果有的话)生成具有不同 Logo 和 Logo 文本的通行证?

iphone - iOS 在 UITableViewCell 中创建类似 iBook 的界面

Swift 中的 JSON 数据序列化

ios - 用于 ANCS iPhone 的 BLE Shield

ios - 我可以在相册中保存带 TextView 的图像吗?

ios - 如何在 SpriteKit 中高效地画一条线

iphone - NSPredicate 以多个文件结尾

iPhone 设置 bundle - 只读设置

ios - 确定您的应用程序之前是否在 iOS 中安装过

swift - 为什么需要在类外定义可等式协议(protocol)?