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

Odświeżanie w tle jest procesem wznawianie aplikacji, która jest wstrzymana lub nieuruchomiona i aktualizowanie jej z nową zawartością.Background refresh is the process of waking an application that is suspended or not running, and updating it with new content. dla systemu iOS zawiera trzy opcje odświeżanie zawartości w tle:iOS provides three options for refreshing content in the background:

  1. Monitorowanie region i znaczące usługa zmiany lokalizacji — interfejsy API lokalizacji wyzwalacza tła aktualizacji 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 można z rozwagą Aby odświeżyć zawartość w aplikacjach nie opartych na lokalizacji dla systemu iOS 6, której nie są dostępne inne opcje.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 (system iOS 7 +) w tle -danych czasowych podejście do odświeżania niekrytyczne zawartość, która aktualizuje często .Background Fetch (iOS 7+) - A temporal approach to refreshing non-critical content that updates frequently .
  3. Zdalne powiadomienia (system iOS 7 +) — aplikacje, które odbierania powiadomień wypychanych, możesz użyć powiadomienia do wyzwolenia zawartości operacji odświeżania w tle.Remote Notifications (iOS 7+) - Applications that receive push notifications can use the notifications to trigger background content refreshes. Ta metoda służy do aktualizacji za pomocą ważne, zależne od czasu zawartość, która aktualizuje sporadycznie .This method can be used to update with important, time-sensitive content that updates sporadically .

W poniższych częściach omówiono podstawy tych opcji.The following sections cover the basics of these options.

Monitorowanie region i lokalizacja znaczące zmianyRegion Monitoring and Significant Location Changes

dla systemu iOS zapewnia dwa interfejsy API lokalizacji, z możliwości uruchamianie procesów w tle:iOS provides two location-aware APIs with backgrounding capabilities:

  1. Monitorowanie region to proces konfigurowania regiony z granic i wznawianie urządzenia, gdy użytkownik wprowadzi lub zamyka 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 może być o różnych rozmiarach.Regions are circular and can be of varying size. Gdy użytkownik przecina granicę region, urządzenie wzbudzania do obsługi zdarzeń, zwykle przez wyzwalanie powiadomienie lub określonego 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 wymaga systemu GPS i zwiększa baterii i użycia danych.Region Monitoring requires GPS, and increases battery and data usage.
  2. Znaczące usługa zmiany lokalizacji opcja prostszy, Oszczędzanie energii jest dostępna dla urządzeń z sieci komórkowej urządzeń radiowych.The Significant Location Changes Service is a simpler, power-conserving option available for devices with cellular radios. Aplikacji nasłuchujących w lokalizacji znaczących zmian zostanie powiadomiony, gdy urządzenie zmienia towers komórki.An application listening for significant location changes will be notified when the device switches cell towers. Ta usługa służy do wznawiania aplikacji wstrzymania lub został zakończony i stanowi przy tym okazję pod kątem 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. Operacje w tle wynosi około 10 sekund, o ile nie jest sparowana z zadanie w tle .Background activity is limited to about 10 seconds, unless paired with a Background Task .

Aplikacja nie wymaga lokalizacji UIBackgroundMode na korzystanie z tych lokalizacji interfejsów API.An application does not need the location UIBackgroundMode to use these location-aware APIs. Ponieważ typy zadań, które można uruchomić, gdy urządzenie jest wybudzany zmianami w lokalizacji użytkownika nie może śledzić dla systemu iOS, te interfejsy API Obejmij obejścia aktualizowanie 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 wyzwalania aktualizacji w tle za pomocą interfejsów API opartych na lokalizacji wykorzysta zasoby urządzenia i może mylić użytkowników, którzy nie rozumieją, 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 zachować ostrożność podczas implementowania monitorowania regionu lub znaczących zmian lokalizacji dla przetwarzania w aplikacjach, które nie jest jeszcze używana interfejsy API lokalizacji w tle.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 przetwarzania w tle ujawnić luka w zabezpieczeniach w systemie iOS 6: Jeśli aplikacji potrzebom nie należą do kategorii niezbędne tła, ma mniej opcji Uruchamianie procesów 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. Wraz z wprowadzeniem dwa nowe interfejsy API pobieranie w tle i zdalne powiadomienia, system iOS 7 (lub większy) umożliwia uruchamianie procesów w tle okazji 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 dwóch następnych sekcjach wprowadzić te nowe interfejsy API.The next two sections introduce these new APIs.

Pobieranie w tle (system iOS 7 lub nowszym)Background Fetch (iOS 7 and Greater)

W systemie iOS 6 aplikację, wprowadzając na pierwszym planie potrzebny czas ładowania nowej zawartości, krótko prezentowanie użytkowników z zawartością, które są już w tym samouczku.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 użytkownik uruchamia aplikację i zapewnić najbardziej aktualne materiały użytkownika.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, należy edytować Info.plist i sprawdź Włącz tryby w tle i pobieranie w tle pól wyboru:To implement background fetch, edit Info.plist and check the Enable Background Modes and Background Fetch check boxes:

