如何从 Apple Watch 触发与后端的通信?
How to trigger communication with backend from Apple Watch?
我想在我的 Apple Watch 上单击推送通知触发与后端的通信,并在我的 Apple Watch 上的 table 中显示结果。
我知道如何在我的 Apple Watch 上的 table 中显示结果。我也知道 openParentApplication:reply:
方法。
但是如果我想在 application:handleWatchKitExtensionRequest:reply:
中触发我的后端通信,我会收到一个错误消息,指出 reply()
从未被调用。似乎 iOS 如果需要很长时间就终止这个方法。
如果我用只有一个条目的硬编码字典测试 application:handleWatchKitExtensionRequest:reply:
,一切正常。
这是推荐的方法吗?
在我看来,我应该在 NotificationController.swift 中的 didReceiveRemoteNotification
方法和应用程序组中做一些事情,但是如何在我的 iPhone 上触发后端通信?
更新:
我在 AppDelefate.swift 中的部分代码:
func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {
var workaround: UIBackgroundTaskIdentifier?
workaround = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
UIApplication.sharedApplication().endBackgroundTask(workaround!)
})
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), {
UIApplication.sharedApplication().endBackgroundTask(workaround!)
})
var realBackgroundTaks: UIBackgroundTaskIdentifier?
realBackgroundTaks = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
reply(nil)
UIApplication.sharedApplication().endBackgroundTask(realBackgroundTaks!)
})
let testDict = ["Hello" : "World"]
reply(testDict)
UIApplication.sharedApplication().endBackgroundTask(realBackgroundTaks!)
}
这段代码工作正常。
但是,如果我将 testDict 更改为后端通信代码,此方法将被终止。
您需要在 iPhone 上启动后台任务,以确保您的应用程序不会在您的 API 请求完成之前在后台被终止。我在这里的类似答案中分享了一些资源:
今天我找到了解决问题的方法。您不能在回复字典中传递自定义对象,您必须使用原始类型。
Kristina Thai 的下一页描述了裂解。
我想在我的 Apple Watch 上单击推送通知触发与后端的通信,并在我的 Apple Watch 上的 table 中显示结果。
我知道如何在我的 Apple Watch 上的 table 中显示结果。我也知道 openParentApplication:reply:
方法。
但是如果我想在 application:handleWatchKitExtensionRequest:reply:
中触发我的后端通信,我会收到一个错误消息,指出 reply()
从未被调用。似乎 iOS 如果需要很长时间就终止这个方法。
如果我用只有一个条目的硬编码字典测试 application:handleWatchKitExtensionRequest:reply:
,一切正常。
这是推荐的方法吗?
在我看来,我应该在 NotificationController.swift 中的 didReceiveRemoteNotification
方法和应用程序组中做一些事情,但是如何在我的 iPhone 上触发后端通信?
更新:
我在 AppDelefate.swift 中的部分代码:
func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {
var workaround: UIBackgroundTaskIdentifier?
workaround = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
UIApplication.sharedApplication().endBackgroundTask(workaround!)
})
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), {
UIApplication.sharedApplication().endBackgroundTask(workaround!)
})
var realBackgroundTaks: UIBackgroundTaskIdentifier?
realBackgroundTaks = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
reply(nil)
UIApplication.sharedApplication().endBackgroundTask(realBackgroundTaks!)
})
let testDict = ["Hello" : "World"]
reply(testDict)
UIApplication.sharedApplication().endBackgroundTask(realBackgroundTaks!)
}
这段代码工作正常。 但是,如果我将 testDict 更改为后端通信代码,此方法将被终止。
您需要在 iPhone 上启动后台任务,以确保您的应用程序不会在您的 API 请求完成之前在后台被终止。我在这里的类似答案中分享了一些资源:
今天我找到了解决问题的方法。您不能在回复字典中传递自定义对象,您必须使用原始类型。
Kristina Thai 的下一页描述了裂解。