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

时间:2015-01-23 14:49:37

标签: ios swift watchkit watch-os

我正在尝试将我的WatchKit应用程序中的信息发送到我的主要父应用程序,根据我的理解,我应该能够在我的watchkit扩展中使用openParentApplicationhandleWatchKitExtensionRequest将会收到在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被触发的任何帮助都将是巨大的理解!

2 个答案:

答案 0 :(得分:25)

啊,我认为这里发生的事情是你的代码是正确的,并且正确地工作,你在这里解释的是两个完全可以理解的假设重叠的结果,实际上是不正确的并一直把你引入歧途。所以好消息是,你的代码已经在运行了。

你说,

  

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

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

这部分代码是Swift Closure:

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

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

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

openParentApplication called in button function

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

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

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

首先,您的代码正常运行。您可以移过测试代码!而且,当它响应你的WatchKit应用程序时,在内省iPhone方面的工作方面,有一个部分解决方案。从模拟器启动WatchKit应用程序,一旦运行,在Xcode中激活菜单选项 Debug&gt;附加到流程... 并在顶部的可能目标下选择您的iPhone应用程序流程。现在您将看到您的iPhone应用程序控制台消息,您的iPhone应用程序将响应断点 - 但当然您将不再从WatchKit应用程序端看到这些消息。您仍然可以在模拟器中与这两个应用程序进行交互,并且可以在执行期间来回切换您所连接的应用程序。

答案 1 :(得分:15)

只是旁注,您实际上可以在Xcode中同时附加到两个进程,它对于调试WatchKit非常有用。从Xcode构建并运行WatchKit Extension目标,它将开始在模拟器中运行。现在,在模拟器中,启动您的iOS应用程序。运行后,转到Debug-&gt; Attach to Process-&gt; [应用程序进程的名称]。现在,您将看到在Xcode中运行的两个进程,您将能够跨两者进行记录,调试等。