2016-02-05 66 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。