Background fetch

在iOS 系統當中,只有少數幾個狀況可以允許你的app 在背景做事:

  1. Audio and AirPlay
  2. Location updates
  3. Voice over IP
  4. Newsstand downloads
  5. External accessory communication
  6. Uses Bluetooth LE accessories
  7. Acts as a Bluetooth LE accessory
  8. Background fetch
  9. Remote notifications

其中,Background fetch 這個選擇,是希望你的app 在沒有使用的狀態下,也有機會可以更新資料,讓使用者下次回到你的app 時,可以看到最新的資料。

更詳細的介紹可以參考WWDC 2013 – Session 204

運行時機

Background fetch 的運行時機取決於使用者的使用習慣,交由系統自行排程,也就是說,開發者是沒辦法干涉的。

每當系統喚醒你的app 並做了一次fetch 動作,或者使用者自己打開app 的這兩種狀況,都會影響你的app 再次進行background fetch 的時機。

BackgroundFetch1

如上圖,當你設定了minimumBackgroundFetchInterval,你的app 在「被開啟」或「fetch 過」的狀態下,不會再進行下一次fetch,而在你設定的時間之後會進行下一次fetch ,時間是「隨機」。

一般來說,如果你希望你的app 頻繁的更新資料,並不需要特別設定minimumBackgroundFetchInterval,什麼狀況需要設定哪?舉例來說,根據你的統計,你的app 在15 分鐘內不可能會有新資料,那或許你可以加上15 分鐘的時間,來保證十五分鐘內不會運行Backgroun fetch,來節省Server 資源以及節省手機電量。

BackgroundFetch2

此外,如果你的使用者頻繁地打開你的app,是非常有可能不會做任何一次background fetch 的!所以請不要過度仰賴background fetch 幫你做「非常精準」的事,他只是一個補資料、抓新資料的機會。

Code example

<br />- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Custom time interval
    // NSTimeInterval timeInterval = 15 * 60;
    // [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:timeInterval];


    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];

    return YES;
}

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    // Do something you want

    completionHandler(UIBackgroundFetchResultNewData);
}

結論

團隊原本實作這個功能的人,誤用了minimumBackgroundFetchInterval 這個property,一直誤以為他可以在「特定時間內」被喚醒,結果事實是完全相反,其實文件內都寫的挺清楚的,藉這個機會稍微看了一下background fetch 的原理以及當年WWDC 的影片,也蠻不錯的。

P.S. 圖片來源:WWDC2013 Session204 畫面截圖