6

我正在尝试将信息从我的 WatchKit 应用程序发送到我的主要父应用程序,据我所知,我应该能够openParentApplication在我的 watchkit 扩展中使用,这将handleWatchKitExtensionRequest在 AppDelegate.swift 中接收,但我似乎无法handleWatchKitExtensionRequest成为触发。

我遇到了一些问题,所以此时我只是想建立任何连接,然后再担心实际传递了哪些信息。所以目前在我的 Watchkit ViewController 我有以下内容:

 let testDict = [
    "value1" : "Test 1",
    "value2" : "Test 2"
]

@IBAction func saveButtonFunction() {
    openParentAppForBalance(testDict)
}

private func openParentAppForInfo(Dict: [String: String]) {

    WKInterfaceController.openParentApplication(testDict,
        reply: {(reply, error) -> Void in
            println("openParentApplication called in button function")
    })
}

这在输出中显示该函数正在被调用,但handleWatchKitExtensionRequest不会响应。目前它在 AppDelegate.swift 中设置为以下内容,永远不会被调用:

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

    println("we made it!")

    var retValues = Dictionary<String,String>()

    retValues["retval1"] = "return Test 1"
    retValues["retval1"] = "return Test 2"

    reply(retValues)

}

我敢肯定,在我对这一切如何运作的理解中,我可能只是错过了一些真正基础的东西,但是任何关于如何handleWatchKitExtensionRequest被触发的帮助都将不胜感激!

4

2 回答 2

25

啊,我认为这里发生的事情是你的代码是正确的,并且完全按照它应该的方式工作,你在这里解释的是两个完全可以理解的假设重叠的结果,这些假设实际上是不正确的并且一直是让你误入歧途。所以好消息是,你的代码已经在工作了。

你说,

...在输出中显示正在调用该函数...

如果您的意思是在控制台中看到消息,openParentApplication called in button function那么这就是发生的事情:

这部分代码是一个 Swift 闭包:

{(reply, error) -> Void in
        println("openParentApplication called in button function")
}

当您的 WatchKit Extension 调用WKInterfaceController.openParentApplication时,它会向您的父 iPhone 应用程序传递一个字典(您的testDict),iPhone 应用程序可以使用该字典向您返回数据——前提是数据已被序列化。它还会将您传递给它的闭包返回给您。这使您的 WatchKit 扩展能够在稍后收到回复时运行它自己定义的代码。您可以在此闭包中使用返回的数据以及在调用testDict时本地可访问的其他变量。openParentApplication您的 WatchKit 扩展在收到返回时会自动执行闭包中的代码。

所以当你看到 时openParentApplication called in button function,这表示已经收到来自 iPhone 应用程序的回复,并且已经执行了闭包。因此,您的 WatchKit 测试代码应该真正将 println 语句更改为:

WKInterfaceController.openParentApplication(testDict,
    reply: {(reply, error) -> Void in
        println("Reply to openParentApplication received from iPhone app")
    })

现在,您完全可以理解的是,您没有意识到代码正在正确执行的原因是因为您希望在控制台中看到该代码已在您的 iPhone 应用程序中执行的拒绝:

println("we made it!")

但是,Xcode 不支持同时附加到两个进程。因此,当您连接到 WatchKit 应用程序时,您将看不到 iPhone 应用程序的任何日志消息。如果不是附加进程,您的 iPhone 应用程序也不会响应断点。无论是在后台运行(由 唤醒openParentApplication)还是在前台运行(如果您在运行 WatchKit 应用程序后在模拟器中手动启动它,这两者都是正确的。您可以看到 iPhone 应用程序活动的效果,但是当您连接到 WatchKit 应用程序时,无法直接对其进行内省。

因此,首先,您的代码工作正常。您可以跳过您的测试代码!关于在响应您的 WatchKit 应用程序时检查 iPhone 端的工作原理,有一个部分解决方案。从模拟器启动 WatchKit 应用程序,一旦它运行,在 Xcode 中激活菜单选项Debug > Attach to process...并在顶部的Likely targets下选择您的 iPhone 应用程序进程。现在您将看到您的 iPhone 应用程序控制台消息,并且您的 iPhone 应用程序将响应断点——当然您将不再从 WatchKit 应用程序端看到这些消息。您可以继续与模拟器中的两个应用程序进行交互,并且可以在执行期间在您所连接的应用程序之间来回切换。

于 2015-01-23T19:07:49.157 回答
15

Just a side note, you actually can attach to two processes simultaneously in Xcode and it's very useful for debugging WatchKit. Build and run your WatchKit Extension target from Xcode and it'll start running in the simulator. Now, in the simulator, launch your iOS app. With that running, go to Debug->Attach to Process->[Name of your app process]. Now you'll see both processes running in Xcode and you'll be able to log, debug, etc... across both.

于 2015-03-06T22:48:09.007 回答