iPhone与iWatch连接、控制、数据传递(Swift)的方法

2020-01-08 23:45:57王振洲

最近在做一个项目,涉及到iPhone设备和手表传输数据、控制彼此界面跳转,在网上找了很多资料,发现国内的网站这方面介绍的不多,而国外的网站写的也不是很全,所以在这写这篇文章,给大家参考一下,望大神指点一二。

      iPhone和iWatch配对这个不需要多说,百度搜索答案一大堆,这个是前提。

      iPhone与iWatch交互的代码有两种情况,取决于iWatch的系统。iWatch OS1与OS2、3的方法不同,在OS1的系统中,iWatch发送数据的代码如下


let userInfo:[String:String] = ["key":"value"]
WKInterfaceController.openParentApplication(userInfo) { (replyInfo, error) -> Void in
}

      这个函数是发送消息,同时也是接收消息,接收到iPhone的回复是replyInfo。在iPhone端的AppDelegate中,接收消息的代码:


func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) {
}

      接收到的消息是userInfo,回复给iWatch的数据是reply。

      以上的代码仅适用于watchOS1,之后的系统就没有这个API了,对于OS2或OS3,使用的框架是WatchConnectivity,在这里,我将直接提供我写的类,并给出介绍和使用方法,大家可以直接复制代码,在我注释的地方写自己的功能便可。

以下是iPhone端的代码:


import UIKit
import WatchConnectivity
class IwatchSessionUtil: NSObject, WCSessionDelegate {
  //静态单例
  static let shareManager = IwatchSessionUtil()
  //初始化
  private override init()
  {
    super.init()
  }
  // 连接机制
  private let session:WCSession? = WCSession.isSupported() ? WCSession.default() : nil
  // 激活机制对象
  func startSession(){
    session?.delegate = self
    session?.activate()
  }
  // 检测到watch端app
  func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    print("AppleWatch匹配完成")
  }
  // 开始向Watch传递数据
  func sessionDidBecomeInactive(_ session: WCSession) {
  }
  // 数据传递完了
  func sessionDidDeactivate(_ session: WCSession) {
  }
  // watch侧发送数据过来,iPhone接收到数据并回复数据过去
  // message: watch侧发送过来的信息
  // replyHandler: iPhone回复过去的信息
  func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
    // 在这里,我们接收到watch发送过来的数据,可以用代理、代码块或者通知中心传值到ViewController,做出一系列操作。
    // 注!!:watch侧发送过来信息,iPhone回复直接在这个函数里回复replyHandler([String : Any])(replyHandler(数据)),这样watch侧发送数据的函数对应的reply才能接收到数据,别跟sendMessage这个函数混淆了。如果用sendMessage回复,那watch侧接收到信息就是didReceiveMessage的函数。
  }
  // iPhone向watch发送数据
  // key: 数据的key值
  // value: 数据内容
  func sendMessageToWatch(key:String,value:Any) {
    session?.sendMessage([key : value], replyHandler: { (dict:Dictionary) in
    // 这里是发送数据后的操作,比如写个alert提示发送成功
   // replyHandler是watch侧didReceiveMessage函数接收到信息后reply回复过来的内容,这里可以编辑自己需要的功能
    }, errorHandler: { (Error) in
      // 发送失败,一般是蓝牙没开,或手机开了飞行模式
    })
  }
}