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

詳解在IOS后臺(tái)執(zhí)行

移動(dòng)開(kāi)發(fā) iOS
IOS應(yīng)用程序轉(zhuǎn)入暫停狀態(tài)。在這種狀態(tài)下,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時(shí)候從內(nèi)存中刪除。應(yīng)用程序提供特定的服務(wù),用戶可以請(qǐng)求后臺(tái)執(zhí)行時(shí)間,以提供這些服務(wù)。

在IOS后臺(tái)執(zhí)行是本文要介紹的內(nèi)容,大多數(shù)應(yīng)用程序進(jìn)入后臺(tái)狀態(tài)不久后轉(zhuǎn)入暫停狀態(tài)。在這種狀態(tài)下,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時(shí)候從內(nèi)存中刪除。應(yīng)用程序提供特定的服務(wù),用戶可以請(qǐng)求后臺(tái)執(zhí)行時(shí)間,以提供這些服務(wù)。

判斷是否支持多線程

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

聲明你需要的后臺(tái)任務(wù)

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

audio:在后臺(tái)提供聲音播放功能,包括音頻流和播放視頻時(shí)的聲音

location:在后臺(tái)可以保持用戶的位置信息

voip:在后臺(tái)使用VOIP功能

前面的每個(gè)value讓系統(tǒng)知道你的應(yīng)用程序應(yīng)該在適當(dāng)?shù)臅r(shí)候被喚醒。例如,一個(gè)應(yīng)用程序,開(kāi)始播放音樂(lè),然后移動(dòng)到后臺(tái)仍然需要執(zhí)行時(shí)間,以填補(bǔ)音頻輸出緩沖區(qū)。添加audio鍵用來(lái)告訴系統(tǒng)框架,需要繼續(xù)播放音頻,并且可以在合適的時(shí)間間隔下回調(diào)應(yīng)用程序;如果應(yīng)用程序不包括此項(xiàng),任何音頻播放在移到后臺(tái)后將停止運(yùn)行。

除了添加鍵值的方法,IOS還提供了兩種途徑使應(yīng)用程序在后臺(tái)工作:

Task completion—應(yīng)用程序可以向系統(tǒng)申請(qǐng)額外的時(shí)間去完成給定的任務(wù)

Local notifications—應(yīng)用程序可以預(yù)先安排時(shí)間執(zhí)行l(wèi)ocal notifications 傳遞

實(shí)現(xiàn)長(zhǎng)時(shí)間的后臺(tái)任務(wù)

應(yīng)用程序可以請(qǐng)求在后臺(tái)運(yùn)行以實(shí)現(xiàn)特殊的服務(wù)。這些應(yīng)用程序并不連續(xù)的運(yùn)行,但是會(huì)被系統(tǒng)框架在合適的時(shí)間喚醒,以實(shí)現(xiàn)這些服務(wù)

1、  追蹤用戶位置:略

2、在后臺(tái)播放音頻:

添加UIBackgroundModes中audio值,注冊(cè)后臺(tái)音頻應(yīng)用。這個(gè)值使得應(yīng)用程序可以在后臺(tái)使用可聽(tīng)的背景,如音樂(lè)播放或者音頻流應(yīng)用。對(duì)于支持音頻和視頻功能的應(yīng)用程序也可以添加該值以保證可以繼續(xù)持續(xù)的運(yùn)行流。

當(dāng)audio值設(shè)置后,當(dāng)你的應(yīng)用程序進(jìn)入后臺(tái)后,系統(tǒng)的多媒體框架會(huì)自動(dòng)阻止它被掛斷,但是,如果應(yīng)用程序停止播放音頻或者視頻,系統(tǒng)將掛斷應(yīng)用程序。

當(dāng)你的應(yīng)用程序在后臺(tái)時(shí),你可以執(zhí)行任意的系統(tǒng)音頻框架去初始化后臺(tái)音頻。你的應(yīng)用程序在后臺(tái)時(shí)應(yīng)該限制自身,使其執(zhí)行與工作相關(guān)的代碼,不能執(zhí)行任何與播放內(nèi)容無(wú)關(guān)的任務(wù)

