handleWatchKitExtensionRequest不响应Watchkit扩展中的openParentApplication(Swift)

我试图从我的WatchKit应用程序发送信息到我的主要父应用程序,并从我的理解我应该只能在我的watchkit扩展中使用openParentApplication将通过在AppDelegate.swift handleWatchKitExtensionRequest接收,但我似乎无法得到handleWatchKitExtensionRequest被触发。

我一直有一些问题,所以在这一点上,我只是试图build立任何连接,然后担心实际传递的信息。 所以目前在我的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了一些真正的基础知识,但是关于如何获得handleWatchKitExtensionRequest任何帮助都将非常感谢!

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

你说,

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

如果是这样,你的意思是在控制台中看到消息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时本地访问的其他variables。 您的WatchKit扩展在接收到时会自动执行闭包中的代码。

所以当你看到openParentApplication called in button function ,这表明来自iPhone应用程序的回复已经被接收,并且闭包已经被执行了。 因此,您的WatchKittesting代码应该确实将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应用程序时不能直接反省。

所以首先,你的代码工作正常。 你可以移过你的testing代码! 而且,在回应iPhone WatchKit应用程序时反思iPhone方面的工作,有一个部分的解决scheme。 从模拟器启动WatchKit应用程序,一旦运行,在Xcode中激活菜单选项Debug> Attach to process …并在顶部的可能目标下select您的iPhone应用程序进程。 现在,您将看到您的iPhone应用程序控制台消息,并且您的iPhone应用程序将响应断点 – 但当然,您将不再从WatchKit应用程序端看到这些消息。 您可以继续在模拟器中与两个应用程序进行交互,并且可以在执行过程中来回切换所连接的应用程序。

简单的说一下,你实际上可以在Xcode中同时附加两个进程,这对debuggingWatchKit非常有用。 从Xcode构build并运行WatchKit扩展目标,它将开始在模拟器中运行。 现在,在模拟器中,启动你的iOS应用程序。 随着运行,去debugging – >附加到进程 – > [您的应用程序进程的名称]。 现在你会看到在Xcode中运行的两个进程,你可以在两者之间进行日志logging,debugging等等。