ios 後臺運行 – iPhone手機開發技術文章 iPhone軟體開發教學課程

iOS在升級到4.0以後就支持瞭多任務瞭。下文將詳細介紹一下這個特性。

1、檢查設備是否支持多任務

Apple出於性能的考慮,並不是所有的iOS設備升級到iOS4以後都支持多任務,比如iPhone 3G。如果你的應用在沒有多任務特性時會出問題,為瞭保持應用的健壯性,你應該對此進行判斷並處理。你可以通過調用UIDevice對象的multitaskingSupported屬性來獲取當前設備是否支持多任務。

if(![UIDevice currentDevice].multitaskingSupported){

//不支持多任務時應做的處理

}

2、基本多任務特性

通常,當用戶按一下Home鍵,當前應用就會被進入後臺,應用處在後臺運行狀 態一小段時間後,就會進入掛起(suspend)狀態,此時應用不會再執行任何代碼。如果系統在運行其他應用時內存資源不足,這個掛起的應用甚至有可能被 系統退出,釋放內存以供活動的應用使用。隻有當用戶再次運行此應用,應用才會從掛起狀態喚醒,代碼得以繼續執行。這就是iOS4帶來的基本的多任務特性,這個特性是一般應用默認支持的,就是說你的應用不需要任何修改就能支持基本多任務特性。

既然是多任務你應該會在應用進入後臺時做一些處理,比如暫停一些界面的定時刷新或網絡請求。同時,或者你會在程序進入前臺時執行一些恢復操作。在你的應用的application delegate裡有2個消息用於處理這些消息:

– (void)applicationDidEnterBackground:(UIApplication *)application {
//進入後臺時要進行的處理
}

– (void)applicationWillEnterForeground:(UIApplication *)application {
//進入前臺時要進行的處理
}

當然你也許不會都在application delegate處理所有的事情。如果你要在其他對象中處理,那麼你就需要註冊系統通知瞭,這兩個通知分別是 UIApplicationDidEnterBackgroundNotification和 UIApplicationWillEnterForegroundNotification。

也許你需要更多的多任務特性,比如後臺播放音樂或者是後臺進行GPS跟蹤。這會是下面介紹的內容。

3、後臺播放音樂

通常,一般應用在進入後臺時,任何聲音就將會停止。這也許不是我們所想要的。要想讓自己的應用支持後臺播放,首先要修改應用的Info.plist 文件,你需要在Info.plist文件中添加UIBackgroundModes字段,該字段的值是應用支持的所有後臺模式,是一個數值類型。目前此數 組可以包含“audio”、“location”和“voip”這三個字符串常量,如果要支持後臺音樂播放,你就需要包含“audio”,其餘兩個會將在 後面講到。

同時,你也應該設置一下應用程序的Audio Sesstion。這個是必需的,如果不設置Audio Sesstion,應用就可能進入後臺時Audio Sesstion失活而停止播放。一般需要這麼設置就可以瞭:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

4、後臺GPS跟蹤

和後臺播放音樂類似,若要支持後臺GPS跟蹤,你就需要在Info.plist文件中UIBackgroundModes字段對應的數組中增加“location”字符串。

5、後臺voip支持

由於voip應用需要一個長連接到服務器,為瞭讓這類應用能正常工作,iOS中假如後臺voip支持特性。為支持這一特性,需要在Info.plist文件中UIBackgroundModes字段對應的數組中增加“voip”字符串。

此外你仍然需要配置一下你的網絡連接,以便支持後臺連接。iOS提供的網絡連接庫有幾種,下面一一說明:

如果你使用的是NSStream,如NSInputStream或NSOutputStream,需要調用setProperty:forKey:將Key為NSStreamNetworkServiceType的value設置為
NSStreamNetworkServiceTypeVoIP

如果你使用NSURLRequest,需要調用setNetworkServiceType:將網絡類型設置為NSURLNetworkServiceTypeVoIP

如果你使用CFStream,如CFReadStreamRef或CFWriteStreamRef,需要調用 CFReadStreamSetProperty或CFWriteStreamSetProperty將 kCFStreamNetworkServiceType屬性設置為kCFStreamNetworkServiceTypeVoIP。

iOS後臺播放背景音樂文件

iOS從4.0之後支持後臺播放聲音瞭。下面是實現聲音文件播放,並且用戶關閉屏幕之後仍然能夠播放聲音文件。具體的實現方法如下:

在plist文件中加入下面的字段:

聲明內容如下:

