2016-02-05 70 views
3

我正在开发苹果手表应用程序。当我运行该应用程序它工作正常。现在我的问题是当应用程序进入后台模式时,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应用程序显示无法接通,为什么?

回答

1

WWDC talk on WatchConnectivity在相当多的细节中讨论了“可达性”及其细微差别,所以您绝对应该给它一个表。

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

2

这是AppleWatch的默认行为,主要是为了节省电池等资源。只有当苹果手表是通过蓝牙可达的和相关的观察应用程序在 前台运行在所有其他情况下,该值为false

session.reachable财产是真实的。

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

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

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

有两种方式可以在后台触发手表时触发手表:在后台发送复杂度更新或发送消息(2选项),当手表再次唤醒时可用于Watch。 所有这些都是WCSession Class的一部分。

两个选项发送消息:

- updateApplicationContext:error: 

您可以使用此方法来传输数据的字典给对方观看app.iPhone发送上下文数据在有机会时,意味着当手表应用出现。Watch上的对话方会话通过会话:didReceiveUpdate:方法或从receivedApplicationContext属性获取数据。

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

另一种选择是在后台像

- transferUserInfo: 

发送数据时要发送数据到观察的字典,并确保其交付您可以使用此方法。使用此方法发送的字典在其他设备上排队,并按发送顺序进行发送。转移开始后,即使应用程序暂停,转移操作也会继续。

,但真正的两种方法,虽然会议是积极的,他们只能叫。调用任何这些方法用于非活动或停用的会话都是程序员错误。

并发症溶液是有点不同,但属于同一WCSession类作为earliers。

-transferCurrentComplicationUserInfo: 

此方法专门用于将复杂化用户信息传输到手表,目的是立即显示在手表上。 当然,这只是针对iOS发售,采用这种方法的占用您的并发症的时间预算,所以它的可用性是有限的。

并发症用户信息被放置在队列的前面,以便手表唤醒在背景延伸以接收信息,然后传送立即发生。

你的表的应用程序收到的所有消息都在后台线程传递给会议代表连续,所以你必须切换到主队列的情况下,你想使用或展示他们的UI。