背景重新整理是喚醒暫停或未執行的應用程式,並使用新內容更新它的程式。 iOS 提供三個選項來重新整理背景中的內容:
- 區域監視 和 重大位置變更服務 - 位置感知 API 會根據使用者位置的變更觸發背景更新。 這些 API 可以任意使用,在非位置型 iOS 6 應用程式中重新整理內容,其中其他選項無法使用。
- 背景擷取 (iOS 7+) - 重新整理經常更新的非關鍵內容時態方法。
- 遠端通知 (iOS 7+) - 接收推播通知的應用程式可以使用通知來觸發背景內容重新整理。 這個方法可用來以偶爾更新的重要、具有時間敏感性的內容進行更新。
下列各節涵蓋這些選項的基本概念。
區域監視和重大位置變更
iOS 提供兩個具有背景功能的位置感知 API:
- 區域監視 是設定具有界限的區域,並在用戶進入或結束區域時喚醒裝置的程式。 區域是迴圈的,而且大小可能不同。 當使用者越過區域界限時,裝置會喚醒以處理事件,通常是藉由引發通知或啟動工作。 區域監視需要 GPS,並增加電池和數據使用量。
- 「重大位置變更服務」是一種更簡單、省電選項,適用於具有行動數據無線電的裝置。 當裝置切換數據格塔時,會通知接聽重要位置變更的應用程式。 此服務可用來喚醒暫停或終止的應用程式,並提供在背景中檢查新內容的機會。 除非與 背景工作 配對,否則背景活動限製為約10秒。
應用程式不需要位置 UIBackgroundMode
才能使用這些位置感知 API。 由於 iOS 不會追蹤裝置因使用者位置變更而喚醒裝置時可執行的工作類型,因此這些 API 會提供工作來更新 iOS 6 背景中的內容。 請記住,以位置為基礎的 API 觸發背景更新會繪製在裝置資源上,而且可能會混淆不瞭解應用程式為何需要存取其位置的使用者。 實作區域監視或重大位置變更,以在尚未使用位置 API 的應用程式進行背景處理時,請使用自由裁量權。
使用位置監視進行背景處理的應用程式會在iOS 6中暴露出缺陷:如果應用程式的需求不符合背景必要類別,則其背景選項有限。 透過引進兩個新的 API, 背景擷取 和 遠端通知,iOS 7 (和更新版)為更多應用程式提供背景機會。 接下來的兩節將介紹這些新的 API。
背景擷取 (iOS 7 和更新版)
在 iOS 6 中,輸入前景的應用程式需要一段時間才能載入新內容,簡短地向使用者呈現他們已經看到的內容。 背景擷取可讓應用程式在用戶啟動應用程式之前載入新資料,並提供使用者最新的內容。
若要實作背景擷取,請編輯 Info.plist 並核取 [啟用背景模式] 和 [背景擷取] 複選框:
接下來,在 中 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 提供三個選項以完成處理程式狀態:
UIBackgroundFetchResult.NewData
- 在擷取新內容且應用程式已更新時呼叫。UIBackgroundFetchResult.NoData
- 當新內容的擷取經過時呼叫,但沒有可用的內容。UIBackgroundFetchResult.Failed
- 對於錯誤處理很有用,當擷取無法通過時,就會呼叫這個值。
使用背景擷取的應用程式可以呼叫 以從背景更新UI。 當使用者開啟應用程式時,UI 會是最新的,並顯示新的內容。 這也會更新應用程式的應用程式切換器快照集,讓使用者可以在應用程式有新內容時看到。
重要
呼叫之後 PerformFetch
,應用程式有大約 30 秒的時間開始下載新內容,並呼叫完成處理程式區塊。 如果花費太長的時間,應用程式將會終止。 下載媒體或其他大型檔案時, 請考慮搭配背景傳輸服務 使用背景擷取。
BackgroundFetchInterval
在上述範例程式代碼中,我們讓OS將最小擷取間隔設定為 BackgroundFetchIntervalMinimum
來決定擷取新內容的頻率。 iOS 針對擷取間隔提供三個選項:
BackgroundFetchIntervalNever
- 告知系統不要擷取新內容。 使用此選項可在特定情況下關閉擷取,例如使用者未登入時。 這是擷取間隔的預設值。BackgroundFetchIntervalMinimum
- 讓系統根據使用者模式、電池使用時間、數據使用量和其他應用程式的需求,決定擷取的頻率。BackgroundFetchIntervalCustom
- 如果您知道應用程式的內容更新的頻率,您可以在每次擷取之後指定「睡眠」間隔,在此期間,應用程式將無法擷取新內容。 一旦該間隔啟動,系統會判斷何時要擷取內容。
BackgroundFetchIntervalMinimum
和 BackgroundFetchIntervalCustom
都依賴系統來排程擷取。 此間隔是動態的,可適應裝置的需求,以及個別用戶的習慣。 例如,如果一位使用者每天早上檢查應用程式,而另一個使用者每小時檢查一次,iOS 就會確保每次開啟應用程式時,這兩個使用者的內容都是最新的。
背景擷取應該用於經常以非重要內容更新的應用程式。 對於具有重大更新的應用程式,應該使用遠端通知。 遠端通知是以背景擷取為基礎,並共用相同的完成處理程式。 接下來,我們將深入探討遠端通知。
遠端通知 (iOS 7 和更新版)
推播通知是透過Apple推播通知服務 (APNs) 從提供者傳送到裝置的 JSON 訊息。
在 iOS 6 中,傳入的推播通知會告知系統向使用者發出警示,指出應用程式中發生了一些有趣的事。 按兩下通知會將應用程式從暫停或終止的狀態提取出來,而應用程式會開始更新內容。 iOS 7 (及更新版)藉由讓應用程式有機會在通知使用者之前更新背景中的內容,以擴充一般推播通知,讓使用者可以開啟應用程式並立即呈現新的內容。
若要實作遠端通知,請編輯 Info.plist 並核取 [ 啟用背景模式 和 遠端通知] 複選框:
接下來,將 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);
}
}
遠端通知應該用於不頻繁的更新,內容對於應用程式的功能至關重要。 如需遠端通知的詳細資訊,請參閱 iOS 中的 Xamarin 推播通知指南。
重要
因為遠端通知中的更新機制是以背景擷取為基礎,因此應用程式必須在接收通知的 30 秒內開始下載新內容,並呼叫完成處理程式區塊,否則 iOS 將會終止應用程式。 在背景下載媒體或其他大型檔案時,請考慮將遠端通知與 背景傳輸服務 配對。
無訊息遠端通知
遠端通知是通知應用程式更新並開始擷取新內容,但在某些情況下,我們不需要通知使用者已變更某些內容。 例如,如果使用者將檔案標幟為同步處理,則每次檔案更新時,我們不需要通知檔案。 檔案同步不是令人驚訝的事件,也不需要使用者的立即注意。 使用者只要預期檔案在開啟檔案時會是最新的。
針對上述案例,iOS 允許以無訊息方式傳送推播通知,也就是沒有警示。 若要將一般通知變成無訊息通知,只需從通知承載中移除警示:
'aps' {
'content-available': 1
}
速率限制
從開發人員的觀點來看,一般和無訊息通知之間的最大差異在於,無訊息推播的速率有限。 如果推播速率太高,APN 會延遲將無訊息推送傳遞至裝置。 這是為了確保應用程式不會清空裝置資源與太多無訊息通知。
不過,APN 會讓無訊息通知與一般遠端通知或保持運作回應一起「回溯」。 由於一般通知的速率不受限制,因此可用來將儲存的無訊息通知從 APN 推送至裝置,如下圖所示:
重要
Apple 鼓勵開發人員在應用程式需要時傳送無訊息推播通知,並讓 APNs 排程其傳遞。
在本節中,我們已討論在背景重新整理內容的各種選項,以執行不符合背景必要類別的工作。 現在,讓我們看看其中一些 API 運作正常。