ios iphone 詳解在IOS後台執行

來源:互聯網
上載者:User

以下大家友情支援一下:

做了一個產品,需要人氣支援一下,android和iphone上91市場搜尋#super junior粉絲團#,或者直接到頁面下載http://m.ixingji.com/m.html?p=X16,大家幫忙捧捧場

官方文檔:http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

中文的好文章

http://www.devdiv.com/thread-47004-1-1.html

http://www.cnblogs.com/haipingwu/archive/2011/03/18/1987962.html

 iOS4 請求更多後台時間

http://blog.csdn.net/zhangao0086/article/details/6739266


在IOS後台執行是本文要介紹的內容,大多數應用程式進入後台狀態不久後轉入暫停狀態。在這種狀態下,應用程式不執行任何代碼,並有可能在任意時候從記憶體中刪除。應用程式提供特定的服務,使用者可以請求後台執行時間,以提供這些服務。

判斷是否支援多線程

UIDevice* device = [UIDevice currentDevice];  BOOL backgroundSupported = NO;  if ([device respondsToSelector:@selector(isMultitaskingSupported)])  backgroundSupported = device.multitaskingSupported; 


聲明你需要的背景工作

Info.plist中添加UIBackgroundModes索引值,它包含一個或多個string的值,包括

audio:在後台提供聲音播放功能,包括音頻流和播放視頻時的聲音

location:在後台可以保持使用者的位置資訊

voip:在後台使用VOIP功能

前面的每個value讓系統知道你的應用程式應該在適當的時候被喚醒。例如,一個應用程式,開始播放音樂,然後移動到後台仍然需要執行時間,以填補 音訊輸出緩衝區。添加audio鍵用來告訴系統架構,需要繼續播放音頻,並且可以在合適的時間間隔下回調應用程式;如果應用程式不包括此項,任何音頻播放 在移到後台後將停止運行。

除了添加索引值的方法,IOS還提供了兩種途徑使應用程式在後台工作:

Task completion—應用程式可以向系統申請額外的時間去完成給定的任務

Local notifications—應用程式可以預先安排時間執行local notifications 傳遞

實現長時間的背景工作

應用程式可以請求在後台運行以實現特殊的服務。這些應用程式並不連續的運行,但是會被系統架構在合適的時間喚醒,以實現這些服務

1.追蹤使用者位置:略

2.在背景播放音頻:

1. //後台播放AVAudioSession *session = [AVAudioSession sharedInstance];[session setActive:YES error:nil];[session setCategory:AVAudioSessionCategoryPlayback error:nil];2. 讓後台可以處理多媒體的事件[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];Remote-control events originate as commands issued by headsets and external accessories that are intended to control multimedia presented by an application. To stop the reception of remote-control events, you must call endReceivingRemoteControlEvents.3.系統進入後台運行時,讓程式可以運行一段時間。使用此方法爭取一定的時間,在程式進入後台後處理一些事情。- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handlerThis method lets your application continue to run for a period of time after it transitions to the background.your application could call this method to ensure that had enough time to transfer an important file to a remote server or at least attempt to make the transfer and note any errors. You should not use this method simply to keep your application running after it moves to the background.

3.實現VOIP應用:


在後台完成有限長度的任務

官方文檔http://developer.apple.com/library/iOS/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

在被終止之前的任意時間,應用程式會調用beginBackgroundTaskWithExpirationHandler:方法讓系統給出額外 的時間來完成一些需要在後台長時間執行的任務。(UIApplication的backgroundTimeRemaining屬性包含程式啟動並執行總時 間)

可以使用task completion去保證那些比較重要但是需要長時間啟動並執行程式不會由於使用者切入後台而突然關閉。比如,你可以用這項功能來將使用者的資訊儲存到disk上或者從網路下載一個重要的檔案。有兩種方式來初始化這樣的任務:

1、將長時間啟動並執行重要任務用beginBackgroundTaskWithExpirationHandler:和endBackgroundTask:封裝。這樣就在程式突然切入背景時候保護了這些任務不被中斷。

2、當你的應用程式委託applicationDidEnterBackground:方法被調用時再啟動任務

中的兩個方法必須是一一對應的,endBackgroundTask:方法告訴系統任務已經完成,程式在此時可以被終止。由於應用程式只有有限的時 間去完成背景工作,你必須在逾時或系統將要終止這個程式之前調用這個方法。為了避免被終止,你也可以在一個任務開始的時候提供一個expiration handler和endBackgroundTask:方法。(可以查看backgroundTimeRemaining屬性來確定還剩多少時間)。

一個程式可以同時提供多個任務,每當你啟動一個任務的時候,beginBackgroundTaskWithExpirationHandler: 方法將返回一個獨一無二的handler去識別這個任務。你必須在endBackgroundTask:方法中傳遞相同的handler來終止該任務。

Listing 4-2 Starting a background task at quit time  - (void)applicationDidEnterBackground:(UIApplication *)application  {  UIApplication* app = [UIApplication sharedApplication];  bgTask = [app beginBackgroundTaskWithExpirationHandler:^{  [app endBackgroundTask:bgTask];  bgTask = UIBackgroundTaskInvalid;  }];  // Start the long-running task and return immediately.  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,  0), ^{  // Do the work associated with the task.  [app endBackgroundTask:bgTask];  bgTask = UIBackgroundTaskInvalid;  });  } 

上述例子中,bgTask變數是一個類的成員變數,儲存著指向該背景工作標示的指標。

在expriation handler中,可以添加關閉任務所需的代碼。儘管如此,加入的代碼不能執行太長的時間,當expriation handler被調用的時候,該程式已經非常接近被關閉,所以只有極短的時間來清除狀態資訊並終止任務。

安排Local Notification的傳遞

UILocalNotification類提供了一種方法來傳遞local notifications。和push notifications需要設定remote server不同,local notifications 在程式中安排並在當前的裝置上執行。滿足如下條件可以使用該能力:

1、一個基於時間的程式,可以在將來特定的時間讓程式post 一個alert,比如鬧鐘

2、一個在後台啟動並執行程式,post 一個local notification去引起使用者的注意

為了安排local notification 的傳遞,需要建立一個UILocalNotification的執行個體,並設定它,使用UIApplication類方法來安排它。Local notification對象包含了所要傳遞的類型(sound,alert,或者badge)和時間何時呈現) 。UIApplication類方法提供選項去確定是立即傳遞還是在指定的時間傳遞

Listing 4-3 Scheduling an alarm notification  - (void)scheduleAlarmForDate:(NSDate*)theDate  {  UIApplication* app = [UIApplication sharedApplication];  NSArray* oldNotifications = [app scheduledLocalNotifications];  // Clear out the old notification before scheduling a new one.  if ([oldNotifications count] > 0)  [app cancelAllLocalNotifications];  // Create a new notification.  UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];  if (alarm)  {  alarm.fireDate = theDate;  alarm.timeZone = [NSTimeZone defaultTimeZone];  alarm.repeatInterval = 0;  alarm.soundName = @"alarmsound.caf";  alarm.alertBody = @"Time to wake up!";  [app scheduleLocalNotification:alarm];  }  } 

(可以最多包含128個 local notifications active at any given time, any of which can be configured to repeat at a specified interval.)如果在調用該notification的時候,程式已經處於前台,那麼 application:didReceiveLocalNotification:方法將取而代之。

小結:關於詳解在IOS後台執行的內容介紹完了,希望本文對你有所協助!


 

    相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.