Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Фоновое обновление данных в iOS7

Anna | 2.07.2014 | нет комментариев
В конце сентября компания APPLE выпустила iOS 7, одной из особенностей этой версии стала усовершенствованная многозадачность и вероятность обновления данных, когда приложение не энергично.
Есть два варианта запуска приложения для обновления данных — периодические обновления и запуск при приобретении особого push-уведомления. В всяком из вариантов приложение будет запущено в фоновом режиме (background mode), и будет принудительно закрыто через 30 секунд, так что времени для обновления будет вовсе немного.

Периодическое обновление данных (Background fetch)

Дабы позволить приложению запускаться в фоновом режиме, необходимо добавить в plist приложения ключ Required background modes со значением App downloads content from the network. Это так же дозволено сделать поставив галочку во вкладке Capabilities

Помимо того, необходимо в способе application: didFinishLaunchingWithOptions: установить наименьший промежуток для запуска.

If([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0){
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:600];
}

(проверка на версию значима – в iOS 6 приложение падает на этой функции).
Взамен числового значения дозволено воспользоваться переменной UIApplicationBackgroundFetchIntervalMinimum, Дабы установить минимально допустимый промежуток, но специальной роли это не играет, потому что устанавливается наименьший, а не гарантированный промежуток. Когда определенно приложение запустится – неведомо. Оно будет запущено исходя из статистики работы: в котором часу приложение традиционно запускается, сколько времени традиционно находится в фоновом режиме. Чем поменьше времени понадобится на работу программы, тем Почаще она будет запускаться. Установка промежутка непременна, так как по умолчанию, это значение равно UIApplicationBackgroundFetchIntervalNever и запуска не произойдет.

При запуске приложение начинает свою работу в фоновом режиме, запуская способ application: performFetchWithCompletionHandler:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
//DO SOMETHING
completionHandler(UIBackgroundFetchResultNewData); 
}

В конце способа нужно вызвать полученный completionHandler с параметром UIBackgroundFetchResultNewData (варианты – UIBackgroundFetchResultNoData, UIBackgroundFetchResultFailed). Но в любом случае, через 30 секунд приложение будет принудительно закрыто.
Помимо этого, как и при стандартном запуске, вызывается application: didFinishLaunchingWithOptions:
и если в нем есть код, тот, что не должен запускаться в данной обстановки (скажем, обновление UI), в целях экономии процессорного времени его отменнее отключить. При запуске в этом режиме я не обнаружил дополнительных ключей в launchOptions, так что необходимо проверять параметр application.applicationState, тот, что будет равен UIApplicationStateBackground.
N.B. Если в течение 30 секунд, пока приложение работает в фоновом режиме, пользователь запустит приложение через UI, то повторного запуска этого способа не произойдет. Если нужно, пропущенный код дозволено запустить в способе applicationWillEnterForeground:(UIApplication *)application

Для отладки запуска приложения в режиме фонового обновления в XCode есть вероятность симуляции этого режима – включается галочкой в настройках схемы.

Запуск от push сообщения.

2-й вероятностью получить обновление контента является запуск при приобретении push notification с выставленным флагом content-available.

Я не буду расписывать настройку приложения для приобретения push. Скажу только, что в plist приложения добавляется ключ Required background modes со значением App downloads content in response to push notifications (ну либо соответсвующая галочка в настройках плана), а к типам сообщений, которые приложение будет получать, добавляется новое значение
UIRemoteNotificationTypeNewsstandContentAvailability;


  UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeNewsstandContentAvailability;
    [application registerForRemoteNotificationTypes:myTypes];

При приобретении сообщения запускается способ

-(void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    //DO SOMETHING
    completionHandler(UIBackgroundFetchResultNewData); 
}

которому тоже
будет дано каждого лишь 30 секунд и в конце которого нужно

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB