2016-04-09 5 views
0

Я использую синтаксис NatashaTheRobot для WCSession, но не могу заставить sendMessage работать правильно.Проблемы с sendMessage - WatchConnectivity

Моя цель - отправить сообщение из приложения «Наблюдение» в приложение 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 также может вызываться, если в параметре message содержатся типы данных списка свойств.

  • , если вы хотите получить данные назад, тогда вы должны использовать блок ответа. Но в конфигурации не будут называться эти блоки, потому что:

SendMessage (ответ == ноль) -> didReceiveMessage (... сообщение:)

SendMessage (! Ответ = ноль) - -> didReceiveMessage (... сообщение: replyHandler :)

  • с другой стороны, если вы используете contextMethod:

    используйте этот метод для переноса словаря элементов данных т o приложение-партнер. Система отправляет контекстные данные, когда возникает такая возможность, с целью получения данных, которые будут готовы к использованию к тому моменту, когда копия будет просыпаться. Сеанс партнера передает данные на сеанс: didReceiveUpdate: метод его делегата. Друг может также извлекать данные из свойства receivedApplicationContext своего сеанса.

Я надеюсь, что это помогает;)