iOS7 Background Fetch 的實現過程


iOS7中加入了后台獲取(Background Fetch)的特性,這個特性使得用戶在打開應用之前應用就可以執行部分代碼,比如准備數據,刷新UI等等。這個時常一般最大是30秒。

以下是設置Background Fetch的基本步驟,記錄一下。

 

1. 點擊Target下的Capabilities ->>Background Modes ->>Background fetch 打鈎。

 

2. 設置fetch最短間隔

可以直接在AppDelegate里面的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法內加上

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

UIApplicationBackgroundFetchIntervalMinimum 是告訴系統盡可能頻繁的進行Background fetch,但是這個頻率多頻繁呢?這個是系統自己決定的,開發者就無法得知啦。

即使你把 MinimumBackgroundFetchInterval 設的很小,系統也只能保證在這個時間段內程序不會被喚醒,而不是說每過這么長時間就會被喚醒。因此,開發者應該理性設置喚醒的時間,根據程序的具體情況來考慮。

 

3. 接下來就可以實現這個帶Block回調的 Background fetch 的代理方法了。

在這里我們可以進行網絡請求查看是否數據有更新。不過因為超時限制是 30秒,所以若超過這個時間,就需要使用Background Transfer Service。

我在這個方法里面寫了一個本地通知用來測試。

//-------------------------------------------------------------
#pragma mark - Background fetch related delegate
//-------------------------------------------------------------

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"我就是傳說中的Background Fetch💦");
    UILocalNotification * localNoti = [[UILocalNotification alloc] init];
    localNoti.hasAction = YES;
    //滑動來...
    NSArray * actionMsgs = @[@"查看一個巨大的秘密",@"看看小伙伴在做什么",@"看美女圖片",@"領取獎品",@"看看洪哥在做什么",@"掏錢買下一個DropBeacon",@"請世文吃飯"];
    localNoti.alertAction = [actionMsgs objectAtIndex:arc4random()%actionMsgs.count];
    localNoti.alertBody = @"我就是傳說中的Background Fetch💦";
    [[UIApplication sharedApplication] scheduleLocalNotification:localNoti];
    completionHandler(UIBackgroundFetchResultNewData);
}

 

4. 接下來就可以進行測試了。

測試的方法有兩種。

第一種可以在RunScheme的選項中勾選Launch due to a background fetch event,如下圖

 

第二種方式是選擇Xcode 菜單欄的 Debug下的 Simulate Background Fetch來將模擬器直接切換到 Background Fetch狀態,如下圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM