共用方式為


在背景更新 Xamarin.iOS 應用程式

背景重新整理是喚醒暫停或未執行的應用程式,並使用新內容更新它的程式。 iOS 提供三個選項來重新整理背景中的內容:

  1. 區域監視重大位置變更服務 - 位置感知 API 會根據使用者位置的變更觸發背景更新。 這些 API 可以任意使用,在非位置型 iOS 6 應用程式中重新整理內容,其中其他選項無法使用。
  2. 背景擷取 (iOS 7+) - 重新整理經常更新的非關鍵內容時態方法。
  3. 遠端通知 (iOS 7+) - 接收推播通知的應用程式可以使用通知來觸發背景內容重新整理。 這個方法可用來以偶爾更新的重要、具有時間敏感性的內容進行更新

下列各節涵蓋這些選項的基本概念。

區域監視和重大位置變更

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

接下來,在 中 AppDelegate,覆寫 FinishedLaunching 方法以設定最小擷取間隔。 在此範例中,我們讓OS決定擷取新內容的頻率:

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);
}

當我們完成更新內容時,我們會呼叫具有適當狀態的完成處理程式,讓OS知道。 iOS 提供三個選項以完成處理程式狀態:

  1. UIBackgroundFetchResult.NewData - 在擷取新內容且應用程式已更新時呼叫。
  2. UIBackgroundFetchResult.NoData - 當新內容的擷取經過時呼叫,但沒有可用的內容。
  3. UIBackgroundFetchResult.Failed - 對於錯誤處理很有用,當擷取無法通過時,就會呼叫這個值。

使用背景擷取的應用程式可以呼叫 以從背景更新UI。 當使用者開啟應用程式時,UI 會是最新的,並顯示新的內容。 這也會更新應用程式的應用程式切換器快照集,讓使用者可以在應用程式有新內容時看到。

重要

呼叫之後 PerformFetch ,應用程式有大約 30 秒的時間開始下載新內容,並呼叫完成處理程式區塊。 如果花費太長的時間,應用程式將會終止。 下載媒體或其他大型檔案時, 請考慮搭配背景傳輸服務 使用背景擷取。

BackgroundFetchInterval

在上述範例程式代碼中,我們讓OS將最小擷取間隔設定為 BackgroundFetchIntervalMinimum來決定擷取新內容的頻率。 iOS 針對擷取間隔提供三個選項:

  1. BackgroundFetchIntervalNever - 告知系統不要擷取新內容。 使用此選項可在特定情況下關閉擷取,例如使用者未登入時。 這是擷取間隔的預設值。
  2. BackgroundFetchIntervalMinimum - 讓系統根據使用者模式、電池使用時間、數據使用量和其他應用程式的需求,決定擷取的頻率。
  3. BackgroundFetchIntervalCustom - 如果您知道應用程式的內容更新的頻率,您可以在每次擷取之後指定「睡眠」間隔,在此期間,應用程式將無法擷取新內容。 一旦該間隔啟動,系統會判斷何時要擷取內容。

BackgroundFetchIntervalMinimumBackgroundFetchIntervalCustom 都依賴系統來排程擷取。 此間隔是動態的,可適應裝置的需求,以及個別用戶的習慣。 例如,如果一位使用者每天早上檢查應用程式,而另一個使用者每小時檢查一次,iOS 就會確保每次開啟應用程式時,這兩個使用者的內容都是最新的。

背景擷取應該用於經常以非重要內容更新的應用程式。 對於具有重大更新的應用程式,應該使用遠端通知。 遠端通知是以背景擷取為基礎,並共用相同的完成處理程式。 接下來,我們將深入探討遠端通知。

遠端通知 (iOS 7 和更新版)

推播通知是透過Apple推播通知服務 (APNs) 從提供者傳送到裝置的 JSON 訊息。

在 iOS 6 中,傳入的推播通知會告知系統向使用者發出警示,指出應用程式中發生了一些有趣的事。 按兩下通知會將應用程式從暫停或終止的狀態提取出來,而應用程式會開始更新內容。 iOS 7 (及更新版)藉由讓應用程式有機會在通知使用者之前更新背景中的內容,以擴充一般推播通知,讓使用者可以開啟應用程式並立即呈現新的內容。

若要實作遠端通知,請編輯 Info.plist 並核取 [ 啟用背景模式遠端通知] 複選框:

Background Mode set to Enable Background Modes and Remote notifications

接下來,將 content-available 推播通知本身上的旗標設定為 1。 這可讓應用程式知道在顯示警示之前擷取新內容:

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

AppDelegateDidReceiveRemoteNotification ,覆寫 方法來檢查可用內容的通知承載,並呼叫適當的完成處理程式區塊:

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

遠端通知應該用於不頻繁的更新,內容對於應用程式的功能至關重要。 如需遠端通知的詳細資訊,請參閱 iOS 中的 Xamarin 推播通知指南。

重要

因為遠端通知中的更新機制是以背景擷取為基礎,因此應用程式必須在接收通知的 30 秒內開始下載新內容,並呼叫完成處理程式區塊,否則 iOS 將會終止應用程式。 在背景下載媒體或其他大型檔案時,請考慮將遠端通知與 背景傳輸服務 配對。

無訊息遠端通知

遠端通知是通知應用程式更新並開始擷取新內容,但在某些情況下,我們不需要通知使用者已變更某些內容。 例如,如果使用者將檔案標幟為同步處理,則每次檔案更新時,我們不需要通知檔案。 檔案同步不是令人驚訝的事件,也不需要使用者的立即注意。 使用者只要預期檔案在開啟檔案時會是最新的。

針對上述案例,iOS 允許以無訊息方式傳送推播通知,也就是沒有警示。 若要將一般通知變成無訊息通知,只需從通知承載中移除警示:

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

速率限制

從開發人員的觀點來看,一般和無訊息通知之間的最大差異在於,無訊息推播的速率有限。 如果推播速率太高,APN 會延遲將無訊息推送傳遞至裝置。 這是為了確保應用程式不會清空裝置資源與太多無訊息通知。

不過,APN 會讓無訊息通知與一般遠端通知或保持運作回應一起「回溯」。 由於一般通知的速率不受限制,因此可用來將儲存的無訊息通知從 APN 推送至裝置,如下圖所示:

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

重要

Apple 鼓勵開發人員在應用程式需要時傳送無訊息推播通知,並讓 APNs 排程其傳遞。

在本節中,我們已討論在背景重新整理內容的各種選項,以執行不符合背景必要類別的工作。 現在,讓我們看看其中一些 API 運作正常。

下一步:第 4 部分 - iOS 背景逐步解說