由于有多個(gè)應(yīng)用程序支持音頻,前臺(tái)的應(yīng)用程序始終允許播放音頻,后臺(tái)的應(yīng)用程序也被允許播放一些音頻內(nèi)容,這取決于audio session object的設(shè)置。應(yīng)用程序應(yīng)該始終設(shè)置它們的audio session object,并小心的處理其他類型的音頻相關(guān)notifications和中斷。詳見(jiàn)audio session programming guide。

3、實(shí)現(xiàn)VOIP應(yīng)用:

VOIP程序需要穩(wěn)定的網(wǎng)絡(luò)去連接和它相關(guān)的服務(wù),這樣它才能接到來(lái)電和其他相關(guān)的數(shù)據(jù)。系統(tǒng)允許VOIP程序被掛斷并提供組件去監(jiān)聽(tīng)它們的sockets,而不是在任意時(shí)候都處于喚醒狀態(tài)。設(shè)置VOIP應(yīng)用程序如下:

A、 添加UIBackgroundModes中的VOIP鍵值

B、 為VOIP設(shè)置一個(gè)應(yīng)用程序socket

C、 在移出后臺(tái)之前,調(diào)用setKeepAliveTimeout:handler:方法去建立一個(gè)定期執(zhí)行的handler,你的應(yīng)用程序可以運(yùn)行這個(gè)handler來(lái)保持服務(wù)的連接。

D、 設(shè)置你的audio session去處理這種切換

釋義:

A、大多數(shù)VOIP應(yīng)用需要設(shè)置后臺(tái)audio 應(yīng)用去傳遞音頻,因此你應(yīng)該設(shè)置audio 和voip兩個(gè)鍵值。

B、為了使應(yīng)用程序在后臺(tái)時(shí)保持穩(wěn)定的連接,你必須tag你的主通訊socket專門應(yīng)用于VOIP,tagging這個(gè)socket來(lái)告訴系統(tǒng),它必須在你的應(yīng)用程序中斷時(shí)接管這個(gè)socket。這個(gè)切換本身對(duì)于你的應(yīng)用程序時(shí)透明的,當(dāng)新的數(shù)據(jù)到達(dá)socket的時(shí)候,系統(tǒng)會(huì)喚醒應(yīng)用程序,并將socket的控制權(quán)返回給應(yīng)用程序,這樣應(yīng)用程序就可以處理新來(lái)的數(shù)據(jù)。

你只需要tag用于voip服務(wù)的socket,這個(gè)socket用來(lái)接收來(lái)電或者其他相關(guān)的數(shù)據(jù)來(lái)保持你的VOIP服務(wù)的連接。根據(jù)收到的信息,這個(gè)socket要決定下一步的動(dòng)作。比如一個(gè)來(lái)電,你會(huì)想彈出一個(gè)本地的通知來(lái)告知用戶;對(duì)于其他不是那么關(guān)鍵的數(shù)據(jù),你可能會(huì)想悄悄的處理這些數(shù)據(jù)并讓系統(tǒng)將應(yīng)用程序重新中斷。

在IOS中,sockets是用流或者更高級(jí)的結(jié)構(gòu),設(shè)置一個(gè)VOIP的socket,你只需要在通常的設(shè)置中添加一個(gè)特殊的key來(lái)標(biāo)明這個(gè)接口是用于連接VOIP服務(wù)的,下表列出了流的接口和設(shè)置:

設(shè)置流接口用于voip
 
接口

設(shè)置

  1. NSInputStream 和NSOutputStream 

對(duì)于 Cocoa streams, 使用 setProperty:forKey: 方法添加

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

對(duì)于 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. 

(注意:當(dāng)設(shè)置socket的時(shí)候,你需要在你的主信號(hào)通道中設(shè)置合適的service type key。當(dāng)設(shè)置聲道時(shí),不需要設(shè)置這個(gè)key)

由于,VOIP應(yīng)用程序需要一直運(yùn)行以確保收到來(lái)電,所以如果程序通過(guò)一個(gè)非零的exit code退出,系統(tǒng)將自動(dòng)重啟這個(gè)應(yīng)用程序(這種退出方式可以發(fā)生在內(nèi)存壓力大時(shí)終止程序運(yùn)行)。盡管如此,中斷應(yīng)用程序會(huì)release所有的sockets,包括那個(gè)用于連接voip 服務(wù)的socket。因此,當(dāng)程序運(yùn)行時(shí),它需要一直從頭創(chuàng)建socket。

