WatchOS2的调试建议

Mic*_*owe 7 swift watchkit watchos-2

我一直在阅读RayWenderlich团队的WatchOS 2 By Tutorial一书中的例子,特别是第18章.它们都运行良好.在我自己的应用程序中,我试图从手表发送按钮按下iPhone应用程序上的按钮.以下是手表和手机中Swift的相关代码:

看:

//
//  InterfaceController.swift
//  Wasted Time Extension
//
//  Created by Michael Rowe on 7/21/15.
//  Copyright © 2010-2015 Michael Rowe. All rights reserved.
//

import WatchKit
import WatchConnectivity
import Foundation


class InterfaceController: WKInterfaceController,WCSessionDelegate {

    @IBOutlet var wasteLabel: WKInterfaceLabel!
    @IBOutlet var costLabel: WKInterfaceLabel!
    @IBOutlet var counter: WKInterfaceLabel!
    @IBOutlet var statusButton: WKInterfaceButton!

    // our watchconnective session
    var session : WCSession?


    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
    }

    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()

        if(WCSession.isSupported()){
            session = WCSession.defaultSession()
            session!.delegate = self
            session!.activateSession()
        }
    }

    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }

    func session(session: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: [String: AnyObject] -> Void) {

        print("Did receive message Watch \(message)")
    }

    @IBAction func addButtonPressed() {

        // Pull values from the Phone for current meeting cost, waste costs, and people in meeting
        let prefs:NSUserDefaults = NSUserDefaults(suiteName: "a.b.c")!

        var counterd = prefs.doubleForKey("keyPeopleInMeeting")


        counterd++
        counter.setText(String(format:"%9.0f", counterd))

        // Sending data to iPhone via Interactive Messaging
        if WCSession.isSupported(){
            // we have a watch supporting iPhone

            let session = WCSession.defaultSession()

            // we can reach the watch
            if session.reachable {
                let message = ["add": "1"]
                print("Message \(message)")
                session.transferUserInfo(message)
                print("Send Message Add - People \(counterd)")
            }
        }

        if WCSession.isSupported() {
            let session = WCSession.defaultSession()
            if session.reachable {
            let message = ["add":"1"]
            session.sendMessage(message, replyHandler: { ( reply: [String: AnyObject]) -> Void in
            print("Reply: \(reply)")
            }, errorHandler: { (error: NSError) -> Void in
            print("ERROR Watch: \(error.localizedDescription)")
            })
        } else { // reachable
            self.showReachabilityError()
            }
        }

        print("Watch Add Button Pressed \(counterd)")
    }

    @IBAction func minusButtonPressed() {
        // Pull values from the Phone for current meeting cost, waste costs, and people in meeting
        let prefs:NSUserDefaults = NSUserDefaults(suiteName: "a.b.c")!

        var counterd = prefs.doubleForKey("keyPeopleInMeeting")
        counterd--
        if (counterd <= 1) {
            counterd = 1
        }
        counter.setText(String(format:"%9.0f", counterd))

        if WCSession.isSupported() {
            let session = WCSession.defaultSession()
            if session.reachable {
                let message = ["minus":"1"]
            session.sendMessage(message, replyHandler: { ( reply: [String: AnyObject]) -> Void in
            print("Reply: \(reply)")
            }, errorHandler: { (error: NSError) -> Void in
            print("ERROR Watch: \(error.localizedDescription)")
            })
            } else { // reachable
                self.showReachabilityError()
            }
        }

        print("Watch Minus Button Pressed \(counterd)")
 }

    func statusButtonPressed() {
        // Pull values from the Phone for current meeting cost, waste costs, and people in meeting
        let prefs:NSUserDefaults = NSUserDefaults(suiteName: "a.b.c")!

        let status = statusButton.description

        if WCSession.isSupported() {
            let session = WCSession.defaultSession()
            if session.reachable {
            let message = ["status":status]
            session.sendMessage(message, replyHandler: { ( reply: [String: AnyObject]) -> Void in
            print("Reply: \(reply)")
            }, errorHandler: { (error: NSError) -> Void in
            print("ERROR Watch: \(error.localizedDescription)")
            })
        } else { // reachable
            self.showReachabilityError()
            }
        }

        print("Watch Status Button Pressed - Status \(statusButton)")
    }

    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){

        let prefs:NSUserDefaults = NSUserDefaults(suiteName: "a.b.c")!

        if let waste = applicationContext["waste"] as? Float {
            print("Watch Receive - Waste \(waste)")
        }

        if let cost = applicationContext["cost"] as? Float {
            print("Watch Receive - Cost \(cost)")
        }

        if let counternum = applicationContext["counter"] as? Float {
            print("Watch Receive - Counter \(counternum)")
        }

        if let status = applicationContext["status"] as? String {
            print("Watch Receive - Status \(status)")
            statusButton.setTitle(status)
        }

    }

    private func showReachabilityError() {
            let tryAgain = WKAlertAction(title: "Try Again", style: .Default, handler: { () -> Void in })
            let cancel = WKAlertAction(title: "Cancel", style: .Cancel, handler: { () -> Void in })
            self.presentAlertControllerWithTitle("Your iPhone is not reachable.", message: "You cannot adjust the status or number of attendees Watch is not currently connected to your iPhone. Please ensure your iPhone is on and within range of your Watch.", preferredStyle: WKAlertControllerStyle.Alert, actions:[tryAgain, cancel])
    }

    func session(session: WCSession, didFinishUserInfoTransfer userInfoTransfer: WCSessionUserInfoTransfer, error: NSError?) {

        print("Transfer User Info Error watch: \(error)")
    }

}
Run Code Online (Sandbox Code Playgroud)

