gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:11 24 4
gpt4 key购买 nike

我正在尝试将信息从我的 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 的任何帮助被触发将不胜感激!

最佳答案

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

你说,

...which shows in the output that the function is being called...

如果您的意思是您在控制台中看到消息,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 Extension 在收到返回时自动执行闭包中的代码。

因此,当您看到 openParentApplication 在按钮函数中调用 时,这表明已收到来自 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 应用程序时反射(reflection) iPhone 端的工作方式,有一个部分解决方案。从模拟器启动 WatchKit 应用程序,一旦它运行,在 Xcode 中激活菜单选项 Debug > Attach to process... 并在 Likely targets 下选择您的 iPhone 应用程序进程> 在顶部。现在您将看到您的 iPhone 应用程序控制台消息,并且您的 iPhone 应用程序将响应断点——但是您当然不会再从 WatchKit 应用程序端看到这些。您继续能够在模拟器中与这两个应用程序进行交互,并且可以在执行期间在您所连接的应用程序之间来回切换。

关于ios - handleWatchKitExtensionRequest 不响应 Watchkit 扩展中的 openParentApplication (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28112445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com