Aktualizowanie aplikacji platformy Xamarin. iOS w tleUpdating a Xamarin.iOS App in the Background

Odświeżanie w tle to proces wznawiania aplikacji, która jest zawieszona lub Nieuruchomiona, i aktualizowania jej przy użyciu nowej zawartości.Background refresh is the process of waking an application that is suspended or not running, and updating it with new content. System iOS oferuje trzy opcje odświeżania zawartości w tle:iOS provides three options for refreshing content in the background:

  1. Monitorowanie regionów i znaczną lokalizację zmiany w tle interfejsów API obsługujących lokalizacje usługi wyzwalają aktualizacje tła na podstawie zmian w lokalizacji użytkownika.Region Monitoring and Significant Location Changes Service - Location-aware APIs trigger background updates based on changes in the user's location. Te interfejsy API mogą być używane z uznaniem, aby odświeżyć zawartość w aplikacjach systemu iOS 6 opartych na innej lokalizacji, gdzie inne opcje są niedostępne.These APIs can be used with discretion to refresh content in non-location-based iOS 6 applications, where other options are not available.
  2. Pobieranie w tle (iOS 7 +) — okresowe podejście do odświeżania niekrytycznej zawartości, która jest często aktualizowana.Background Fetch (iOS 7+) - A temporal approach to refreshing non-critical content that updates frequently .
  3. Powiadomienia zdalne (iOS 7 +) — aplikacje odbierające powiadomienia wypychane mogą używać powiadomień do wyzwalania odświeżania zawartości w tle.Remote Notifications (iOS 7+) - Applications that receive push notifications can use the notifications to trigger background content refreshes. Tej metody można użyć do aktualizacji z istotną, zależną od czasu zawartością, która jest przeprowadzana w sposób sporadyczny .This method can be used to update with important, time-sensitive content that updates sporadically .

W poniższych sekcjach omówiono podstawowe opcje.The following sections cover the basics of these options.

Monitorowanie regionów i znaczące zmiany lokalizacjiRegion Monitoring and Significant Location Changes

System iOS oferuje dwa interfejsy API obsługujące lokalizacje z funkcjami w tle:iOS provides two location-aware APIs with backgrounding capabilities:

  1. Monitorowanie regionów to proces konfigurowania regionów z granicami i wznawiania urządzenia, gdy użytkownik wprowadza lub opuszcza region.Region Monitoring is the process of setting up regions with boundaries, and waking the device when the user enters or exits a region. Regiony są cykliczne i mogą mieć różne rozmiary.Regions are circular and can be of varying size. Gdy użytkownik przekroczy granicę regionu, urządzenie zostanie wznowione w celu obsługi zdarzenia, zazwyczaj przez wyzwolenie powiadomienia lub uruchomienie zadania.When the user crosses a region boundary, the device will wake up to handle the event, usually by firing a notification or kicking off a task. Monitorowanie regionów wymaga GPS i zwiększa użycie baterii i danych.Region Monitoring requires GPS, and increases battery and data usage.
  2. Znacząca zmiana lokalizacji usługi jest prostsza, ale nie jest dostępna w przypadku urządzeń z urządzeniami radiowymi komórkowych.The Significant Location Changes Service is a simpler, power-conserving option available for devices with cellular radios. Aplikacja, która nasłuchuje znaczących zmian lokalizacji, zostanie powiadomiona, gdy urządzenie przełączy komórkę Towers.An application listening for significant location changes will be notified when the device switches cell towers. Ta usługa może być używana do wznawiania aplikacji zawieszonej lub przerywanej oraz umożliwia sprawdzenie dostępności nowej zawartości w tle.This service can be used to wake a suspended or terminated application, and provides an opportunity to check for new content in the background. Działanie w tle jest ograniczone do około 10 sekund, chyba że jest sparowane z zadaniem w tle .Background activity is limited to about 10 seconds, unless paired with a Background Task .

Aplikacja nie potrzebuje lokalizacji UIBackgroundMode do używania tych interfejsów API obsługujących lokalizacje.An application does not need the location UIBackgroundMode to use these location-aware APIs. Ponieważ system iOS nie śledzi typów zadań, które mogą być uruchamiane, gdy urządzenie jest wybudzany przez zmiany lokalizacji użytkownika, te interfejsy API zapewniają obejście do aktualizowania zawartości w tle w systemie iOS 6.Because iOS doesn't track the types of tasks that can run when the device is woken by changes in the user's location, these APIs provide a work-around for updating content in the background on iOS 6. Należy pamiętać , że wyzwalanie aktualizacji w tle za pomocą interfejsów API opartych na lokalizacji będzie narysowane na zasobach urządzeń i może mylić użytkowników, którzy nie wiedzą, Dlaczego aplikacja wymaga dostępu do ich lokalizacji.Keep in mind that triggering background updates with location-based APIs will draw on device resources, and may confuse users who don't understand why an application requires access to their location. Należy używać uznania podczas implementowania monitorowania regionów lub znaczących zmian lokalizacji dla przetwarzania w tle w aplikacjach, które nie używają jeszcze interfejsów API lokalizacji.Use discretion when implementing Region Monitoring or Significant Location Changes for background processing in applications that aren't already using the location APIs.

Aplikacje korzystające z monitorowania lokalizacji dla przetwarzania w tle uwidaczniają wady w systemie iOS 6: Jeśli potrzeby aplikacji nie mieszczą się w kategorii niezbędnej dla tła, mają ograniczoną liczbę opcji w tle.Apps using location monitoring for background processing expose a flaw in iOS 6: if an application's needs don't fit into a background-necessary category, it has limited backgrounding options. Wprowadzając dwa nowe interfejsy API, pobieranie w tle i zdalne powiadomienia, system iOS 7 (i nowsze) udostępnia możliwości w tle do większej liczby aplikacji.With the introduction of two new APIs, Background Fetch and Remote Notifications, iOS 7 (and greater) provides backgrounding opportunities to more applications. W następnych dwóch sekcjach wprowadzono te nowe interfejsy API.The next two sections introduce these new APIs.

Pobieranie w tle (system iOS 7 i nowsze)Background Fetch (iOS 7 and Greater)

W systemie iOS 6 Aplikacja wprowadzająca na pierwszy plan czasu wymagała załadowania nowej zawartości, krótko przedstawiających użytkowników z zawartością, która już się widzi.In iOS 6, an application entering the foreground needed time to load new content, briefly presenting users with content they've already seen. Pobieranie w tle umożliwia aplikacjom ładowanie nowych danych przed uruchomieniem aplikacji przez użytkownika i dostarczenie użytkownikowi najbardziej aktualnej zawartości.Background fetch allows applications to load new data before a user launches the application, and provide the user with the most up-to-date content.

Aby zaimplementować pobieranie w tle, Edytuj info. plist i zaznacz pola wyboru Włącz tryb tła i pobieranie w tle :To implement background fetch, edit Info.plist and check the Enable Background Modes and Background Fetch check boxes:

Edytuj informacje. plist i zaznacz pola wyboru Włącz tryb tła i pobieranie w tleEdit the Info.plist and check the Enable Background Modes and Background Fetch check boxes

Następnie w programie AppDelegate Przesłoń metodę, FinishedLaunching Aby ustawić minimalny interwał pobierania.Next, in the AppDelegate, override the FinishedLaunching method to set the minimum fetch interval. W tym przykładzie zezwolimy systemowi operacyjnemu na podejmowanie decyzji o tym, jak często ma być pobierana Nowa zawartość:In this example, we let the OS decide how often to fetch new content:

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

Na koniec wykonaj pobieranie, zastępując PerformFetch metodę w AppDelegate i przechodząc do procedury obsługi zakończenia.Finally, perform the fetch by overriding the PerformFetch method in the AppDelegate, and passing in a completion handler. Procedura obsługi uzupełniania jest delegatem, który przyjmuje UIBackgroundFetchResult :The completion handler is a delegate that takes a 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);
}

