如何从 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 的下一页描述了裂解。

http://realm.io/news/watchkit-mistakes/