【问题标题】:Apple Watch Background Mode?Apple Watch 后台模式?
【发布时间】:2016-05-15 07:47:09
【问题描述】:

我正在开发 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 代码中是

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 应用显示无法访问,为什么?

【问题讨论】:

    标签: ios iphone swift watchkit apple-watch


    【解决方案1】:

    WWDC talk on WatchConnectivity 非常详细地讨论了“可达性”及其细微差别,因此您绝对应该关注它。

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

    【讨论】:

      【解决方案2】:

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

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

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

      不管怎样,问题是你想达到什么目标。

      其实一个简单的规则是,你不能从 iPhone 唤醒 Watch,但你可以从 Watch 唤醒 iPhone 应用。

      当手表的对方在后台时,有两种方法可以通过三个选项到达手表:发送复杂功能更新或在后台发送消息(2 个选项),当手表再次唤醒时,该消息可供手表使用。 他们都是WCSession Class的一部分。

      发送消息的两个选项是:

      - updateApplicationContext:error:
      

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

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

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

      - transferUserInfo:
      

      当您想要将数据字典发送到 Watch 并确保它被传递时,您可以使用此方法。使用此方法发送的字典在另一台设备上排队,并按照发送的顺序发送。转移开始后,即使应用暂停,转移操作也会继续。

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

      complication 解决方案略有不同,但与前面的属于同一个 WCSession 类。

      -transferCurrentComplicationUserInfo:
      

      此方法专为将复杂功能用户信息传输到手表而设计,旨在立即显示在表盘上。 当然它只适用于 iOS,并且使用这种方法会占用您的并发症的时间预算,因此它的可用性是有限的。

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

      您的手表应用收到的所有消息都在后台线程上串行传递给会话委托,因此您必须切换到主队列,以防您想在 UI 中使用或呈现它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多