Po zakończeniu aktualizowania zawartości możemy poznać system operacyjny, wywołując procedurę obsługi uzupełniania z odpowiednim stanem.When we're done updating content, we let the OS know by calling the completion handler with the appropriate status. System iOS oferuje trzy opcje stanu procedury obsługi uzupełniania:iOS offers three options for completion handler status:

  1. UIBackgroundFetchResult.NewData-Wywoływana, gdy została pobrana Nowa zawartość, a aplikacja została zaktualizowana.UIBackgroundFetchResult.NewData - Called when new content has been fetched, and the application has been updated.
  2. UIBackgroundFetchResult.NoData-Wywoływana, gdy przeszedł pobieranie nowej zawartości, ale żadna zawartość nie jest dostępna.UIBackgroundFetchResult.NoData - Called when the fetch for new content went through, but no content is available.
  3. UIBackgroundFetchResult.Failed-Przydatne w przypadku obsługi błędów, jest to wywoływane, gdy pobieranie nie było możliwe.UIBackgroundFetchResult.Failed - Useful for error handling, this is called when the fetch was unable to go through.

Aplikacje korzystające z funkcji pobierania w tle mogą wykonywać wywołania, aby zaktualizować interfejs użytkownika w tle.Applications using Background Fetch can make calls to update the UI from the background. Gdy użytkownik otworzy aplikację, interfejs użytkownika będzie aktualny i zostanie wyświetlony Nowa zawartość.When the user opens the app, the UI will be up to date and displaying new content. Spowoduje to również zaktualizowanie migawki przełącznika aplikacji aplikacji, aby użytkownik mógł zobaczyć, kiedy aplikacja ma nową zawartość.This will also update the application's App Switcher snapshot, so the user can see when the application has new content.

Ważne

Gdy PerformFetch jest wywoływana, aplikacja ma około 30 sekund, aby rozpocząć pobieranie nowej zawartości i wywołać blok obsługi uzupełniania.Once PerformFetch is called, the application has approximately 30 seconds to kick off download of new content, and call the completion handler block. Jeśli trwa to zbyt długo, aplikacja zostanie przerwana.If this takes too long, the app will be terminated. Podczas pobierania multimediów lub innych dużych plików Rozważ użycie funkcji pobierania w tle w usłudze transferu w tle .Consider using Background Fetch with the Background Transfer Service when downloading media or other large files.

BackgroundFetchIntervalBackgroundFetchInterval

W powyższym przykładowym kodzie firma Microsoft zdecyduje, jak często pobierać nową zawartość, ustawiając minimalny interwał pobierania BackgroundFetchIntervalMinimum .In the sample code above, we let the OS decide how often to fetch new content by setting the minimum fetch interval to BackgroundFetchIntervalMinimum. System iOS oferuje trzy opcje interwału pobierania:iOS offers three options for the fetch interval:

  1. BackgroundFetchIntervalNever— Poinformuj system, aby nigdy nie pobierał nowej zawartości.BackgroundFetchIntervalNever - Tell the system to never fetch new content. Użyj tej opcji, aby wyłączyć pobieranie w pewnych sytuacjach, na przykład gdy użytkownik nie jest zalogowany.Use this to turn off fetching in certain situations, such as when the user is not signed in. Jest to wartość domyślna interwału pobierania.This is the default value for the fetch interval.
  2. BackgroundFetchIntervalMinimum-Pozwól systemowi decydować, jak często pobierać dane na podstawie wzorców użytkowników, cyklu życia baterii, użycia danych i potrzeb innych aplikacji.BackgroundFetchIntervalMinimum - Let the system decide how often to fetch based on user patterns, battery life, data usage, and the needs of other applications.
  3. BackgroundFetchIntervalCustom— Jeśli wiesz, jak często zawartość aplikacji jest aktualizowana, możesz określić interwał "uśpienia" po każdym pobieraniu, w którym aplikacja nie będzie mogła pobrać nowej zawartości.BackgroundFetchIntervalCustom - If you know how often an application's content gets updated, you can specify a "sleep" interval after every fetch, during which the application will be prevented from fetching new content. Po upływie tego czasu system określi, kiedy należy pobrać zawartość.Once that interval is up, the system will determine when to fetch content.

Zarówno BackgroundFetchIntervalMinimum , jak i BackgroundFetchIntervalCustom Polegam na systemie, aby zaplanować pobieranie.Both BackgroundFetchIntervalMinimum and BackgroundFetchIntervalCustom rely on the system to schedule fetches. Ten interwał jest dynamiczny, dostosowując do potrzeb urządzenia, a także do nawyków poszczególnych użytkowników.This interval is dynamic, adapting to the device's needs as well as the individual user's habits. Na przykład jeśli jeden użytkownik sprawdza aplikację co rano, a drugie sprawdza co godzinę, system iOS zapewni aktualność zawartości dla obu użytkowników przy każdym otwarciu aplikacji.For example, if one user checks an application every morning, and another checks every hour, iOS will ensure the content is up to date for both users every time they open the application.

