Apple Watch背景模式?

时间:2016-02-05 10:55:50

标签: ios iphone swift watchkit apple-watch

我正在开发苹果手表应用程序。当我运行应用程序它工作正常。现在我的问题是,当应用程序进入后台模式时,Apple Watch应用程序上的应用程序将自动关闭。我在iPhone应用程序中编写小代码:

func viewDidLoad() {

    if (WCSession.isSupported()) {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()

        // In your WatchKit extension, the value of this property is true when the paired iPhone is reachable via Bluetooth.
        // On iOS, the value is true when the paired Apple Watch is reachable via Bluetooth and the associated Watch app is running in the foreground.
        // In all other cases, the value is false.
        if session.reachable {
            lblStatus.text = "Reachable"

        }
        else
        {
            lblStatus.text = "Not Reachable"


        }
        func sessionReachabilityDidChange(session: WCSession)
        {
            if session.reachable {
                dispatch_async(dispatch_get_main_queue(), {
                    self.lblStatus.text = "Reachable"
                })

            }
            else
            {
                dispatch_async(dispatch_get_main_queue(), {
                    self.lblStatus.text = "Not Reachable"
                })
            }
        }
    }
}
WatchExtention Code中的

func someFunc() {
    if (WCSession.isSupported()) {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()



        if session.reachable {
            ispatch_async(dispatch_get_main_queue(), {
                self.lblStatus.setText("Reachable")
            })

        }
        else
        {
            dispatch_async(dispatch_get_main_queue(), {
                self.lblStatus.setText("Not Reachable")
            })
        }
        func sessionReachabilityDidChange(session: WCSession)
        {

            if session.reachable {
                dispatch_async(dispatch_get_main_queue(), {
                    self.lblStatus.setText("Reachable")
                })

            }
            else
            {
                dispatch_async(dispatch_get_main_queue(), {
                    self.lblStatus.setText("Not Reachable")
                })
            }
        }
    }
}

现在进入苹果背景时观看iPhone应用程序显示无法访问的原因?

2 个答案:

答案 0 :(得分:2)

这是AppleWatch的默认行为,主要是为了节省电池等资源。

  

session.reachable属性仅当通过蓝牙可以访问Apple Watch并且相关的Watch应用程序在   在所有其他情况下,前景值为false。

在您的情况下导致问题的第二个选项我认为蓝牙连接正在运行。

无论如何,问题是你想达到什么目的。

实际上,简单的规则就是你无法从iPhone唤醒Watch,但你可以从Watch中唤醒iPhone应用程序。

有两种方式可以在手表背景中有三个选项到达手表:在背景中发送并发症更新或发送消息(2个选项),当手表再次唤醒时可用于手表。 所有这些都是WCSession Class的一部分。

发送消息的两个选项是:

- updateApplicationContext:error:

您可以使用此方法将数据字典传输到对应的Watch app.iPhone在机会出现时发送上下文数据,表示Watch应用程序何时出现.Watch上的对方会话通过会话获取数据:didReceiveUpdate :方法或来自receivedApplicationContext属性。

当手表当前无法访问时,您可以调用此方法。

另一种选择是在后台发送数据,如

- transferUserInfo:

如果要向Watch发送数据字典并确保已传递数据,则可以使用此方法。使用此方法发送的字典在其他设备上排队,并按发送顺序发送。传输开始后,即使应用程序被暂停,传输操作也会继续。

但对于这两种方法都是如此,只有在会话处于活动状态时才能调用它们。为非活动或停用的会话调用任何这些方法都是程序员错误。

并发症解决方案有点不同但属于与早期相同的WCSession类。

-transferCurrentComplicationUserInfo:

此方法专门用于将复杂功能用户信息传输到手表,目的是立即显示在表盘上。 当然它仅适用于iOS,并且使用此方法会影响您的并发症的时间预算,因此它的可用性有限。

复杂用户信息位于队列的前面,因此手表会在后台唤醒扩展程序以接收信息,然后立即进行传输。

您的监视应用收到的所有消息都会在后台线程上以串行方式传递给会话代理,因此您必须切换到主队列,以防您想要使用或呈现UI。

答案 1 :(得分:1)

WWDC talk on WatchConnectivity详细讨论了“可达性”及其细微差别,所以你一定要给它一块手表。

TL; DR:当手表应用程序的UI在屏幕上可见时,手表上的可达性大部分仅为真/是。