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

Posted

技术标签:

【中文标题】handleWatchKitExtensionRequest 未响应 Watchkit 扩展(Swift)中的 openParentApplication【英文标题】:handleWatchKitExtensionRequest not responding to openParentApplication in Watchkit Extension (Swift) 【发布时间】:2015-01-23 14:49:37 【问题描述】:

我正在尝试将信息从我的 WatchKit 应用程序发送到我的主父应用程序,据我所知,我应该能够在我的 watchkit 扩展中使用openParentApplication,这将由 AppDelegate.swift 中的handleWatchKitExtensionRequest 接收,但我似乎无法触发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 的任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

啊,我认为这里发生的情况是,您的代码既正确,又完全按照应有的方式工作,而您在这里解释的是两个完全可以理解的假设重叠的结果,这实际上是不正确的并一直把你引入歧途。好消息是,您的代码已经在运行了。

你说,

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

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

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

(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时,这表明已经收到了来自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 应用程序端看到这些消息。您可以继续在模拟器中与这两个应用程序进行交互,并且可以在执行期间在您所附加的应用程序之间来回切换。

【讨论】:

非常感谢您!在可能的目标下选择我的 iPhone 应用程序似乎仍然没有向我显示 iPhone 应用程序的输出(实际上它根本没有显示任何输出)但我通过传递'@987654332 为部分解决方案做了部分解决方案@' 作为我想要显示的每件事的回复中的一个项目,并将它们打印在 Watchkit Extension 输出中。但现在一切正常 - 感谢您的帮助! 关于如何使用后台模式的代码示例,以确保主应用程序有时间发送回复,请参阅“从手表应用程序调用父应用程序”(***.com/questions/30000274/…)跨度> 重要的一点:Xcode 可以同时附加到多个进程以进行调试:启动 Watch Kit 应用程序后,在 iPhone 模拟器中单击主应用程序的图标(启动它),然后回到 Xcode。在“调试”菜单的菜单栏中,选择“附加到进程”并选择您的主应用程序。现在您正在调试您的 Watch Kit 扩展程序和您的主应用程序! Ups,刚看到第二个答案.. nvm.【参考方案2】:

顺便说一句,您实际上可以在 Xcode 中同时附加到两个进程,这对于调试 WatchKit 非常有用。从 Xcode 构建并运行 WatchKit 扩展目标,它将开始在模拟器中运行。现在,在模拟器中,启动您的 ios 应用程序。运行后,转到 Debug->Attach to Process->[Name of your app process]。现在您将看到两个进程都在 Xcode 中运行,并且您将能够在两者之间进行记录、调试等。

【讨论】:

不是附加到一个进程与另一个进程分离吗?根据我的经验,您可以在会话期间在进程之间交换,但不能同时从它们中看到日志语句等。也许我错过了什么/错过了最近的变化? 我在使用 println("Debug") 时看不到主应用程序的日志。将主应用附加到 XCode Debug 后如何查看日志? 我可以确认,确实,调试上述两个进程确实有效,并且当我启动“openParent”时,我能够逐步完成我的手表套件扩展和配套应用程序。

以上是关于handleWatchKitExtensionRequest 未响应 Watchkit 扩展(Swift)中的 openParentApplication的主要内容,如果未能解决你的问题,请参考以下文章