Następnie w AppDelegate, Zastąp FinishedLaunching metodę, aby ustawić interwał pobierania minimalnej.Next, in the AppDelegate, override the FinishedLaunching method to set the minimum fetch interval. W tym przykładzie firma Microsoft chętnie systemu operacyjnego, zdecyduj, jak często pobrać nową 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 fetch przez zastąpienie PerformFetch method in Class metoda AppDelegatei przekazując procedury obsługi zakończenia.Finally, perform the fetch by overriding the PerformFetch method in the AppDelegate, and passing in a completion handler. Procedury obsługi zakończenia jest delegat, 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);
}

Gdy wszystko jest gotowe aktualizowania zawartości, umożliwialiśmy wiedzieć, przez wywołanie procedury obsługi zakończenia z odpowiedni stan systemu operacyjnego.When we're done updating content, we let the OS know by calling the completion handler with the appropriate status. iOS oferuje trzy opcje stan procedury obsługi zakończenia:iOS offers three options for completion handler status:

  1. UIBackgroundFetchResult.NewData -Wywoływana, gdy zostaną pobrane nowej zawartości, 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 przeszło pobieranie nowej zawartości, ale nie jest dostępna żadna zawartość.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, to jest wywoływana, gdy fetch nie może przejść.UIBackgroundFetchResult.Failed - Useful for error handling, this is called when the fetch was unable to go through.

Aplikacje przy użyciu pobieranie w tle może 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 wyświetlanie nowej zawartości.When the user opens the app, the UI will be up to date and displaying new content. Migawki aplikacji przełącznik aplikacji, spowoduje to również zaktualizowanie dzięki czemu użytkownik może wyświetlić, gdy 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 rozpocząć pobieranie nowej zawartości i wywoływać bloku procedury obsługi zakończenia.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 zakończona.If this takes too long, the app will be terminated. Należy rozważyć użycie pobieranie w tle za pomocą usługi transferu w tle podczas pobierania nośnika lub innych dużych plików.Consider using Background Fetch with the Background Transfer Service when downloading media or other large files.

BackgroundFetchIntervalBackgroundFetchInterval

W powyższym kodzie przykładowym umożliwialiśmy systemu operacyjnego, zdecyduj, jak często pobrać nową zawartość przez ustawienie interwału pobierania minimalnej 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. iOS oferuje trzy opcje interwału pobierania:iOS offers three options for the fetch interval:

  1. BackgroundFetchIntervalNever -Poinformować system nigdy nie Fetch nowej zawartości.BackgroundFetchIntervalNever - Tell the system to never fetch new content. Umożliwia wyłączanie pobieranie w niektórych 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 dla interwału pobierania.This is the default value for the fetch interval.
  2. BackgroundFetchIntervalMinimum — Niech system zdecyduj, jak często można pobrać na podstawie wzorców użytkownika, czas pracy baterii, danych użycia i wymagań 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 jest aktualizowany zawartość aplikacji, można określić interwał "Uśpij" po każdym pobraniu, podczas którego aplikacja nie będzie mógł pobieranie 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 skonfigurowaniu tego interwału system określi, gdy można pobrać zawartości.Once that interval is up, the system will determine when to fetch content.

Zarówno BackgroundFetchIntervalMinimum i BackgroundFetchIntervalCustom zależą od systemu, aby zaplanować odczyty.Both BackgroundFetchIntervalMinimum and BackgroundFetchIntervalCustom rely on the system to schedule fetches. Ten interwał jest dynamiczny, dostosowanie do potrzeb urządzenia, a także nawyków indywidualnego użytkownika.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, czy aplikacja codziennie, a innym sprawdza co godzinę, z systemem iOS zapewni zawartości jest aktualny dla obu użytkowników 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, należy używać w przypadku aplikacji, które aktualizują się często z zawartością niekrytyczne.Background Fetch should be used for applications that update frequently with non-critical content. W przypadku aplikacji za pomocą aktualizacji krytycznych należy użyć zdalne powiadomienia.For applications with critical updates, Remote Notifications should be used. Zdalne powiadomienia są oparte na pobieranie w tle i udostępniania tej samej procedury obsługi zakończenia.Remote Notifications are based on Background Fetch, and share the same completion handler. Będziesz Zaczniemy zdalne powiadomienia dalej.We'll dive into Remote Notifications next.

Zdalne powiadomienia (system iOS 7 lub nowszym)Remote Notifications (iOS 7 and Greater)

