Поделиться через


Обновление приложения Xamarin.iOS в фоновом режиме

Фоновое обновление — это процесс пробуждения приложения, которое приостановлено или не запущено, и обновление его с новым содержимым. IOS предоставляет три варианта обновления содержимого в фоновом режиме:

  1. Служба "Мониторинг регионов" и " Значительные изменения расположения" — API,поддерживающие расположение, активируют фоновые обновления на основе изменений в расположении пользователя. Эти API можно использовать по усмотрению для обновления содержимого в приложениях iOS 6, отличных от расположения, где другие параметры недоступны.
  2. Фоновая выборка (iOS 7+) — временный подход к обновлению некритичного содержимого, который часто обновляется.
  3. Удаленные уведомления (iOS 7+) — приложения, получающие push-уведомления, могут использовать уведомления для активации фонового обновления содержимого. Этот метод можно использовать для обновления с важным с учетом времени содержимого, которое обновляется периодически .

В следующих разделах рассматриваются основные сведения об этих параметрах.

Мониторинг регионов и существенные изменения расположения

IOS предоставляет два API с поддержкой расположения с возможностями фона:

  1. Мониторинг регионов — это процесс настройки регионов с границами и пробуждения устройства при входе или выходе из региона. Регионы циклические и могут иметь разные размеры. Когда пользователь пересекает границу региона, устройство проснется для обработки события, обычно путем запуска уведомления или запуска задачи. Для мониторинга регионов требуется GPS и увеличивается использование батареи и данных.
  2. Служба существенных изменений расположения — это более простой вариант экономии питания для устройств с сотовыми радиосвязями. Приложение, прослушивающее значительные изменения расположения, будет уведомлено, когда устройство переключает башни ячеек. Эта служба может использоваться для пробуждения приостановленного или завершенного приложения и предоставляет возможность проверка для нового содержимого в фоновом режиме. Фоновая активность ограничена около 10 секунд, если не связана с фоновой задачей .

Приложению не требуется расположение UIBackgroundMode для использования этих API с учетом расположения. Так как iOS не отслеживает типы задач, которые могут выполняться, когда устройство проснулось изменениями в расположении пользователя, эти API предоставляют обходные действия для обновления содержимого в фоновом режиме в iOS 6. Помните, что активация фоновых обновлений с помощью API на основе расположения будет опираться на ресурсы устройства, и может путать пользователей, которые не понимают, почему приложению требуется доступ к их расположению. Используйте дискреционное решение при реализации мониторинга региона или значительных изменений расположения для фоновой обработки в приложениях, которые еще не используют API расположения.

Приложения, использующие мониторинг расположения для фоновой обработки, предоставляют недостаток в iOS 6: если потребности приложения не вписываются в категорию, необходимую для фона, она имеет ограниченные параметры фона. С введением двух новых API, фоновая выборка и удаленные уведомления iOS 7 (и больше) обеспечивает фоновые возможности для дополнительных приложений. В следующих двух разделах представлены эти новые API.

Фоновая выборка (iOS 7 и больше)

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

Чтобы реализовать фоновую выборку, измените Info.plist и проверка поля включения фоновых режимов и фоновой выборки проверка:

Edit the Info.plist and check the Enable Background Modes and Background Fetch check boxes

Затем переопределите AppDelegateFinishedLaunching метод, чтобы задать минимальный интервал получения. В этом примере мы позволим ОС решить, как часто получить новое содержимое:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
  UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval (UIApplication.BackgroundFetchIntervalMinimum);
  return true;
}

Наконец, выполните выборку, переопределив PerformFetch метод в обработчике AppDelegateзавершения и передавая его. Обработчик завершения — это делегат, который принимает :UIBackgroundFetchResult

public override void PerformFetch (UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
  // Check for new data, and display it
  ...
  
  // Inform system of fetch results
  completionHandler (UIBackgroundFetchResult.NewData);
}

Когда мы завершим обновление содержимого, мы сообщите ОС, вызвав обработчик завершения с соответствующим состоянием. IOS предлагает три варианта состояния обработчика завершения:

  1. UIBackgroundFetchResult.NewData — Вызывается при получении нового содержимого и обновлении приложения.
  2. UIBackgroundFetchResult.NoData — Вызывается, когда выполняется получение нового содержимого, но содержимое недоступно.
  3. UIBackgroundFetchResult.Failed — Полезно для обработки ошибок, это вызывается, когда выборка не смогла пройти.

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

Внимание

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

BackgroundFetchInterval

