У нас есть iOS VoIP-приложение, которое позволяет пользователю совершать видеовызовы между устройством iOS и видеодомофоном и работает в фоновом режиме, ожидая звонков.
У нас также есть watchOS приложение-расширение, которое должно отправлять сообщение приложению iOS в любое время, когда оно находится в фоновом режиме, нажав простую кнопку WKInterfaceButton, связанную с IBAction.
В расширении watchOS мы используем этот простой код:
#import "TestController.h"
@implementation TestController {
WCSession *wcSession;
}
- (void)awakeWithContext:(id)context {
NSLog(@"OK");
if (WCSession.isSupported == YES) {
wcSession = [WCSession defaultSession];
wcSession.delegate = self;
[wcSession activateSession];
NSLog(@"WCSession is supported");
}
/*[[WatchCommandData getInstance]wcSession].delegate = self;
[[[WatchCommandData getInstance]wcSession] activateSession];*/
}
- (void)willActivate {
// [[WatchCommandData getInstance]wcSession].delegate = self;
// [wcSession setDelegate:self];
}
- (IBAction)didTapSend {
NSDictionary* msg = [[NSDictionary alloc] initWithObjectsAndKeys:@(251),@"sendTask", nil];
// [[[WatchCommandData getInstance]wcSession] transferUserInfo:msg];
[[[WatchCommandData getInstance] wcSession] sendMessage:msg replyHandler:nil errorHandler:nil];
// [wcSession updateApplicationContext:msg error:nil];
}
Как видите, мы используем метод sendMessage для отправки сообщения на iOS. Это потому, что в документации сказано:
"Вызов этого метода из расширения WatchKit, когда он активен и работает, вызывает соответствующее приложение iOS в фоновом режиме и делает его доступным."
Проблема в том, что это работает только на короткое время , когда приложение iOS находится в фоновом режиме. Через некоторое время коллега iOS больше не будет получать сообщение. Почему?
Мы используем этот код на iOS counterPart для получения сообщения от watchOS:
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message {
if (message[@"sendTask"]) {
NSString * msg = [NSString stringWithFormat:@"TASK %i PRESS\x0D\x0A", [message[@"sendTask"] intValue]];
// Then do our work with the message.
}
}