2016-04-09 28 views
0

我一直在使用WCSession的NatashaTheRobot單例,但無法使sendMessage正常工作。sendMessage問題 - WatchConnectivity

我的目標是從Watch應用程序發送消息到iOS應用程序,並從iOS應用程序傳送字典到應用程序。

這是我在ExtensionDelegate代碼

import WatchKit 
import WatchConnectivity 

class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { 

var session:WCSession! 
var boolCheck = Int() 

func applicationDidFinishLaunching() { 

    WatchSessionManager.sharedManager.startSession() 
    print("Here i am") 
} 

func applicationDidBecomeActive() { 
    print("I AWOKE") 
} 

func applicationWillResignActive() { 

} 

} 

class WatchSessionManager: NSObject, WCSessionDelegate { 

static let sharedManager = WatchSessionManager() 
private override init() { 
    super.init() 
} 

private let session: WCSession = WCSession.defaultSession() 

func startSession() { 
    session.delegate = self 
    session.activateSession() 
    if WCSession.isSupported(){ 
     self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil) 
     print("works") 
    } else { 
     print("don't work") 
    } 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    let sweetN = message["b"]! as? String 
    dispatch_async(dispatch_get_main_queue(), { 
     if sweetN == "insertData1" { 
      NSNotificationCenter.defaultCenter().postNotificationName("sweetData1", object: nil) 
    }) 
} 
func sendMessage(message: [String : AnyObject], 
    replyHandler: (([String : AnyObject]) -> Void)? = nil, 
    errorHandler: ((NSError) -> Void)? = nil) 
{ 
    session.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler) 
    print("this is message \(replyHandler)") 
    var pretty = replyHandler 
} 

這是我在WCSingleton iOS應用程式碼(單獨從AppDelegate中)

import WatchConnectivity 

@available(iOS 9.0, *) 
class WatchSessionManager: NSObject, WCSessionDelegate { 

static let sharedManager = WatchSessionManager() 
private override init() { 
    super.init() 
} 

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

private var validSession: WCSession? { 

    if let session = session where session.paired && session.watchAppInstalled { 
     return session 
    } 
    return nil 
} 

func startSession() { 
    session?.delegate = self 
    session?.activateSession() 
} 
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //receieve messages from watch 
    print(message["b"]! as? String) 
    let sweetN = message["b"]! as? String 
    dispatch_async(dispatch_get_main_queue(), { 
     if sweetN == "peek"{ 
      NSNotificationCenter.defaultCenter().postNotificationName("giveMeInfo", object: nil) 
     } 
    } 
    }) 
} 

@available(iOS 9.0, *) 
extension WatchSessionManager { 

func sendMessage(message: [String : AnyObject], 
    replyHandler: (([String : AnyObject]) -> Void)? = nil, 
    errorHandler: ((NSError) -> Void)? = nil) 
{ 
    session!.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler) 
} 

} 

,這裏是我使用的方法在ViewController(從NSNotificationCenter發射)。然而,這部分代碼永遠不會被執行(這很奇怪,因爲當我使用applicationContext時它可以完美地工作)。

func giveMeInfo(){ 
     let linesAdd1 = linesAdd as! AnyObject 
     WatchSessionManager.sharedManager.sendMessage(["a":linesAdd1]) 
} 

任何有關如何讓所有這些零件一起工作的見解非常受歡迎!

回答

2

你的代碼是一個有點混亂給我,看起來正確,但你會遇到麻煩用這種方法,原因如下:如果您收到的ViewController的通知和觀察變化到

  • sendMessage()方法將無法發回數據:

    在您的WatchKit擴展中調用此方法處於活動狀態且正在運行時會在後臺喚醒相應的iOS應用程序並使其可訪問。從您的iOS應用程序調用此方法不會喚醒相應的WatchKit擴展。如果您調用此方法且對方無法訪問(或者在消息傳遞之前無法訪問),則errorHandler塊將執行相應的錯誤。如果消息參數包含非屬性列表數據類型,則也可以調用errorHandler塊。

  • 如果你想取回數據,那麼你應該使用回覆塊。 但在配置這些塊不會被調用,因爲:

的sendMessage(回覆==無) - > didReceiveMessage(...消息:)

的sendMessage(!回覆=無) - - > didReceiveMessage(...消息:replyHandler :)

  • 在另一方面,如果你使用contextMethod:

    使用此方法來傳輸的數據項噸詞典o對應的應用程序。當機會出現時,系統發送上下文數據,目的是在對方醒來時讓數據準備好使用。對方的會話將數據傳遞給其委託的會話:didReceiveUpdate:方法。對方也可以從其會話的receivedApplicationContext屬性中檢索數據。

我希望這有助於;)