Pobieranie w tle powinno być używane dla aplikacji, które często aktualizują zawartość niekrytyczną.Background Fetch should be used for applications that update frequently with non-critical content. W przypadku aplikacji z aktualizacjami krytycznymi należy używać powiadomień zdalnych.For applications with critical updates, Remote Notifications should be used. Powiadomienia zdalne są oparte na pobieraniu w tle i korzystają z tego samego programu obsługi uzupełniania.Remote Notifications are based on Background Fetch, and share the same completion handler. Będziemy szczegółowe do powiadomień zdalnych dalej.We'll dive into Remote Notifications next.

Powiadomienia zdalne (system iOS 7 i nowsze)Remote Notifications (iOS 7 and Greater)

Powiadomienia wypychane to komunikaty JSON wysyłane od dostawcy do urządzenia za pośrednictwem usługi Apple Push Notification Service (APNs).Push notifications are JSON messages sent from a provider to a device by way of the Apple Push Notification service (APNs).

W systemie iOS 6 przychodzące powiadomienia wypychane mówią systemowi o alercie użytkownika o wystąpieniu interesujących w aplikacji.In iOS 6, an incoming push notifications tells the system to alert the user that something interesting has happened in an application. Kliknięcie powiadomienia spowoduje wyciągnięcie aplikacji z stanu wstrzymania lub zakończenia, a aplikacja zacznie aktualizować zawartość.Clicking on the notification pulls the application out of the suspended or terminated state, and the app would begin updating content. System iOS 7 (i nowsze) rozszerza zwykłe powiadomienia wypychane przez umożliwienie aplikacjom aktualizowania zawartości w tle przed powiadomieniem użytkownika, aby użytkownik mógł otworzyć aplikację i natychmiast przedstawić nową zawartość.iOS 7 (and greater) extends ordinary push notifications by giving applications a chance to update content in the background before notifying the user, so that the user can open the application and be presented with new content immediately.

Aby zaimplementować zdalne powiadomienia, Edytuj info. plist i zaznacz pola wyboru Włącz tryby w tle i powiadomienia zdalne :To implement remote notifications, edit Info.plist and check the Enable Background Modes and Remote notifications check boxes:

Tryb tła ustawiony do włączania trybów tła i powiadomień zdalnychBackground Mode set to Enable Background Modes and Remote notifications

Następnie ustaw content-available flagę dla powiadomienia wypychanego na 1.Next, set the content-available flag on the push notification itself to 1. Dzięki temu aplikacja może pobrać nową zawartość przed wyświetleniem alertu:This lets the application know to fetch new content before displaying the alert:

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

W AppDelegateZastąp metodę, DidReceiveRemoteNotification Aby sprawdzić, czy ładunek powiadomienia ma dostępną zawartość, i Wywołaj odpowiedni blok obsługi uzupełniania:In the AppDelegate, override the DidReceiveRemoteNotification method to check the notification payload for available content, and call the appropriate completion handler block:

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

Powiadomienia zdalne powinny być używane w przypadku rzadko używanych aktualizacji o zawartości, która jest kluczowa dla funkcjonalności aplikacji.Remote notifications should be used for infrequent updates with content that is crucial to the application's functionality. Aby uzyskać więcej informacji na temat powiadomień zdalnych, zobacz sekcję " powiadomienia wypychane programu Xamarin w systemie iOS".For more information on remote notifications, see the Xamarin Push Notifications in iOS guide.

Ważne

Ponieważ mechanizm aktualizacji w powiadomieniach zdalnych jest oparty na pobieraniu w tle, aplikacja musi uruchomić pobieranie nowej zawartości i wywołać blok procedury obsługi uzupełniania w ciągu 30 sekund od otrzymania powiadomienia, a system iOS zakończy działanie aplikacji.Because the update mechanism in Remote Notifications is based on Background Fetch, the application must kick off download of new content and call the completion handler block within 30 seconds of receiving the notification, or iOS will terminate the application. Należy rozważyć parowanie powiadomień zdalnych z usługą transferu w tle podczas pobierania multimediów lub innych dużych plików w tle.Consider pairing Remote Notifications with Background Transfer Service when downloading media or other large files in the background.