Info.plist中添加UIBackgroundModes鍵值,它包含一個或多個string的值,包括vcD4KPHA+CmF1ZGlvOtTauvPMqMzhuanJ+dL0sqW3xbmmxNyjrLD8wKjS9Ma1wfe6zbKlt8XK08a1yrG1xMn50vQ8L3A+CjxwPgpsb2NhdGlvbqO61Nq688yov8nS1LGjs9bTw7untcTOu9bD0MXPojwvcD4KPHA+CnZvaXCjutTauvPMqMq508NWT0lQuabE3DwvcD4KPHA+CiA8L3A+CjxwPgrU2rPM0PLW0MztvNOjujwvcD4KPGJsb2NrcXVvdGU+CjxwPgpBVkF1ZGlvU2Vzc2lvbiAqc2Vzc2lvbiA9IFtBVkF1ZGlvU2Vzc2lvbiBzaGFyZWRJbnN0YW5jZV07ICA8YnI+CiAgICBbc2Vzc2lvbiBzZXRBY3RpdmU6WUVTIGVycm9yOm5pbF07ICA8YnI+CiAgICBbc2Vzc2lvbiBzZXRDYXRlZ29yeTpBVkF1ZGlvU2Vzc2lvbkNhdGVnb3J5UGxheWJhY2sgZXJyb3I6bmlsXTsgPC9wPgo8L2Jsb2NrcXVvdGU+CjxwPgrJ+cP3yfnS9NTauvPMqNTL0NCho9fuuvPUy9DQs8zQ8qOsudix1bPM0PKjrMn50vTU8tTauvPMqLPJuaaypbfFoaM8L3A+CjxwPgo8YnI+CjEuIC8vuvPMqLKlt8U8YnI+CkFWQXVkaW9TZXNzaW9uICpzZXNzaW9uID0gW0FWQXVkaW9TZXNzaW9uIHNoYXJlZEluc3RhbmNlXTs8YnI+CltzZXNzaW9uIHNldEFjdGl2ZTpZRVMgZXJyb3I6bmlsXTs8YnI+CltzZXNzaW9uIHNldENhdGVnb3J5OkFWQXVkaW9TZXNzaW9uQ2F0ZWdvcnlQbGF5YmFjayBlcnJvcjpuaWxdOzwvcD4KPHA+CjIuIMjDuvPMqL/J0tS0psDttuDDvczltcTKwrz+PC9wPgo8cD4KW1tVSUFwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXSBiZWdpblJlY2VpdmluZ1JlbW90ZUNvbnRyb2xFdmVudHNdOzwvcD4KPHA+ClJlbW90ZS1jb250cm9sIGV2ZW50cyBvcmlnaW5hdGUgYXMgY29tbWFuZHMgaXNzdWVkIGJ5IGhlYWRzZXRzIGFuZCBleHRlcm5hbCBhY2Nlc3NvcmllcyB0aGF0IGFyZSBpbnRlbmRlZCB0byBjb250cm9sIG11bHRpbWVkaWEgcHJlc2VudGVkIGJ5IGFuIGFwcGxpY2F0aW9uLiBUbyBzdG9wIHRoZSByZWNlcHRpb24gb2YgcmVtb3RlLWNvbnRyb2wgZXZlbnRzLCB5b3UgbXVzdCBjYWxsIGVuZFJlY2VpdmluZ1JlbW90ZUNvbnRyb2xFdmVudHMuPC9wPgo8cD4KMy7Ptc2zvfjI67rzzKjUy9DQyrGjrMjDs8zQ8r/J0tTUy9DQ0ru2zsqxvOSho8q508O0y7e9t6jV+cih0ru2qLXEyrG85KOs1NqzzNDyvfjI67rzzKi687SmwO3Su9CpysLH6aGjPGJyPgotIChVSUJhY2tncm91bmRUYXNrSWRlbnRpZmllciliZWdpbkJhY2tncm91bmRUYXNrV2l0aEV4cGlyYXRpb25IYW5kbGVyOih2b2lkKF4pKHZvaWQpKWhhbmRsZXI8YnI+ClRoaXMgbWV0aG9kIGxldHMgeW91ciBhcHBsaWNhdGlvbiBjb250aW51ZSB0byBydW4gZm9yIGEgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgaXQgdHJhbnNpdGlvbnMgdG8gdGhlIGJhY2tncm91bmQuPGJyPgp5b3VyIGFwcGxpY2F0aW9uIGNvdWxkIGNhbGwgdGhpcyBtZXRob2QgdG8gZW5zdXJlIHRoYXQgaGFkIGVub3VnaCB0aW1lIHRvIHRyYW5zZmVyIGFuIGltcG9ydGFudCBmaWxlIHRvIGEgcmVtb3RlIHNlcnZlciBvciBhdCBsZWFzdCBhdHRlbXB0IHRvIG1ha2UgdGhlIHRyYW5zZmVyIGFuZCBub3RlIGFueSBlcnJvcnMuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIG1ldGhvZCBzaW1wbHkgdG8ga2VlcAogeW91ciBhcHBsaWNhdGlvbiBydW5uaW5nIGFmdGVyIGl0IG1vdmVzIHRvIHRoZSBiYWNrZ3JvdW5kLjwvcD4KPHA+Cjxicj4KPC9wPgo8cD4KPGJyPgo8L3A+CjxwPgo8c3Ryb25nPjIuILGzvrDS9MDWsqW3xaOs1qez1m1wMyYjMjY2ODQ7yr08L3N0cm9uZz48YnI+CtDo0qrPyLW8yOu/8rzcvLC0+sLr1tA8c3Ryb25nPiNpbXBvcnQgPEFWRm91bmRhdGlvbi9BVkZvdW5kYXRpb24uaD48L3N0cm9uZz48L3A+Cgo8aW1nIHNyYz0=”/uploadfile/2014/0117/20140117110938947.gif” alt=”復制代碼”>

NSString *musicPath = [[NSBundle mainBundle] pathForResource:@"backgrounmusic" ofType:@"mp3"];
NSURL *url = [[NSURL alloc] initFileURLWithPath:musicPath];

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
// 創建播放器
self.myBackMusic = player; //賦值給自己定義的類變量
[url release];
[player release];

[myBackMusic prepareToPlay];
[myBackMusic setVolume:1];
myBackMusic.numberOfLoops = -1; //設置音樂播放次數  -1為一直循環
if(mainMusicStatus)
{
    [myBackMusic play]; //播放
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。