如何触发与Apple Watch后端的通信?

时间:2015-04-29 09:28:56

标签: ios swift watchkit apple-watch

我想点击Apple Watch触发器与后端通信的推送通知,并在Apple Watch的表格中显示结果。

我知道如何在Apple Watch上的表格中显示结果。我也知道openParentApplication:reply:方法。

但是,如果我想在application:handleWatchKitExtensionRequest:reply:中触发我的后端通信,则会收到reply()从未调用的错误。如果花费很多时间,iOS似乎会杀死这个方法。

如果我用只有一个条目的硬编码字典测试application:handleWatchKitExtensionRequest:reply:,那么一切正常。

这是推荐的方法吗?

在我看来,我应该在didReceiveRemoteNotification方法和应用程序组中的NotificationController.swift中执行某些操作但是如何在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更改为后端通信代码,则此方法将被终止。

2 个答案:

答案 0 :(得分:1)

今天我找到了解决问题的方法。您无法在回复字典中传递自定义对象,您必须使用基本类型。

洗脱液在下页Kristina Thai上进行了描述。

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

答案 1 :(得分:0)

您需要在iPhone上启动后台任务,以确保在您的API请求完成之前,您的应用不会在后台被杀死。我在这里用类似的答案分享了一些资源:https://stackoverflow.com/a/29848521/3704092