2015-09-26 55 views
1

不能得到didReceiveApplicationContext被稱爲。有任何想法嗎?WatchKit didReceiveApplicationContext未被調用

InterfaceController

import WatchKit 
import Foundation 
import WatchConnectivity 

class InterfaceController: WKInterfaceController, WCSessionDelegate { 

    @IBOutlet var colorLabel: WKInterfaceLabel! 

    private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil 

    override init() { 
     super.init() 
     session?.delegate = self 
     session?.activateSession() 
    } 

    override func awakeWithContext(context: AnyObject?) { 
     super.awakeWithContext(context) 
    } 

    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){ 
     let colors : String = applicationContext["color"] as! String 
     colorLabel.setText(colors) 
     NSLog("session did receive application context") 
    } 

} 

我一直在學習本教程如下:http://www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/

colorLabel沒有NSLog或設置情況。不知道我錯過了什麼。謝謝!

+0

你可以發送發送端的代碼嗎?發送方的任何錯誤是否會返回? – ccjensen

+0

正在返回的發送方沒有錯誤。如果你讓我知道你需要它,我仍然可以發佈代碼,但發送方都很好。如果是這樣,請告訴我。謝謝! – SRMR

回答

1

我將上面的代碼複製到一個新的手錶應用程序,它工作正常。錯誤必須在發送方。你確定iOS應用程序中的代碼被調用嗎?我推測你正在使用Xcode和兩個模擬器,一個用於iOS應用程序,一個用於WatchApp。

除非您在手機模擬器上打開應用程序,否則不會運行iOS端的代碼。你在哪裏和如何在iOS端發佈updateAppContext調用?

在我的測試,這是所有我加入到我的ViewController.swift在iOS端(此代碼不會被觸發,直到我開始在我的iPhone的iOS應用程序。)

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let session = WCSession.defaultSession() 
    session.delegate = self 
    session.activateSession() 
    do { 
     try session.updateApplicationContext(["color" : "Red" ]) 
    } catch _ { 

    } 
} 
+0

感謝您的詳細回覆,讓我試試看! – SRMR

+0

你解決了嗎?因爲,對我而言,這是行不通的! –

1

我一樣的問題。在我的情況下,它有助於關閉兩個模擬器,然後運行Watch方案。這會在連接狀態下再次打開兩個模擬器。

希望它有幫助!

+0

有趣的,我會看看嘗試! – SRMR

1

對我來說,當我做一些測試/調試時,我試圖在AppDelegate中激發updateApplicationContext。這導致didReceiveApplicationContext未被調用。

把這個邏輯推到後面一點,就像在UIViewController中一樣,至少對我來說很有用。

1

在我的情況,我用下面的代碼來發送我的應用程序上下文:

do { 
     try session.updateApplicationContext(applicationContext) 
    } catch let error { 
     throw error 
    } 

既不didReceiveApplicationContext叫,也不是一個錯誤被拋出

我的問題是applicationContext包含一個自定義對象,而只有屬性列表項是允許的。
奇怪的一點是沒有錯誤發生。

2

檢查會話以確保其isPaired和watchAppInstalled屬性均爲YES。這似乎是更新共享上下文,而這些都是不行的。

我有這個問題。在條件爲NO時,更改爲而不是更新上下文。添加了sessionWatchStateDidChange的實現:如果兩個條件均爲YES,則更新上下文。有效。

我懷疑這與另一個問題的結合,如果數據不相同,手機將不會發送上下文導致「永不更新」的問題。傳遞「uuid」的解決方法確實有幫助,但我懷疑上述是更好的解決方法。

+0

謝謝@druest!這幫助我解決了這個問題。在看OS 4看起來像具有相同內容的消息確實不會被髮送。 UUID或任何其他唯一字符串將解決它。再次感謝! – pixbroker