手表应用即使在后台也能接收后台信息吗?

Posted

技术标签:

【中文标题】手表应用即使在后台也能接收后台信息吗?【英文标题】:Can the watch app receive background info even if the app is in the background? 【发布时间】:2018-04-09 08:15:08 【问题描述】:

我无法弄清楚如何让updateApplicationContext 数据在手表应用程序处于前台之前到达手表。它似乎只有在手表应用程序处于前台时才有效。

手表如何在后台接收文件?

这就是我一直在努力实现的目标:

ios 代码:

func sendDataToWatch() 
        if WCSession.isSupported() 
            do 
                try WCSession.default.updateApplicationContext(["key":value])
             catch 
                print("ERROR: \(error)")
            
        
    

观看代码:

func session(_ session: WCSession, didReceiveApplicationContext
        applicationContext:[String : Any]) 

      //handle data when it arrives

    

我注意到 WatchConnectivity 提供了一个处理函数。这是我应该设置的东西,以便能够在 Watch 应用程序处于后台或什至未启动时处理后台连接吗?

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) 
    // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one.
    for task in backgroundTasks 
        // Use a switch statement to check the task type
        switch task 
        case let backgroundTask as WKApplicationRefreshBackgroundTask:
            // Be sure to complete the background task once you’re done.
            backgroundTask.setTaskCompletedWithSnapshot(false)
        default:
            // make sure to complete unhandled task types
            task.setTaskCompletedWithSnapshot(false)
        
    

【问题讨论】:

你试过什么?请发布一个示例。 我已经用我的例子编辑了这个问题 【参考方案1】:

根据苹果的说法,您可以在会话可达时使用 SendMessage 将数据从 iPhone 发送到 Apple Watch。

https://developer.apple.com/documentation/watchconnectivity/wcsession/1615687-sendmessage

在 WatchKit 扩展程序处于活动状态时调用此方法 并运行在后台唤醒相应的 iOS 应用程序和 使其可达。

您可以使用以下方法将数据从 iPhone 发送到 Apple Watch

斯威夫特 2.2

let msg = ["IPrequest":"IsLogin"]

WCSession.defaultSession().sendMessage(msg, replyHandler:  (replyDict) in
    print(replyDict)
    , errorHandler:  (error) in
        print(error)
)

使用以下方法接收字典

斯威夫特 2.2

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)


    dispatch_async(dispatch_get_main_queue())  () -> Void in

        print("Response:\(message)")

    

我已经在我的一个项目中实施了上述解决方案。

希望对你有帮助!

【讨论】:

我想反其道而行之。从 iOS 到 Watch 应用。从同一文档页面:“从您的 iOS 应用程序调用此方法不会唤醒相应的 WatchKit 扩展。” 我正在尝试想出一款可以很好地完成您所描述的应用程序。许多人在打开之前不会同步。 我要做的是在 iOS 应用程序运行时将数据发送到手表。当从 iOS 安排的本地通知触发时,我想显示之前已经发送到手表的数据。如果我在通知开始处理时尝试发送数据,那将花费太长时间。我想在通知中显示一个图像,但它会在 iOS 应用程序运行时由 iOS 应用程序通过 MKMapSnapshotter 生成。

以上是关于手表应用即使在后台也能接收后台信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以让Watch应用程序在后台运行吗?

即使在应用程序终止后也能获得 Apple 的远程推送通知

我可以让 Watch 应用程序在后台运行吗?

Firebase 云消息服务 - 即使应用程序被杀死也能接收通知

即使应用程序关闭,whatsapp 如何设法接收推送通知?

应用程序从后台删除后,服务内的广播接收器未收听