WatchOS2的调试建议

时间:2015-11-14 19:43:48

标签: swift watchkit watch-os-2

我已经在RayWenderlich专门讨论了WatchOS 2 By Tutorial一书中的示例,特别是第18章。它们都运行良好。在我自己的应用程序中,我试图从手表发送按钮按下iPhone应用程序上的按钮。这是来自Watch and the Phone的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)")
    }

}

和接收代码 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)")
  }
}

我在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: ")
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

当你说:

时,需要更多关于你在手表上看到的内容的信息
  

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

然而,一个常见的情况是iPhone代码实际上正常工作,并且您唯一看不到的是打印到控制台的调试语句。这似乎可能是这种情况,因为您说您正在看到预期的观看消息,可能包括来自print("Reply: \(reply)")的消息。这表示iPhone正在处理该消息。

在这种情况下,通常只是希望同时看到来自Watch和iOS模拟器进程的调试控制台消息,但实际上您只是连接到其中一个。你可以在这里做(至少)两件事:

  1. 从Xcode运行WatchKit应用程序,但随后更改为连接到iPhone进程。在Xcode中,转到Debug > Attach to Process...并选择“可能目标”下的iPhone应用程序。
  2. 首先运行iPhone应用程序,这意味着您已经附加到该进程。在Apple Watch模拟器中,运行Watch应用程序。然后,您就可以调试通信的iPhone端。

答案 1 :(得分:0)

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

目视: -

enter image description here