2012-07-06 121 views
1

我想爲一個簡單的測試應用程序做兩件事。iOS如何使用beginBackgroundTaskWithExpirationHandler執行任務

我被困在努力學習如何使用beginBackgroundTaskWithExpirationHandler

我想執行一個backgroundTask當用戶按下主頁按鈕(沒有任何幻想)。在9分鐘內,我想提醒用戶時間即將到期(如果可能),並允許用戶切換回應用程序以更新10分鐘。

我不需要與iOS 3向後兼容性,或4

+0

向我們展示你寫試試這個什麼代碼,應用程序將被殺死? – 2012-07-06 14:25:01

+0

它絕對不會在iOS 3上工作,因爲它不支持後臺進程。另外你爲什麼要支持iOS 3? – rckoenes 2012-07-06 14:43:35

+1

我說我DON「T想要支持iOS4或iOS3 – 2012-07-06 15:47:19

回答

3

如果您希望您的代碼在後臺繼續,那麼您需要將其包裝在後臺任務中。這也是非常重要的,你叫endBackgroundTask當你完成了 - 否則它的分配之後的時間已經到期

- (IBAction) buttonPressed: (id) sender 

     [self beingBackgroundUpdateTask]; 

     // Do your long running background thing here 

     [self endBackgroundUpdateTask]; 
    }); 
} 
- (void) beingBackgroundUpdateTask 
{ 
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [self endBackgroundUpdateTask]; 
    }]; 
} 

- (void) endBackgroundUpdateTask 
{ 
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask]; 
    self.backgroundUpdateTask = UIBackgroundTaskInvalid; 
} 
+0

沒有上述代碼去我的應用程序控制器(MainViewController.m)或應用程序委託(AppDelegate.m) – 2012-07-06 17:21:16

+0

把這一切都在視圖控制器中有按鈕 – 2012-07-06 17:31:35

+0

阿什利,裏面的函數「beingBackgroundUpdateTask」你正在調用endBackgroundUpdateTask,並且在函數buttonPressed中,你說要在這兩個函數之間執行長時間運行的任務,所以我沒有得到它。 – Ranjit 2015-01-27 10:06:44

1

將代碼放在了applicationDidEnterBackground功能在你UIApplicationDelegate。您需要設置一個UILocalNotification並安排它。您還應該在applicationWillEnterForeground中將其禁用,以免在用戶過期之前觸發該應用。

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UILocalNotification *timerNotification = [[UILocalNotification alloc] init]; 
    //set up notification with proper time and attributes 
    [[UIApplication sharedApplication] scheduleLocalNotification:timerNotification]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    [[UIApplication sharedApplication] cancelAllLocalNotifications]; 
} 

我在那裏給出的取消代碼實際上會取消所有通知。如果您有多個通知並且只想取消特定的通知,則在設置通知時,您應該爲通知的userInfo屬性指定一個鍵/值。然後,當應用程序進入的前景,通過做

NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

通過他們

和循環,檢查userInfo直到你得到你想要的得到所有活動通知列表,然後就取消一個與

[[UIApplication sharedApplication] cancelLocalNotification:whateverNotification];