2015-05-07 2 views
1

Требование: приложение My Watch будет отображать последние данные с нашего сервера.Связь между приложением часов и родительским приложением iphone

Я пробовал:

Чтобы реализовать эту вещь, я использовал

WKInterfaceController.openParentApplication(requestDict, reply: { (returnedObject, error) -> Void in 
      if (returnedObject != nil) { 
//loading interface data here 
} 
     }) 

В моей функции приложения делегат я использовал

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply { 
    // doing web service call using asynchronous nsurlconnection and replying with response dictionary 
} 

Проблема: Проблема заключается в том, что приложение работает отлично, когда приложение iPhone является передним, но wa Приложение tch ничего не показывает, когда приложение iPhone работает в фоновом режиме. Я отлаживал его и обнаружил, что, когда приложение iPhone работает с фоновым файлом, а затем webservice api call (nsurlconnection) не перенастраивает какие-либо данные, когда он выходит на передний план, тогда он отвечает на данные для просмотра приложения.

Чтобы решить эту проблему, я использовал nsuserdafults для хранения данных, но проблема в том, что она не всегда показывает последние данные. Давайте рассмотрим приложение, открытое пользователем, и оно отправится в родительское приложение и вернет старые данные из userdafults.

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply { 
    if ([userInfo[@"type"] isEqualToString:@"list"]) { 
     [self fetchWatchData];//it will get and store data when app will be foreground 
     NSDictionary *replyDict = [UtiltiyManager getWatchData];//data from userdefaults 
     if (replyDict) { 
      reply(replyDict); 
     }else { 
      NSDictionary *noDataDict = @{@"data":@"nodata"}; 
      reply(noDataDict); 
     } 
    } 
} 

Проблема в том, что приложение-наблюдатель не может получить последние данные с iphone, пока оно находится в фоновом режиме. Поскольку нет сервиса call api, который будет работать в фоновом режиме. Я проверил с NSURLConnection, а NSURLSessionDataTask - это вызов api переднего плана.

Любые решения или мысли?

Update 1:

Яблоко Docs говорит:

Типы задач в рамках сессии, класс NSURLSession поддерживает три типа задач: задачи данных, задачи загрузки и выгрузки задания.

Задачи данных отправлять и получать данные с использованием объектов NSData. Задачами данных являются , предназначенные для коротких, часто интерактивных запросов из вашего приложения на сервер . Задачи данных могут возвращать данные в ваше приложение по одному фрагменту за один раз после получения каждой части данных или сразу через обработчик завершения . Поскольку задачи данных не хранят данные в файле , они не поддерживаются в фоновых сеансах. Задачи загрузки извлекают данные в виде файла и поддерживают загрузку фона , пока приложение не запущено. Загрузка задач отправляет данные (обычно в форме файла ) и поддерживает загрузку фона, пока приложение не работает .

Apple сообщила, что задачи с данными не доступны в фоновом режиме. И мои данные - это небольшие данные веб-службы, которые могут быть выбраны с помощью задачи данных. поэтому мой вызов службы не загружается. Таким образом, в случае, когда iPhone приложение является фоном, как приложение будет получать данные веб-службы.

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

+0

Вы можете попробовать следующее: http://stackoverflow.com/questions/30000274/calling-parent-application-from-watch-app Работает ли это в вашем случае? – vomako

ответ

2

Вам необходимо создать фоновое задание в приложении iPhone, иначе ОС убьет ваше приложение, прежде чем оно сможет закончить загрузку данных. Вот некоторые документы, которые могут помочь: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

+0

Вы хотите использовать 'beginBackgroundTaskWithName: expirationHandler:'. Документы можно найти здесь: https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithName:expirationHandler: – bgilham

+0

пример кода: http://stackoverflow.com/questions/30000274/calling-parent-application-from-watch-app – vomako

0

Вещи существенно изменились, так как вопрос и ответ были отправлены ранее. openParentApplication больше не доступен в WatchOS 2. С другой стороны, теперь гораздо больше можно получить непосредственно на часах для обновления данных с сервера по мере необходимости. В идеале приложение iPhone также будет кэшировать расширение приложения WatchKit с последними кэшированными данными, тем временем, используя один из новых доступных механизмов связи, так что приложение WatchKit должно отображать до тех пор, пока не будут загружены последние данные, даже если приложение iPhone в настоящее время не работает.

Смежные вопросы