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

Многозадачность в iOS 7

Anna | 2.07.2014 | нет комментариев

До IOS 7, разработчики были достаточно ограничены в том, что они могут сделать, когда их приложения оставались в фоновом режиме. Помимо VOIP и геолокационных функций, исключительный метод для выполнения кода в фоновом режиме было применение фоновых задач, ограниченных к управлению в течении нескольких минут. Если вы хотели загрузить огромное видео для просмотра в офф-лайн режиме, либо сберегать фотографии пользователя на сервер, вы могли бы исполнить только часть работы.

IOS 7 добавляет два новых API-интерфейса для обновления пользовательского интерфейса вашего приложения и контента в фоновом режиме. 1-й, Background Fetch (доставка в фоне либо обновление фона), разрешает получать новейший контент из сети через регулярные интервалы времени. 2-й, Дистанционные Уведомления (Remote Notifications), это новая функция использует Push-уведомления, Дабы уведомить, когда случилось событие. Оба этих новых механизма помогают Вам сберечь интерфейс вашего приложения в актуальном состоянии, и могут планировать работу над новой Фоновой службой передачи, что разрешает исполнять вне — процесса передачи данных по сети (загрузка и передача).

Background Fetch и Удаленные Уведомления примитивные зацепки приложений всякие 30 секунд времени для выполнение работы пока Ваше приложение не приостановится. Они не предуготовлены для процессорной насыщенной работы либо долгих задач, скорее, они для очередного давным-давно запущенного запроса сети, как скачивание большого фильма либо выполнения стремительных обновлений содержимого.

С точки зрения пользователя, исключительное явственное метаморфоза в многозадачности является новейший переключатель приложений, тот, что отображает снимок всякого приложения каким оно было, когда его оставили в фоновом режиме. Но есть повод для отображения снимков — сейчас вы можете обновить снимок вашего приложения позже заключения работы, показывая заблаговременный просмотр нового оглавления. Общественные сети, новости, либо погодные приложения сейчас могут отображать обновленное содержимое, дозволяя пользователю не открывать приложения. Мы увидим, как обновить снимок позднее.

Background Fetch

Background Fetch, является своего рода смарт-механизмом опроса, тот, что отменнее каждого подходит для приложений, которые имеют частые обновления контента, такие как общественные сети, новости, либо погодные приложения. Система «будит» приложение на основе поведения пользователя, и обновляет его раньше чем пользователь запустит приложение. Скажем, если пользователь неизменно использует приложение в 1 дня, система узнает и адаптируется, исполняя обновление перед периодом применения. Фоновые обновления обьединяются, Дабы уменьшить применение батареи, а если вы известите, что новые данные не были доступны во время обновления, IOS может приспособиться, применяя эту информацию, Дабы избежать обновления во время бездействия.

Первым шагом в обеспечении Background Fetch это указать, что вы будете применять функцию в ключеUIBackgroundModes в вашем информационном листе. Самый примитивный метод сделать это — применять вкладку Capabilities в редакторе плана Xcode 5, тот, что включает в себя режимы раздела фон для комфортной настройки многозадачных вероятностей.

image

Как альтернатива, Вы можете редактировать ключ в ручную:

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
</array>

Дальше, известите IOS как Зачастую Вы будете обновлять:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

    return YES;
}

По умолчанию промежуток обновления — это никогда, так что вам необходимо установить промежуток времени либо приложение не будет никогда вызываться в фоновом режиме. Значение ofUIApplicationBackgroundFetchIntervalMinimum умоляет систему руководить, Дабы ваше приложение просыпалось как дозволено Почаще, но вы обязаны указать свой личный временной промежуток, если в этом нет необходимости. Скажем, погодное приложение может обновляться только ежечасно. IOS будет ожидать по крайней мере указанный временной промежуток между обновлением фона.

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

Последним шагом является реализация следующих способов в вашем приложении:

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [[NSURL alloc] initWithString:@"http://yourserver.com/data.json"];
    NSURLSessionDataTask *task = [session dataTaskWithURL:url 
                                        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        if (error) {
            completionHandler(UIBackgroundFetchResultFailed);
            return;
        }

        // Разбор response/data и определить, было ли новое оглавление доступно
        BOOL hasNewData = ...
        if (hasNewData) {
            completionHandler(UIBackgroundFetchResultNewData);
        } else {
            completionHandler(UIBackgroundFetchResultNoData);
        }
    }];

    // Запустите задачу
    [task resume];
}

Помните, у вас есть только 30 секунд, Дабы определить, является ли новейший контент доступным, обрабатывать новое оглавление, и обновить пользовательский интерфейс. Должно быть довольно времени для выборки данных из сети и прорисовки несколько эскизов для вашего пользовательского интерфейса, но не гораздо огромнее. Когда ваши сетевые запросы являются полными и ваш пользовательский интерфейс был обновлен, вы обязаны вызывать обработчик заключения.

