成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解在IOS后臺執行

移動開發 iOS
IOS應用程序轉入暫停狀態。在這種狀態下,應用程序不執行任何代碼,并有可能在任意時候從內存中刪除。應用程序提供特定的服務,用戶可以請求后臺執行時間,以提供這些服務。

在IOS后臺執行是本文要介紹的內容,大多數應用程序進入后臺狀態不久后轉入暫停狀態。在這種狀態下,應用程序不執行任何代碼,并有可能在任意時候從內存中刪除。應用程序提供特定的服務,用戶可以請求后臺執行時間,以提供這些服務。

判斷是否支持多線程

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

聲明你需要的后臺任務

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

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

location:在后臺可以保持用戶的位置信息

voip:在后臺使用VOIP功能

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

除了添加鍵值的方法,IOS還提供了兩種途徑使應用程序在后臺工作:

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

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

實現長時間的后臺任務

應用程序可以請求在后臺運行以實現特殊的服務。這些應用程序并不連續的運行,但是會被系統框架在合適的時間喚醒,以實現這些服務

1、  追蹤用戶位置:略

2、在后臺播放音頻:

添加UIBackgroundModes中audio值,注冊后臺音頻應用。這個值使得應用程序可以在后臺使用可聽的背景,如音樂播放或者音頻流應用。對于支持音頻和視頻功能的應用程序也可以添加該值以保證可以繼續持續的運行流。

當audio值設置后,當你的應用程序進入后臺后,系統的多媒體框架會自動阻止它被掛斷,但是,如果應用程序停止播放音頻或者視頻,系統將掛斷應用程序。

當你的應用程序在后臺時,你可以執行任意的系統音頻框架去初始化后臺音頻。你的應用程序在后臺時應該限制自身,使其執行與工作相關的代碼,不能執行任何與播放內容無關的任務

由于有多個應用程序支持音頻,前臺的應用程序始終允許播放音頻,后臺的應用程序也被允許播放一些音頻內容,這取決于audio session object的設置。應用程序應該始終設置它們的audio session object,并小心的處理其他類型的音頻相關notifications和中斷。詳見audio session programming guide。

3、實現VOIP應用:

VOIP程序需要穩定的網絡去連接和它相關的服務,這樣它才能接到來電和其他相關的數據。系統允許VOIP程序被掛斷并提供組件去監聽它們的sockets,而不是在任意時候都處于喚醒狀態。設置VOIP應用程序如下:

A、 添加UIBackgroundModes中的VOIP鍵值

B、 為VOIP設置一個應用程序socket

C、 在移出后臺之前,調用setKeepAliveTimeout:handler:方法去建立一個定期執行的handler,你的應用程序可以運行這個handler來保持服務的連接。

D、 設置你的audio session去處理這種切換

釋義:

A、大多數VOIP應用需要設置后臺audio 應用去傳遞音頻,因此你應該設置audio 和voip兩個鍵值。

B、為了使應用程序在后臺時保持穩定的連接,你必須tag你的主通訊socket專門應用于VOIP,tagging這個socket來告訴系統,它必須在你的應用程序中斷時接管這個socket。這個切換本身對于你的應用程序時透明的,當新的數據到達socket的時候,系統會喚醒應用程序,并將socket的控制權返回給應用程序,這樣應用程序就可以處理新來的數據。

你只需要tag用于voip服務的socket,這個socket用來接收來電或者其他相關的數據來保持你的VOIP服務的連接。根據收到的信息,這個socket要決定下一步的動作。比如一個來電,你會想彈出一個本地的通知來告知用戶;對于其他不是那么關鍵的數據,你可能會想悄悄的處理這些數據并讓系統將應用程序重新中斷。

在IOS中,sockets是用流或者更高級的結構,設置一個VOIP的socket,你只需要在通常的設置中添加一個特殊的key來標明這個接口是用于連接VOIP服務的,下表列出了流的接口和設置:

設置流接口用于voip
 
接口

設置

  1. NSInputStream 和NSOutputStream 

對于 Cocoa streams, 使用 setProperty:forKey: 方法添加

  1. NSStreamNetworkServiceType  
  2.  屬性給   
  3. stream.   
  4. 改屬性的值設為  
  5.  NSStreamNetworkServiceTypeVoIP.  
  6. NSURLRequest 

對于 URL loading system, 使用 setNetworkServiceType:

  1. method of your NSMutableURLRequest object to set the network service  
  2. type of the request. The service type should be set to  
  3. NSURLNetworkServiceTypeVoIP. 

CFReadStreamRef和CFWriteStreamRef

  1.  For Core Foundation streams, use the CFReadStreamSetProperty or  
  2. CFWriteStreamSetProperty function to add the kCFStreamNetwork-  
  3. ServiceType property to the stream. The value for this property should be  
  4. set to kCFStreamNetworkServiceTypeVoIP. 

(注意:當設置socket的時候,你需要在你的主信號通道中設置合適的service type key。當設置聲道時,不需要設置這個key)

由于,VOIP應用程序需要一直運行以確保收到來電,所以如果程序通過一個非零的exit code退出,系統將自動重啟這個應用程序(這種退出方式可以發生在內存壓力大時終止程序運行)。盡管如此,中斷應用程序會release所有的sockets,包括那個用于連接voip 服務的socket。因此,當程序運行時,它需要一直從頭創建socket。

