Ios 苹果手表背景模式?

Ios 苹果手表背景模式?,ios,iphone,swift,watchkit,apple-watch,Ios,Iphone,Swift,Watchkit,Apple Watch,我正在开发apple watch应用程序。当我运行应用程序时,它工作正常。现在我的问题是,当应用程序进入后台模式时,apple watch应用程序上的应用程序将自动关闭。我正在iPhone应用程序中编写小代码: func viewDidLoad() { if (WCSession.isSupported()) { let session = WCSession.defaultSession() session.delegate = self

我正在开发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"
                })
            }
        }
    }
}
在WatchExtension中,代码是

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")
                })
            }
        }
    }
}
现在,当进入apple Watch中的后台时,iPhone应用程序显示无法访问为什么?

会详细讨论“可访问性”及其细微差别,因此您肯定应该给它一块手表


TL;DR:watch上的可访问性在大多数情况下只有当watch应用程序的UI在屏幕上可见时才是真/是。

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

session.reachable属性仅当通过蓝牙可以访问Apple Watch并且关联的Watch应用程序正在运行时才为真 在所有其他情况下,该值为false

在您的情况下,第二个选项导致了问题,我想蓝牙连接正在工作

不管怎样,问题是你想达到什么程度

实际上,最简单的规则是,你不能从iPhone上唤醒手表,但你可以从手表上唤醒iPhone应用程序。

当手表的对应物在后台时,有两种方式和三个选项可到达手表:发送复杂更新或在后台发送消息(2个选项),当手表再次醒来时,该消息将可用于手表。 所有这些都是该计划的一部分

发送消息的两个选项是:

- updateApplicationContext:error:
您可以使用此方法将数据字典传输到对应的手表应用程序。iPhone会在机会出现时发送上下文数据,即手表应用程序出现时发送上下文数据。手表上对应的会话使用session:didReceiveUpdate:method或从receivedApplicationContext属性获取数据

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

另一个选项是在后台发送数据,如

- transferUserInfo:
当您希望向手表发送数据字典并确保其已交付时,可以使用此方法。使用此方法发送的词典在另一个设备上排队,并按发送顺序发送。传输开始后,即使应用程序挂起,传输操作仍将继续

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

复杂度解决方案略有不同,但与早期者属于同一个WCSession类

-transferCurrentComplicationUserInfo:
此方法专门设计用于将用户信息传输到手表,以便立即显示在手表表面上。 当然,它只适用于iOS,使用这种方法会影响您的时间预算,因此它的可用性是有限的

用户信息放在队列的前面,因此手表会在后台唤醒分机以接收信息,然后立即进行传输

您的watch应用程序接收到的所有消息都会在后台线程上串行地传递给会话代理,因此您必须切换到主队列,以便在UI中使用或显示它们