C、 為了防止斷連,voip程序需要定期被喚醒去檢查它的服務(wù)。為了容易實(shí)現(xiàn)這個(gè)行為,IOS通過(guò)使用(UIApplication setKeepAliveTimeout:handler:)方法建立一個(gè)特殊的句柄。你可以在applicationDidEnterBackground方法中建立該句柄。一旦建立,系統(tǒng)至少會(huì)在超時(shí)之前調(diào)用該句柄一次,來(lái)喚醒你的應(yīng)用程序。

這個(gè)keep-alive handler在后臺(tái)執(zhí)行,必須盡快的返回參數(shù),它有最多30秒的時(shí)間來(lái)執(zhí)行所需的任務(wù),如果這段時(shí)間內(nèi)句柄沒(méi)有返回,那么系統(tǒng)將終止應(yīng)用程序。

當(dāng)你建立了handler之后,確定應(yīng)用程序所需的最大超時(shí)。系統(tǒng)保證會(huì)在最大超時(shí)之前調(diào)用handler,但是這個(gè)時(shí)間是不確定的,所以你的handler必須在你申明的超時(shí)之前做好執(zhí)行程序的準(zhǔn)備。

D、設(shè)置audio session,詳見(jiàn)Audio Session Programming Guide.

在后臺(tái)完成有限長(zhǎng)度的任務(wù)

在被終止之前的任意時(shí)間,應(yīng)用程序會(huì)調(diào)用beginBackgroundTaskWithExpirationHandler:方法讓系統(tǒng)給出額外的時(shí)間來(lái)完成一些需要在后臺(tái)長(zhǎng)時(shí)間執(zhí)行的任務(wù)。(UIApplication的backgroundTimeRemaining屬性包含程序運(yùn)行的總時(shí)間)

可以使用task completion去保證那些比較重要但是需要長(zhǎng)時(shí)間運(yùn)行的程序不會(huì)由于用戶切入后臺(tái)而突然關(guān)閉。比如,你可以用這項(xiàng)功能來(lái)將用戶的信息保存到disk上或者從網(wǎng)絡(luò)下載一個(gè)重要的文件。有兩種方式來(lái)初始化這樣的任務(wù):

1、將長(zhǎng)時(shí)間運(yùn)行的重要任務(wù)用beginBackgroundTaskWithExpirationHandler:和endBackgroundTask:包裝。這樣就在程序突然切入后臺(tái)的時(shí)候保護(hù)了這些任務(wù)不被中斷。

2、當(dāng)你的應(yīng)用程序委托applicationDidEnterBackground:方法被調(diào)用時(shí)再啟動(dòng)任務(wù)

中的兩個(gè)方法必須是一一對(duì)應(yīng)的,endBackgroundTask:方法告訴系統(tǒng)任務(wù)已經(jīng)完成,程序在此時(shí)可以被終止。由于應(yīng)用程序只有有限的時(shí)間去完成后臺(tái)任務(wù),你必須在超時(shí)或系統(tǒng)將要終止這個(gè)程序之前調(diào)用這個(gè)方法。為了避免被終止,你也可以在一個(gè)任務(wù)開(kāi)始的時(shí)候提供一個(gè)expiration handler和endBackgroundTask:方法。(可以查看backgroundTimeRemaining屬性來(lái)確定還剩多少時(shí)間)。

一個(gè)程序可以同時(shí)提供多個(gè)任務(wù),每當(dāng)你啟動(dòng)一個(gè)任務(wù)的時(shí)候,beginBackgroundTaskWithExpirationHandler:方法將返回一個(gè)獨(dú)一無(wú)二的handler去識(shí)別這個(gè)任務(wù)。你必須在endBackgroundTask:方法中傳遞相同的handler來(lái)終止該任務(wù)。

  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變量是一個(gè)類的成員變量,存儲(chǔ)著指向該后臺(tái)任務(wù)標(biāo)示的指針。

