Я отправляю сообщение с 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 секунд должен быть вызван идеальный метод обновления, но не на самом устройстве. Но все прекрасно работает в симуляторе
Вы используете didReceiveApplicationContext в делегате расширения? – Gismay
Нет, я использую didReceiveMessage в интерфейсном контроллере для получения сообщения. Я не писал код в расширительном делетете @Gismay –
В тот момент, когда вы можете отправить сообщение в своем телефонном приложении, приложение часов должно находиться на переднем плане и работать. Я знаю, что это нормально на симуляторе, но стоит подумать об этом на настоящих часах? В противном случае вам может понадобиться использовать другой метод для отправки данных – Gismay