Обработчик заключения служит двум целям. Во-первых, система измеряет мощность, используемую вашими процессами и записи были ли новые даны доступны на основании theUIBackgroundFetchResult. Во-вторых, при вызове обработчика заключения, снимок пользовательского интерфейса берется и диспетчер приложений обновляется. Пользователь увидит новое оглавление, когда он либо она перейдет в приложение. Такое поведение мгновенных снимков обработчик заключения является всеобщим для всех из обработчиков заключения в новых многозадачных API.

В настоящем приложении, вы обязаны пройти completionHandler в суб-компоненты приложения и назовите его, когда вы обработали данные и обновили пользовательский интерфейс.

На данный момент, вы можете быть поражены, как IOS можете снимать интерфейс вашего приложения, когда оно работает в фоновом режиме, и как жизненный цикл приложение работает с Фоновым Обновлением. Если ваше приложение в реальное время остановлено, система разбудит его перед callingapplication: performFetchWithCompletionHandler:. Если ваше приложение не работает, система запустит его, называя обыкновенные способы делегата, includingapplication: didFinishLaunchingWithOptions:. Вы можете думать об этом как приложение работает в точности так же, как если бы пользователь запустил его от Springboard, помимо случаев когда UI заметен.

В большинстве случаев, вы будете исполнять ту же работу, когда приложение запускается в фоновом режиме что и при работе на переднем плане, но вы можете найти как фон запускается, глядя на applicationState из UIApplication:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"Launched in background %d", UIApplicationStateBackground == application.applicationState);

    return YES;
}

Тестирование фонового обновления 

Есть два метода, Дабы имитировать фоновое обновление. Самый примитивный метод запустите приложение из Xcode и нажмите Имитация Фонового обновления в меню Xcode в Debug а ваше приложение работает.

Помимо того, дозволено применять схему, Дабы изменить то, как Xcode запускает ваше приложение. Под Xcode пункт меню Product, предпочесть Scheme, а после этого Manage Schemes. Отсель, редактировать либо добавлять новую схему и проверьте запуск фона eventcheckbox как показано ниже.

image

Удаленные уведомления

Удаленные уведомления разрешают уведомить ваше приложение при происхождении значимых событий. Допустимо, вам придут новые мгновенные сообщения для доставки, новости оповещения для отправки либо конечный эпизод любимого телешоу вашего пользователя, Дабы загрузить для самостоятельного просмотра. Удаленные уведомления восхитительно подходят для главного оглавления, где задержка между фоновыми обновлениями может быть неприемлема. Удаленные Уведомления также могут быть значительно больше результативным, чем Обновление Фона, так как ваше приложение запускает только при необходимости.

Удаленное уведомление – это легко обыкновенные Push-уведомл”objectivec”>- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler { // You must re-establish a reference to the background session, // or NSURLSessionDownloadDelegate and NSURLSessionDelegate methods will not be called // as no delegate is attached to the session. See backgroundURLSession above. NSURLSession *backgroundSession = [self backgroundURLSession]; NSLog(@”Rejoining session with identifier %@ %@”, identifier, backgroundSession); // Store the completion handler to update your UI after processing session events [self addCompletionHandler:completionHandler forSession:identifier]; } – (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { NSLog(@”Background URL session %@ finished events.\n”, session); if (session.configuration.identifier) { // Call the handler we stored in -application:handleEventsForBackgroundURLSession: [self callCompletionHandlerForSession:session.configuration.identifier]; } } – (void)addCompletionHandler:(CompletionHandlerType)handler forSession:(NSString *)identifier { if ([self.completionHandlerDictionary objectForKey:identifier]) { NSLog(@”Error: Got multiple handlers for a single session identifier. This should not happen.\n”); } [self.completionHandlerDictionary setObject:handler forKey:identifier]; } – (void)callCompletionHandlerForSession: (NSString *)identifier { CompletionHandlerType handler = [self.completionHandlerDictionary objectForKey: identifier]; if (handler) { [self.completionHandlerDictionary removeObjectForKey: identifier]; NSLog(@”Calling completion handler for session %@”, identifier); handler(); } }

Это двухступенчатый процесс — нужно обновить пользовательский интерфейс приложения, если вы еще не на переднем плане, когда фоновая передача окончена. Помимо того, если приложение не запущено вовсе, IOS запустит его в фоновом режиме, и предшествующие приложения и сеансы делегируют способы вызванные позже: didFinishLaunchingWithOptions:

Настройка и ограничения

Мы коротко затронули силу фоновой передачи, но вы обязаны исследовать документацию и разглядеть опции NSURLSessionConfiguration, которые отменнее каждого поддерживают ваш

 

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

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