2016-02-01 2 views
3

Я использую структуру WatchConnectivity для получения строки из своего приложения. Вот как я отправляю строку в Obj-C из приложения:Watch Connectivity: didReceiveMessage не называется

-(void) viewDidLoad { 

    //WATCHKIT 
    WCSession* session = [WCSession defaultSession]; 
    session.delegate = self; 
    [session activateSession]; 

    [self sendInfoToWatch]; 
} 

-(void) sendInfoToWatch { 

    WCSession* session = [WCSession defaultSession]; 
    session.delegate = self; 
    [session activateSession]; 

    [session sendMessage:@{@"a":@"hello"} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) { 

    } errorHandler:^(NSError * _Nonnull error) { 

    }]; 
} 

Приложение My Watch находится в Swift. Это, как я получить сообщение:

Note: "wc session is supported" works and gets logged to the console

override func willActivate() { 
    if(WCSession.isSupported()){ 
     NSLog("wc session is supported") 
     self.session = WCSession.defaultSession() 
     self.session.delegate = self 
     self.session.activateSession() 
    } 

    super.willActivate() 
} 

Следующая функция никогда не вызывается, ни один из NSLog показывают вверх, поэтому QRCodeTitleLabel не обновляет свой текст.

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //recieving message from iphone 

    QRCodeTitleLabel.setText(message["a"]! as? String) 

    NSLog("This was called") 
    NSLog((message["a"]! as? String)!) 

} 

Кто-нибудь знает, почему этот метод не называется?

Кроме того, я импортировал WatchConnectivity и включил WCSessionDelegate после моего имени класса.

Edit:

Я добавил функцию с replyHandler, но этот метод до сих пор не называется:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 
    QRCodeTitleLabel.setText(message["a"]! as? String) 

    NSLog("This was called") 
    NSLog((message["a"]! as? String)!) 
} 
+0

Если вы добавите NSLog в errorHandler, он регистрирует ошибку? Если так, то, что это? – ccjensen

+0

@ccjensen Ну, «Это вызвано» никогда не отправляется на консоль, поэтому весь метод не вызывается. Так что ничего не появляется, когда я NSLog replyHandler. По ошибке Хэндлер, я предполагаю, что вы имели в виду ответHandler. Нет ошибкиHandler ... есть ли еще одна функция, которую я должен вызывать для проверки ошибок (я не вижу ее в документации) –

+1

Я имел в виду ошибкуHandler на стороне отправки (вызов sendMessage). Если сообщение не доставлено, оно должно быть вызвано с помощью NSError, которое может нам подсказывать, почему вещи не работают для вас. – ccjensen

ответ

7

Есть 2-я сессия: методы didReceiveMessage в WCSession. Вы должны внедрить тот, у которого есть ответ с помощью Hendler на стороне Apple Watch.

Также есть экран Apple Watch? SendMessage с iPhone будет работать только в том случае, если приложение Apple Watch активно, и экран включен. SendMessage от Apple Watch к iPhone, с другой стороны, будет работать, даже если приложение iPhone не будет запущено.

Если вы хотите запросить данные при использовании приложения Watch, вы можете переключить приложение Watch для вызова метода sendMessage. Приложение iPhone будет использовать свой ответHandler, чтобы отправить данные, которые вам нужны, на часы. Если вы это сделаете, вам нужно будет перенести свой код инициализации WCSession в приложение iPhone: метод didFinishLaunchingWithOptions (поскольку ваш контроллер просмотра не будет инициализирован, если он запущен в фоновом режиме).

// ***On the watch*** 
// ExtensionDelegate 
func applicationDidFinishLaunching() { 
    self.session = WCSession.defaultSession();  
    self.session.delegate = self 
    self.session.activateSession() 
} 

// Where you want to get the data from the iPhone 
self.session.sendMessage(["retrieveData":[:]], replyHandler: { (result) -> Void in 
    // TODO: Handle your data from the iPhone 
}, errorHandler: { (error) -> Void in 
    // TODO: Handle error - iPhone many not be reachable 
}) 

// ***On the iPhone*** 
// AppDelegate 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.session = [WCSession defaultSession]; 
    self.session.delegate = self; 
    [self.session activateSession]; 
} 

- (void)session:(WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * _Nonnull))replyHandler 
{ 
    if ([message objectForKey:@"retrieveData"]) 
    { 
     replyHandler(@{@"a":@"hello"}); 
    } 
} 
+0

См. Мое редактирование на вопрос, я изменил его на функцию replyHandler, но он все еще не является " t называется. Я реализовал это право? –

+0

Это похоже на то, что оно было выполнено правильно (хотя я рекомендую переместить регистрацию WCSession из метода willAppear и в AppDelegate или ExtensionDelegate). Является ли экран часов включенным, когда вы делаете этот звонок с iPhone? – lehn0058

+0

Также вы получаете сообщение об ошибке в методе errorHandler при вызове метода iPhone? – lehn0058