C、 為了防止斷連,voip程序需要定期被喚醒去檢查它的服務。為了容易實現這個行為,IOS通過使用(UIApplication setKeepAliveTimeout:handler:)方法建立一個特殊的句柄。你可以在applicationDidEnterBackground方法中建立該句柄。一旦建立,系統至少會在超時之前調用該句柄一次,來喚醒你的應用程序。

這個keep-alive handler在后臺執行,必須盡快的返回參數,它有最多30秒的時間來執行所需的任務,如果這段時間內句柄沒有返回,那么系統將終止應用程序。

當你建立了handler之后,確定應用程序所需的最大超時。系統保證會在最大超時之前調用handler,但是這個時間是不確定的,所以你的handler必須在你申明的超時之前做好執行程序的準備。

D、設置audio session,詳見Audio Session Programming Guide.

在后臺完成有限長度的任務

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

可以使用task completion去保證那些比較重要但是需要長時間運行的程序不會由于用戶切入后臺而突然關閉。比如,你可以用這項功能來將用戶的信息保存到disk上或者從網絡下載一個重要的文件。有兩種方式來初始化這樣的任務:

1、將長時間運行的重要任務用beginBackgroundTaskWithExpirationHandler:和endBackgroundTask:包裝。這樣就在程序突然切入后臺的時候保護了這些任務不被中斷。

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

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

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

  1. Listing 4-2 Starting a background task at quit time  
  2. - (void)applicationDidEnterBackground:(UIApplication *)application  
  3. {  
  4. UIApplication* app = [UIApplication sharedApplication];  
  5. bgTask = [app beginBackgroundTaskWithExpirationHandler:^{  
  6. [app endBackgroundTask:bgTask];  
  7. bgTask = UIBackgroundTaskInvalid;  
  8. }];  
  9. // Start the long-running task and return immediately.  
  10. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,  
  11. 0), ^{  
  12. // Do the work associated with the task.  
  13. [app endBackgroundTask:bgTask];  
  14. bgTask = UIBackgroundTaskInvalid;  
  15. });  

上述例子中,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類方法提供選項去確定是立即傳遞還是在指定的時間傳遞。

  1. Listing 4-3 Scheduling an alarm notification  
  2. - (void)scheduleAlarmForDate:(NSDate*)theDate  
  3. {  
  4. UIApplication* app = [UIApplication sharedApplication];  
  5. NSArray* oldNotifications = [app scheduledLocalNotifications];  
  6. // Clear out the old notification before scheduling a new one.  
  7. if ([oldNotifications count] > 0)  
  8. [app cancelAllLocalNotifications];  
  9. // Create a new notification.  
  10. UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];  
  11. if (alarm)  
  12. {  
  13. alarm.fireDate = theDate;  
  14. alarm.timeZone = [NSTimeZone defaultTimeZone];  
  15. alarm.repeatInterval = 0;  
  16. alarm.soundName = @"alarmsound.caf";  
  17. alarm.alertBody = @"Time to wake up!";  
  18. [app scheduleLocalNotification:alarm];  
  19. }  

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

小結:關于詳解在IOS后臺執行的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2023-11-27 19:32:25

Android

2023-11-25 09:30:13

Android后臺任務

2020-06-18 07:49:47

Linux終端程序

2018-09-12 21:25:15

iOSAppcrash

2024-10-11 17:13:14

SQL數據庫查詢數據庫

2023-09-21 10:55:51

MysqlSQL語句

2020-09-21 05:53:28

Linux命令&

2011-08-02 11:07:42

iOS開發 UIWebView

2011-08-03 09:26:49

2015-06-24 10:06:09

iOS 9適配后臺

2014-07-17 14:51:52

2009-03-03 11:51:54

微軟數據庫ACCESS

2010-04-29 14:06:40

Oracle SQL

2019-08-30 07:24:16

2011-08-24 10:31:10

Oracle數據庫進程后臺進程

2011-07-26 17:31:52

iOS 設計模式

2011-08-17 14:20:21

IOS開發GraphicsCon

2013-04-08 10:27:59

iOSXcode制作靜態庫

2014-07-11 09:33:24

iOS 8動作擴展

2021-07-21 16:30:38

iOSAPP架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费xxxx大片国产在线 | 日韩国产欧美 | 拍拍无遮挡人做人爱视频免费观看 | 久久手机在线视频 | 蜜桃精品噜噜噜成人av | 国产成人jvid在线播放 | 成人精品国产一区二区4080 | 国产欧美精品 | 九九色综合 | 亚洲美女视频 | 无码国模国产在线观看 | 亚洲欧美v| 国产精品久久午夜夜伦鲁鲁 | 欧美不卡一区 | 91麻豆精品国产91久久久久久 | 国产伦精品一区二区三区照片91 | 麻豆av免费观看 | 色吧色综合 | 天天插天天搞 | 成人午夜看片 | 看羞羞视频免费 | www.成人久久 | 午夜爽爽爽男女免费观看影院 | 日韩区 | 国产精品69久久久久水密桃 | 亚洲a在线观看 | 欧美精品久久久久 | 日韩精品一区二区三区视频播放 | 伊人性伊人情综合网 | 中文在线a在线 | 成人欧美一区二区三区黑人孕妇 | 久久久xx| 精品乱人伦一区二区三区 | 久久精品色欧美aⅴ一区二区 | 亚洲+变态+欧美+另类+精品 | 妞干网福利视频 | 夜夜久久 | 国产精品视频二区三区 | 九九九视频在线 | 日本一区二区视频 | 一区二区三区在线观看视频 |