Objective- C: SendMessage WatchConnectivity не разбудит iOS аналог в фоновом режиме - PullRequest
0 голосов
/ 01 апреля 2020

У нас есть 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.
    }
}
...