Powiadomienia wypychane są JSON wiadomości od dostawcy do urządzenia za 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ących powiadomień wypychanych informuje system, aby ostrzec użytkownika, która czegoś interesującego miała miejsce 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 ściąga aplikacji ze stanu wstrzymania lub został zakończony, a aplikacja będzie zacząć, aktualizowania zawartości.Clicking on the notification pulls the application out of the suspended or terminated state, and the app would begin updating content. System iOS 7 (lub większy) rozszerza powiadomienia wypychane w zwykły, zapewniając aplikacji szansę, aby zaktualizować zawartość w tle przed powiadamiania użytkownika, tak aby użytkownik może otworzyć aplikację i przedstawiane za pomocą nowej zawartości od razu.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, należy edytować Info.plist i sprawdź Włącz tryby w tle i zdalne powiadomienia pól wyboru:To implement remote notifications, edit Info.plist and check the Enable Background Modes and Remote notifications check boxes:

Następnym etapem jest skonfigurowanie content-available flagi na powiadomienie wypychane na 1.Next, set the content-available flag on the push notification itself to 1. Umożliwia to aplikacji, aby 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 elemencie AppDelegate, Zastąp DidReceiveRemoteNotification metodę, aby sprawdzić ładunek powiadomienia dostępnej zawartości, a następnie wywołaj ukończenia odpowiedniego bloku obsługi: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);
  }
}

Zdalne powiadomienia, należy używać rzadkie aktualizacji z zawartością, która ma kluczowe znaczenie 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 zdalne powiadomienia, zobacz Xamarin powiadomienia wypychane w systemie iOS przewodnik.For more information on remote notifications, see the Xamarin Push Notifications in iOS guide.

Ważne

Ponieważ mechanizm aktualizacji w powiadomieniach zdalnego opiera się na pobieranie w tle, aplikacja musi rozpocząć pobieranie nowej zawartości i wywołać bloku procedury obsługi zakończenia w ciągu 30 sekund od otrzymania powiadomienia lub z systemem iOS zostanie zakończona aplikacja.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 wziąć pod uwagę parowanie zdalne powiadomienia za pomocą usługi transferu w tle podczas pobierania nośnika 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.

Dyskretnej zdalne powiadomieniaSilent Remote Notifications

Zdalne powiadomienia to prosty sposób powiadamiania aplikacji o aktualizacjach i rozpocząć pobieranie nowej zawartości, ale istnieją przypadki, w którym nie musimy powiadomić użytkownika, który zmienił się coś.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 flagi pliku dla synchronizowanie, nie musimy Powiadamiaj ich za każdym razem, gdy plik aktualizacji.For example, if a user flags a file for synching, we don't need to notify them every time the file updates. Synchronizowanie pliku nie jest zdarzeniem Zaskakujące, ani nie wymaga natychmiastowej interwencji użytkownika.File synching is not a surprising event, nor does it require the user's immediate attention. Użytkownicy oczekują tylko plików powinny być zawsze aktualne, gdy zaproszenie zostanie otwarte.Users just expect the file to be up-to-date when they open it.

W przypadkach, taka jak powyższa z systemem iOS umożliwia wysyłanie powiadomień wypychanych do wysłania dyskretnie — 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ć powiadomienia regularne do jednej dyskretnej, należy po prostu usunięcie alertu z ładunek 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ększa różnica między normalnym i dyskretnej powiadomienia z perspektywy dewelopera jest możliwość dyskretnej wypchnięć częstość jest ograniczona.The biggest difference between normal and silent notifications from a developer perspective is that silent pushes are rate limited. APNs zostanie opóźnione dostarczanie wypchnięć w trybie dyskretnym na urządzeniu, jeśli szybkość wypychania staje się zbyt wysoka.APNs will delay the delivery of silent pushes to the device if the push rate gets too high. To, aby upewnić się, że aplikacje nie opróżnić zasoby urządzenia za pomocą zbyt wiele powiadomień dyskretnej.This is to ensure that applications don't drain device resources with too many silent notifications.

Jednak APNs umożliwi dyskretnej powiadomienia "potwierdzeń" wraz z normalnym powiadomienia zdalne lub keep-alive odpowiedzi.However, APNs will let silent notifications "piggyback" alongside a normal Remote Notification or keep-alive response. Ponieważ regularne powiadomienia nie są współczynnik ograniczone, ich może służyć do wypychanie przechowywanych się dyskretnym powiadomienia 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:

Ważne

Apple zachęca deweloperom wysyłanie powiadomień wypychanych w trybie dyskretnym, zawsze wtedy, gdy aplikacja wymaga oraz umożliwić APNs zaplanować ich dostarczania.Apple encourages developers to send silent push notifications whenever the application requires, and let the APNs schedule their delivery.

W tej sekcji gdy Omówiliśmy już różne opcje odświeżanie zawartości w tle do uruchamiania zadań, które nie pasują do kategorii niezbędne tła.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 — przewodniki w tle w systemie iOSNext: Part 4 - iOS Backgrounding Walkthroughs