В приведенном выше примере кода мы позволим ОС решить, как часто получить новое содержимое, задав минимальный интервал BackgroundFetchIntervalMinimumполучения. IOS предлагает три варианта интервала получения:

  1. BackgroundFetchIntervalNever — сообщите системе, чтобы никогда не извлекать новое содержимое. Используйте эту функцию, чтобы отключить получение в определенных ситуациях, например, если пользователь не вошел в систему. Это значение по умолчанию для интервала получения.
  2. BackgroundFetchIntervalMinimum — Позвольте системе определить частоту получения на основе пользовательских шаблонов, времени заряда батареи, использования данных и потребностей других приложений.
  3. BackgroundFetchIntervalCustom — Если вы знаете, как часто содержимое приложения обновляется, можно указать интервал "спящий" после каждого получения, во время которого приложение не сможет получить новое содержимое. После этого интервала система определит, когда нужно получить содержимое.

BackgroundFetchIntervalCustom Обе BackgroundFetchIntervalMinimum системы зависят от системы, чтобы запланировать получение. Этот интервал является динамическим, адаптируясь к потребностям устройства, а также привычкам отдельного пользователя. Например, если один пользователь проверка приложение каждый утром, а другой проверка каждый час, iOS обеспечит актуальность содержимого для обоих пользователей при каждом открытии приложения.

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

Удаленные уведомления (iOS 7 и больше)

Push-уведомления — это сообщения JSON, отправляемые поставщиком на устройство через службу push-уведомлений Apple (APNs).

В iOS 6 входящие push-уведомления сообщают системе предупреждать пользователя о том, что в приложении произошло что-то интересное. Щелкнув уведомление, приложение извлекает приложение из приостановленного или завершенного состояния, и приложение начнет обновлять содержимое. IOS 7 (и больше) расширяет обычные push-уведомления, предоставляя приложениям возможность обновлять содержимое в фоновом режиме , прежде чем уведомлять пользователя, чтобы пользователь мог открыть приложение и сразу же представить новое содержимое.

Чтобы реализовать удаленные уведомления, измените Info.plist и проверка поля включения фоновых режимов и удаленных уведомлений проверка:

Background Mode set to Enable Background Modes and Remote notifications

Затем установите флаг в самом push-уведомлении content-available значение 1. Это позволит приложению узнать, как получить новое содержимое перед отображением оповещения:

'aps' {
  'content-available': 1,
  'alert': 'Something new has happened in your app!''
}

В AppDelegate переопределите DidReceiveRemoteNotification метод, чтобы проверка полезные данные уведомления для доступного содержимого, и вызовите соответствующий блок обработчика завершения:

public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
  if([content-available]) {
    // fetch content
    completionHandler (UIBackgroundFetchResult.NewData);
  }
}

Удаленные уведомления должны использоваться для редких обновлений с содержимым, важным для функциональности приложения. Дополнительные сведения об удаленных уведомлениях см. в руководстве по push-уведомлениям Xamarin в iOS .

Внимание

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

Автоматическое удаленное уведомление

Удаленные уведомления — это простой способ уведомлять приложения об обновлениях и запускать получение нового содержимого, но есть случаи, когда нам не нужно уведомлять пользователя о том, что что-то изменилось. Например, если пользователь помечает файл для синхронизации, нам не нужно уведомлять их при каждом обновлении файла. Синхронизация файлов не является удивительным событием, и не требует немедленного внимания пользователя. Пользователи просто ожидают, что файл будет обновлен при его открытии.

В таких случаях, как описано выше, iOS позволяет отправлять push-уведомления автоматически, то есть без оповещения. Чтобы превратить регулярное уведомление в автоматический, просто удалите оповещение из полезных данных уведомления:

'aps' {
  'content-available': 1
}

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

Самая большая разница между обычными и автоматическими уведомлениями с точки зрения разработчика заключается в том, что автоматические push-уведомления ограничены. APNs отложит доставку автоматической отправки на устройство, если скорость отправки слишком высока. Это гарантирует, что приложения не стекают ресурсы устройств с слишком большим количеством автоматических уведомлений.

Однако APNs позволит автоматическим уведомлениям "piggyback" наряду с обычным удаленным уведомлением или ответом на сохранение активности. Так как регулярные уведомления не ограничены скоростью, их можно использовать для отправки хранимых автоматических уведомлений из APN на устройство, как показано на следующей схеме:

Regular notifications can be used to push stored silent notifications from the APNs to the device, as illustrated by this diagram

Внимание

Apple призывает разработчиков отправлять автоматические push-уведомления всякий раз, когда требуется приложение, и позволить APNs планировать их доставку.

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

Далее: часть 4 . Пошаговые руководства по фоновому просмотру iOS