Apple Watch и openParentApplication в фоновом режиме

Я реализую Apple Watch. В моем расширении Watchkit я использую метод для связи с «основным приложением».

    [WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {}];

Согласно Apple документация, приложение может обрабатывать запрос в фоновом режиме.

When you call the openParentApplication:reply: method, iOS launches or 
wakes up the parent app in the background and calls the
application:handleWatchKitExtensionRequest:reply:method of its app delegate.

Однако мое приложение всегда становилось активным, даже если у меня нет кода внутри метода, handleWatchKitExtensionRequest

Любые советы, если это возможно?

заранее спасибо


person DaSilva    schedule 17.12.2014    source источник


Ответы (4)


Согласно официальному ответу разработчиков Apple на форуме разработчиков Apple, это ошибка в бета-версии 2 WatchKit Framework.

https://devforums.apple.com/message/1082689#1082689

И чтобы прояснить одну вещь, приложение для iPhone запускается в фоновом режиме. В настоящее время в симуляторе приложение запускается на переднем плане. Это не будет опытом на устройстве. В документации конкретно сказано: «Вызов метода заставляет iOS запускать приложение в фоновом режиме…».

(Пост №6)

Кстати, вчера вышла Beta 3, может уже исправили.

Более того, если iPhone будет заблокирован, ваше приложение для iOS также будет запущено в фоновом режиме.

person lvp    schedule 19.12.2014
comment
Спасибо за информацию... я проверю - person DaSilva; 19.12.2014
comment
Примечания к выпуску (бета-версия 3) — метод WKInterfaceController openParentApplication:reply: теперь запускает содержащее приложение в фоновом режиме, когда iPhone (или симулятор iOS) разблокирован или заблокирован. - person Rohit Gupta; 26.12.2014

Если ваше приложение неактивно, openParentApplication не сможет его активировать. Он может выполнять задачи только в фоновом режиме. Чтобы это работало, важно запустить фоновую задачу в handleWatchKitExtensionRequest, как указано в документация. Это гарантирует, что основное приложение на iPhone не будет приостановлено до того, как оно сможет отправить свой ответ.

Код в делегате основного приложения на iPhone:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void ( ^)( NSDictionary * ))reply 
{
   __block UIBackgroundTaskIdentifier watchKitHandler;
   watchKitHandler = [[UIApplication sharedApplication]
          beginBackgroundTaskWithName:@"backgroundTask"
                    expirationHandler:^{
              watchKitHandler = UIBackgroundTaskInvalid;
          }];

   if ([[userInfo objectForKey:@"request"] isEqualToString:@"getData"]) {
      // get data
      // ...
      reply( data );
   }

   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 1), dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       [[UIApplication sharedApplication] endBackgroundTask:watchKitHandler];
   });
}
person vomako    schedule 02.05.2015

Я думаю, что в разделе «возможности» для основного приложения отсутствует фоновый режим, и он будет добавлен в будущем.

Я попытался включить все поддерживаемые в настоящее время фоновые режимы, и ни один из них не работал (т.е. постоянно запускалось основное приложение).

Мой совет - потерпите до следующей беты.

person Rohit Gupta    schedule 18.12.2014

У меня была точно такая же проблема с подключением WatchKit к существующему приложению. У меня было UIApplicationExitsOnSuspend (приложение не работает в фоновом режиме), установленное на YES в info.plist. Измените его на NO и ошибка исчезнет.

person Eric DeLabar    schedule 19.03.2015