Обновление приложения для часов с часов

Сегодня я начал возиться с фреймворком Watch OS и хотел собрать быстрое приложение, но пришел к паре вопросов.

Я сделал приложение для iOS, которое просто показывает текущий процент заряда батареи, а также состояние батареи. Затем я хотел показать это на часах.

  1. Единственный раз, когда приложение для часов будет обновляться, — это когда я полностью закрою приложение для iOS, а затем открою его, пока приложение для часов активно. Как разрешить обновление приложения для часов, если я открою его после открытия приложения для iOS?

  2. Это относится к пункту 2. Но как разрешить приложению для часов получать информацию из приложения iOS после того, как оно было в фоновом режиме? В качестве примера предположим, что приложение iOS было в фоновом режиме, и я хотел получить процент заряда батареи, не открывая приложение iOS на переднем плане.

Некоторые примечания о том, как я это настроил -

В приложении iOS в методе viewDidLoad я начинаю сеанс.

 if ([WCSession isSupported]) {
    wcSession = [WCSession defaultSession];
    wcSession.delegate = self;
    [wcSession activateSession];
}

Затем вызовите мой метод, чтобы обновить фактический процент заряда батареи и состояние. В этом методе у меня есть это, которое отправляет информацию на часы:

NSDictionary *message = @{
                          @"message" : [NSString stringWithFormat:@"%@", [numberFormatter stringFromNumber:levelObj]],
                          @"message_2" : [NSString stringWithFormat:@"%ld",(long)[UIDevice currentDevice].batteryState],

                          };


[wcSession sendMessage:message replyHandler:nil errorHandler:^(NSError * _Nonnull error) {
    NSLog(@"%@", error.localizedDescription);
}];

Я также вызываю этот же метод в viewDidAppear, поэтому мне не нужно полностью перезапускать приложение, чтобы разрешить обновление аналога часов.

На стороне часов у меня есть метод viewWillActivate с той же активацией, что и на стороне iOS, а также метод для обработки того, что приложение часов получает со стороны iOS. Но он будет обновляться только тогда, когда я полностью перезапущу приложение iOS.

    - (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message {

    NSLog(@"Message recieved!");
    [_batteryLevelLabelW setText:message[@"message"]];
}

Также есть код для обработки сообщения о состоянии батареи, которое немного длинное.

Я надеюсь, что дал хороший объем информации, чтобы помочь.


person Michael    schedule 01.04.2017    source источник


Ответы (1)


Согласно документации:

Используйте метод send​Message(_:​reply​Handler:​error​Handler:​) или send​Message​Data(_:​reply​Handler:​error​Handler:​) для передачи данных доступному аналогу. Эти методы предназначены для немедленной связи между вашим приложением iOS и расширением WatchKit. Для успешного выполнения этих методов свойство is​Reachable в настоящее время должно иметь значение true.

Если приложение watchapp не находится на переднем плане, сообщение не будет доставлено, поскольку isReachable равно false.

Метод, который вы должны использовать, это update​Application​Context(_:​) - он будет ждать, пока приложение часов не откроется на переднем плане, и только тогда будет доставлено.

person abjurato    schedule 02.04.2017
comment
Благодарю за ваш ответ. Что делать, если приложение для iOS еще не открыто. Как это будет обновляться, а затем отправляться в приложение для часов, когда isReachable истинно. - person Michael; 02.04.2017
comment
@Michael, если приложение iOS еще не открыто, как вы собираетесь получать уровень заряда батареи? - person abjurato; 02.04.2017
comment
Это мое плохо. Надо было перефразировать это по-другому. Есть ли способ обновить этот уровень заряда батареи, если приложение для часов отправит ему сообщение с запросом информации? Или мне обязательно нужно сначала открыть iOS? - person Michael; 02.04.2017
comment
@Michael, вы можете отправить мгновенное сообщение с часов на телефон через sendMessage(_:replyHandler:errorHandler:) - в этом направлении требуется только действующий сеанс, а isReachable не требуется. И отвечайте уровнем заряда батареи. Отправка сообщения с телефона на часы требует, чтобы приложение для часов было на переднем плане, отправка сообщения из приложения для часов в приложение ios позволяет приложению ios быть фоновым/приостановленным. Но в любом случае для активации WCSession должно быть запущено приложение ios. - person abjurato; 02.04.2017
comment
А, понял. Спасибо. - person Michael; 02.04.2017