在expriation handler中,可以添加關(guān)閉任務(wù)所需的代碼。盡管如此,加入的代碼不能執(zhí)行太長(zhǎng)的時(shí)間,當(dāng)expriation handler被調(diào)用的時(shí)候,該程序已經(jīng)非常接近被關(guān)閉,所以只有極短的時(shí)間來(lái)清除狀態(tài)信息并終止任務(wù)。

安排Local Notification的傳遞

UILocalNotification類提供了一種方法來(lái)傳遞local notifications。和push notifications需要設(shè)置remote server不同,local notifications 在程序中安排并在當(dāng)前的設(shè)備上執(zhí)行。滿足如下條件可以使用該能力:

1、一個(gè)基于時(shí)間的程序,可以在將來(lái)特定的時(shí)間讓程序post 一個(gè)alert,比如鬧鐘

2、一個(gè)在后臺(tái)運(yùn)行的程序,post 一個(gè)local notification去引起用戶的注意

為了安排local notification 的傳遞,需要?jiǎng)?chuàng)建一個(gè)UILocalNotification的實(shí)例,并設(shè)置它,使用UIApplication類方法來(lái)安排它。Local notification對(duì)象包含了所要傳遞的類型(sound,alert,或者badge)和時(shí)間何時(shí)呈現(xiàn)) 。UIApplication類方法提供選項(xiàng)去確定是立即傳遞還是在指定的時(shí)間傳遞。

  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個(gè) local notifications active at any given time, any of which can be configured to repeat at a specified interval.)如果在調(diào)用該notification的時(shí)候,程序已經(jīng)處于前臺(tái),那么application:didReceiveLocalNotification:方法將取而代之。

小結(jié):關(guān)于詳解在IOS后臺(tái)執(zhí)行的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2023-11-25 09:30:13

Android后臺(tái)任務(wù)

2023-11-27 19:32:25

Android

2020-06-18 07:49:47

Linux終端程序

2018-09-12 21:25:15

iOSAppcrash

2023-09-21 10:55:51

MysqlSQL語(yǔ)句

2024-10-11 17:13:14

SQL數(shù)據(jù)庫(kù)查詢數(shù)據(jù)庫(kù)

2020-09-21 05:53:28

Linux命令&

2014-07-17 14:51:52

2015-06-24 10:06:09

iOS 9適配后臺(tái)

2011-08-02 11:07:42

iOS開(kāi)發(fā) UIWebView

2011-08-03 09:26:49

2009-03-03 11:51:54

微軟數(shù)據(jù)庫(kù)ACCESS

2019-08-30 07:24:16

2010-04-29 14:06:40

Oracle SQL

2011-08-24 10:31:10

Oracle數(shù)據(jù)庫(kù)進(jìn)程后臺(tái)進(jìn)程

2011-08-17 14:30:34

iOS開(kāi)發(fā)窗口

2015-07-09 13:47:37

IOSFMDB

2017-01-19 21:54:10

iOS布局框架Masonry

2011-07-26 17:31:52

iOS 設(shè)計(jì)模式

2011-08-17 14:20:21

IOS開(kāi)發(fā)GraphicsCon
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩一级免费电影 | 国产区在线观看 | 一级毛片色一级 | 香蕉久久网 | 精品九九 | 黄网站在线播放 | 欧美一级黄带 | 日韩精品无码一区二区三区 | 亚洲精品日韩在线观看 | 中文字幕在线播放第一页 | 91精品免费 | 亚洲av毛片 | 日韩在线看片 | 中文字幕在线免费视频 | 亚洲a一区 | 亚洲成人日韩 | 国产欧美日韩 | 一区二区中文字幕 | 日本电影免费完整观看 | 亚洲情综合五月天 | 91av视频在线播放 | 国产精品我不卡 | 久久久久久国产精品免费免费男同 | 中文字幕二区 | 亚洲一区国产精品 | www.干| a成人| 日韩视频在线一区二区 | 欧美日韩成人一区二区 | 澳门永久av免费网站 | 亚洲视频二区 | 成人精品视频99在线观看免费 | 久久综合伊人 | 一区二区三区小视频 | 视频在线观看亚洲 | 人人射人人插 | 日本精品免费 | 日韩精品一区二区三区免费视频 | 中文字幕在线一区二区三区 | 综合九九 | 成人国产一区二区三区精品麻豆 |