Dyskretne powiadomienia zdalneSilent Remote Notifications

Powiadomienia zdalne są prostą metodą powiadamiania aplikacji o aktualizacjach i uruchamiania pobierania nowej zawartości, ale zdarzają się sytuacje, w których nie trzeba powiadomić użytkownika o tym, że coś się zmieniło.Remote Notifications are a simple way to notify applications of updates and kick off fetching new content, but there are cases where we don't need to notify the user that something has changed. Na przykład, jeśli użytkownik flaguje plik do synchronizacji, nie musimy powiadamiać ich za każdym razem, gdy plik zostanie zaktualizowany.For example, if a user flags a file for synching, we don't need to notify them every time the file updates. Synchronizacja plików nie jest zdarzeniem zaskakujące ani nie wymaga natychmiastowej uwagi użytkownika.File synching is not a surprising event, nor does it require the user's immediate attention. Użytkownicy oczekują, że plik będzie aktualny po otwarciu.Users just expect the file to be up-to-date when they open it.

W przypadku takich przypadków jak powyżej, system iOS zezwala na wysyłanie powiadomień wypychanych w trybie dyskretnym — czyli bez alertu.For cases like the one above, iOS allows push notifications to be sent silently - that is, without an alert. Aby włączyć zwykłe powiadomienie w trybie dyskretnym, po prostu usuń alert z ładunku powiadomienia:To turn a regular notification into a silent one, simply remove the alert from the notification payload:

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

Limity szybkościRate Limits

Największą różnicą między normalnymi i cichymi powiadomieniami z perspektywy deweloperów jest to, że dyskretne wypychania mają ograniczoną szybkość.The biggest difference between normal and silent notifications from a developer perspective is that silent pushes are rate limited. W przypadku, gdy stawka wypychania będzie zbyt wysoka, usługi APNs opóźnią dostarczanie wypychanych powiadomień do urządzenia.APNs will delay the delivery of silent pushes to the device if the push rate gets too high. Ma to na celu zapewnienie, że aplikacje nie będą opróżniać zasobów urządzeń z zbyt dużą liczbą powiadomień dyskretnych.This is to ensure that applications don't drain device resources with too many silent notifications.

Jednak usługi APNs umożliwią ciche powiadomienia "piggyback" wraz z normalną zdalną powiadomieniem lub odpowiedzią Keep-Alive.However, APNs will let silent notifications "piggyback" alongside a normal Remote Notification or keep-alive response. Ponieważ regularne powiadomienia są nieograniczone, można je wykorzystać do wypychania przechowywanych powiadomień dyskretnych z usługi APNs do urządzenia, jak pokazano na poniższym diagramie:Because regular notifications are not rate limited, they can be used to push stored up silent notifications from the APNs to the device, as illustrated by the following diagram:

Regularne powiadomienia umożliwiają wypychanie przechowywanych powiadomień dyskretnych z usługi APNs do urządzenia, jak pokazano na tym diagramie.Regular notifications can be used to push stored silent notifications from the APNs to the device, as illustrated by this diagram

Ważne

Firma Apple zachęca deweloperów do wysyłania dyskretnych powiadomień wypychanych za każdym razem, gdy aplikacja jest wymagana, i pozwól na zaplanowanie dostarczania przez usługi APNs.Apple encourages developers to send silent push notifications whenever the application requires, and let the APNs schedule their delivery.

W tej sekcji zostały omówione różne opcje odświeżania zawartości w tle w celu uruchamiania zadań, które nie mieszczą się w nieodpowiedniej kategorii w tle.In this section, we've covered the various options for refreshing content in the background to run tasks that don't fit into a background-necessary category. Teraz zobaczmy niektóre z tych interfejsów API w działaniu.Now, let's see some of these APIs in action.

Dalej: część 4 — Instruktaże dotyczące tła dla systemu iOSNext: Part 4 - iOS Backgrounding Walkthroughs