和iPhone上的接收代码:代码:

func session(session: WCSession,
  didReceiveMessage message: [String : AnyObject],
  replyHandler: ([String : AnyObject]) -> Void) {

  if let counterd = message["add"] as? Float {
      let reply = ["add":counterd]
      print("iPhone Receive Add \(counterd)")
      addButtonPressed(self)
      replyHandler(reply)
  }

  if let counterd = message["minus"] as? Float {
      let reply = ["minus":counterd]
      print("iPhone Receive minus \(counterd)")
      removeButtonPressed(self)
      replyHandler(reply)
  }

  if let status = message["status"] as? String {
      if status == "Start" {
          let reply = ["status":"Quorum"]
          meetingStartedButtonPressed(self)
          replyHandler(reply)
      }
      if status == "Quorum" {
          let reply = ["status": "Finish"]
          quorumButtonPressed(self)
          replyHandler(reply)
      }
      if status == "Finish" {
          let reply = ["status": "Reset"]
          meetingEndedButtonPressed(self)
          replyHandler(reply)
      }
      if status == "Reset" {
          let reply = ["status": "Start"]
          resetButtonPressed(self)
          replyHandler(reply)
      }
      print("iPhone Received Status Button \(status)")
  }
}
Run Code Online (Sandbox Code Playgroud)

我在Watch上发送消息并在调试日志中看到它们......但它们似乎没有在电话上触发.手机已成功将信息发送至手表.

我已经在模拟器和我自己的手表和iPhone上测试了这段代码.请注意,从iPhone到Watch的消息是使用via updateApplicationContext与我尝试用来将消息从手表发送到iPhone的发送消息完成的.以下是发送上下文的iPhone代码示例:

        if WCSession.isSupported() {
        if session.watchAppInstalled {
            let UserInfo = ["waste":Float((wastedAmount.text! as NSString).floatValue), "cost":Float((totalAmount.text! as NSString).floatValue), "counter":Float((peopleInMeeting.text! as NSString).floatValue), "status":"Start"]
            do {
                try session.updateApplicationContext(UserInfo as! [String : AnyObject])
            } catch {
                print("Updating the context failed: ")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Shr*_*wan 1

在运行 iPhone 应用程序时在 Watch-OS 中进行调试,反之亦然在 Xcode-8.1 中进行调试。需要附上所需的运行流程

视觉上:-

在此输入图像描述