啊,我认为这里发生的事情是你的代码是正确的,并且完全按照它应该的方式工作,而你在这里解释的是两个完全可以理解的假设重叠的结果,这些假设实际上是不正确的并且已经被让你误入歧途。好消息是,您的代码已经可以运行了。
你说,
...在输出中显示正在调用该函数...
如果您的意思是在控制台中看到该消息,openParentApplication called in button function
,那么这是发生了什么:
这部分代码是 Swift Closure:
{(reply, error) -> Void in
println("openParentApplication called in button function")
}
当您的 WatchKit 扩展调用时WKInterfaceController.openParentApplication
它会向你的父 iPhone 应用程序传递一本字典(你的testDict
),iPhone 应用程序可以使用它向您返回数据 — 前提是数据已序列化。它还会将您传递给它的闭包返回给您。这使您的 WatchKit 扩展能够在收到回复后运行它自己定义的代码。您可以在此闭包中包含使用返回的数据testDict
以及当时可在本地访问的其他变量openParentApplication
被称为。当您的 WatchKit 扩展收到返回时,它会自动执行闭包中的代码。
所以当你看到openParentApplication called in button function
,这表明reply已收到来自 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 中激活菜单选项调试 > 附加到进程...并在下面选择您的 iPhone 应用程序进程可能的目标在顶部。现在,您将看到 iPhone 应用程序控制台消息,并且您的 iPhone 应用程序将响应断点,但当然您将不再从 WatchKit 应用程序端看到这些消息。您继续能够与模拟器中的两个应用程序进行交互,并且可以在执行期间在附加的应用程序之间来回交换。