2017-09-06 45 views
0

我有這樣的結構在我的iOS應用程序和它的Apple關注擴展都宣佈爲結構watchOS不能的sendMessage()

struct nonIndexStruct { 
    let name: [String] 
    let message: [String] 
} 

我創建這樣

let nIS = nonIndexStruct(name: sortedNameArray.map({ ($0).name }), message: sortedNameArray.map({ ($0).name }))

在一個對象爲了將它傳遞給我的蘋果手錶擴展,我把對象寫成字典

let chatsMasterDict:[String: Any] = ["chatsMaster": nIS]

打印這個工作完全正常,所有數據都可以在這個對象。要發送的話,我打電話

session.sendMessage(chatsMasterDict, replyHandler: nil, errorHandler: nil)

現在的問題是,沒有到達的Apple關注的一面。 errorHandler僅在Apple Watch應用程序未打開時打印某些內容。 (關於手錶的應用程序沒有被打開)

對蘋果關注的接收方法是這樣的,它打印收到的一切 - 除了上面顯示的情況下,該方法根本不被調用。

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { 
    print("didReceive") 
    print (message) 

    if let val = message["chatsMaster"]{ 
     print("chatsMaster came") 
    . . . 

我最好的猜測是,雖然結構是可用於兩個系統,之間的橋樑並不「知道」它並不能處理它。當關閉應用程序時,我也得到

無法將'__NSCFString'(0x12e9fe0)類型的值轉換爲'NSArray'(0x12ea670)。 2017年9月6日12:23:24.237016 + 0200 APPNAME WatchKit擴展[20802:37186​​23]無法投類型 '__NSCFString'(0x12e9fe0)的值設爲 '的NSArray'(0x12ea670)。

但是,只有當我停止該過程時,纔會發生這種情況,因此idk是否與我的問題有關。

編輯:Apple關注文檔說

鍵和你的字典裏的值必須全部財產清單 類型,因爲數據必須串行化和無線發送。

所以這可能是爲什麼它不工作。什麼是最好的解決方法?使它Data會有點矯枉過正我猜想,因爲我的結構的內容是非常簡單的:/

回答

2

這真的很奇怪,你沒有得到一個錯誤,但問題的核心是,你正試圖發送使用sendMessage功能,只能用於發送屬性列表類型的自定義結構。

最好的解決方案是(因爲你的結構非常簡單,它的所有屬性都是屬性列表類型)可能會將你的結構轉換爲字典並使用sendMessage來設置字典。

struct nonIndexStruct { 
    let name: [String] 
    let message: [String] 

    func toDictionary()->[String:[String]]{ 
     var dict = [String:[String]]() 
     dict["name"] = self.name 
     dict["message"] = self.message 
     return dict 
    } 
} 

let chatsMasterDict = ["chatsMaster": nIS.toDictionary()] 
session.sendMessage(chatsMasterDict, replyHandler: nil, errorHandler: nil) 
+0

完美的解決方案,正是我所需要的!你忘了返回類型後面的括號,但這是完美的,非常感謝! – user2875404

+1

很高興我能幫到你。感謝您的更正,我用括號更新了我的答案。 –