2016-04-26 1 views
0

Я отправляю сообщение с iPhone на Watch (WatchOS2), где на iPhone работает встроенный таймер. Каждые 30 секунд я отправляю сообщение с iPhone для просмотра. К сожалению, отправка сообщения работает только в первый раз, когда мои часы успешно принимаются. Но со следующего раза часы не получают никакого сообщения. Весь сценарий отлично работает в симуляторе, но не на реальных часах. Любая помощь будет оценена по достоинству. Я попытался отправить сообщение из основного потока, но бесполезно. Любая идея о том, где я делаю неправильно.Сообщение о передаче WCSession не работает на самом устройстве, но работает на симуляторе

Заранее спасибо.

это код, я использую

На стороне часов

//InterfaceController1.m 
- (void)willActivate { 
// This method is called when watch view controller is about to be visible to user 
    [super willActivate]; 
    if ([WCSession isSupported]) { 
     self.session = [WCSession defaultSession]; 
     self.session.delegate = self; 
     [self.session activateSession]; 
     [self.session sendMessage:@{@"OpeniOS":@"YES"} replyHandler:nil errorHandler:nil]; 
    } 
} 
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler{ 
    //able to receive message - dictionary with IssuerNames Array from iPhone 
    [self setupTable:message]//I'm setting up my tableview and on click of a row from tableview I'm pushing the user to InterfaceController2.m 
} 

- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex{ 
    [self.session sendMessage:@{@"AccSel":@"YES"} replyHandler:nil errorHandler:nil]; 
    [self pushControllerWithName:@"InterfaceController2" context:[NSNumber numberWithInteger:rowIndex]]; 
} 

//InterfaceController2.m 
- (void)willActivate { 
    [super willActivate]; 
    if ([WCSession isSupported]) { 
     _session = [WCSession defaultSession]; 
     _session.delegate = self; 
     [_session activateSession]; 
    } 
} 

-(void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler{ 
    NSLog(@"%@",message); 
} 

На iPhone стороне

//ViewController1.m 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    if ([WCSession isSupported]) { 
     _session=[WCSession defaultSession]; 
     _session.delegate=self; 
     [_session activateSession]; 
     [_session sendMessage:@{@"testKey":@"testVal"} replyHandler:nil errorHandler:nil]; 
    } 
} 
-(void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message{ 
    if ([[message objectForKey:@"OpeniOS"] isEqualToString:@"YES"]) { 
     NSMutableArray *tempIssuerArray=[[NSMutableArray alloc] init]; 
     for (OTPToken *token in self.tokenManager.tokens) { 
      [tempIssuerArray addObject:token.issuer]; 
     } 
     if ([_session isReachable]) { 
      NSDictionary *[email protected]{@"IssuerNames":tempIssuerArray}; 
      [_session sendMessage:temp replyHandler:nil errorHandler:nil]; 
     } 
    } 
    if ([[message objectForKey:@"AccSel"] isEqualToString:@"YES"]) { 
     OTPToken *token = [self.tokenManager.tokens objectAtIndex:[[message objectForKey:@"selIndex"] intValue]]; 
     DisplayTokenViewController *dtvc=[self.storyboard instantiateViewControllerWithIdentifier:@"DisplayToken"]; 
     dtvc.token=token; 
     dtvc.tkm=self.tokenManager; 
     [self.navigationController pushViewController:dtvc animated:YES]; 
    } 
} 

//ViewController2.m 
-(void)viewDidLoad { 
    [super viewDidLoad]; 
    mySession=[WCSession defaultSession]; 
    mySession.delegate=self; 
    [mySession activateSession]; 
    [self refresh]; //this refresh method is called every 30 seconds based on a property change value 
} 

- (void)refresh{ 
    NSDictionary* [email protected]{@"code":@"123",@"name":@"abc"}; 
    [mySession sendMessage:dict replyHandler:nil errorHandler:nil]; 
} 

На самом деле, на стороне часов, InterfaceController1.m показан пользователю в во-первых, при нажатии кнопки InterfaceController1.m пользователь перенаправляет на InterfaceController2.m. В то же время, на iPhone, я нажимаю ViewController2.m из ViewController1.m на получение сообщения от часов.

Здесь метод обновления вызывается только один раз и через каждые 30 секунд должен быть вызван идеальный метод обновления, но не на самом устройстве. Но все прекрасно работает в симуляторе

+0

Вы используете didReceiveApplicationContext в делегате расширения? – Gismay

+0

Нет, я использую didReceiveMessage в интерфейсном контроллере для получения сообщения. Я не писал код в расширительном делетете @Gismay –

+0

В тот момент, когда вы можете отправить сообщение в своем телефонном приложении, приложение часов должно находиться на переднем плане и работать. Я знаю, что это нормально на симуляторе, но стоит подумать об этом на настоящих часах? В противном случае вам может понадобиться использовать другой метод для отправки данных – Gismay

ответ

0

При использовании API WCSession SendMessage с нулевой replyHandler как это:

[_session sendMessage:@{@"testKey":@"testVal"} replyHandler:nil errorHandler:nil]; 

вам необходимо реализовать следующий метод делегата на приемной стороне:

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message { 
    //able to receive message - dictionary with IssuerNames Array from iPhone 
    [self setupTable:message]//I'm setting up my tableview and on click of a row from tableview I'm pushing the user to InterfaceController2.m 
} 

вместо сеанса: didReceiveMessage: replyHandler :. Таким образом, в вашем примере выше, кажется, что InterfaceController1.m на стороне часового не должно быть в состоянии получить сообщение, как вы говорите. Я предполагаю, что, возможно, вы только что сделали ошибку патча для копирования, поскольку вы санировали код для SO.

 Смежные вопросы

  • Нет связанных вопросов^_^