iOS應用的后臺任務

因為iOS系統(tǒng)的特殊性驮捍,它不像安卓、Windows等其它操作系統(tǒng)一樣羊娃,能在應用退入后臺還能啟動一些后臺任務處理一些事件。iOS系統(tǒng)在應用退到后臺槽地,也就是按下Home鍵之后迁沫,應用的所有任務會被掛起、暫停捌蚊,因此在這里對它的后臺任務方式作一些記錄集畅。
iOS系統(tǒng)或許是出于電量的考慮吧,因為iPhone手機的電池容量一直都不大缅糟,為了減小功耗挺智,所以它不允許應用退入后臺還留有活的后臺任務。當然并不是說iOS系統(tǒng)不能進行多任務處理窗宦,自iOS7之后赦颇,也有好多種能讓應用在后臺處理任務的方法。

iOS后臺發(fā)展

在一開始的iOS操作系統(tǒng)上赴涵,應用沒有后臺媒怯,按下Home鍵之后,應用就退出了髓窜,設備只能依靠蘋果的APNS與服務器連結(jié)扇苞,重新點擊啟動之后欺殿,應用重新載入;
后來的操作系統(tǒng)鳖敷,有了后臺脖苏,按下Home鍵之后,應用退到后臺定踱,幾秒之后棍潘,會被系統(tǒng)掛起,下次點擊進入崖媚,會出現(xiàn)上次退出的界面(當然在雙擊Home鍵將應用徹底殺死就不能保留數(shù)據(jù)了)亦歉,保留上次的一些操作,但是仍然不能在退入后臺做一些相應的操作畅哑。
再之后就是iOS7之后鳍徽,雖然不能真正的在后臺處理一些東西,但是調(diào)用蘋果的一些API敢课,可以在應用不打開的時候做一些后臺相應的操作阶祭。

后臺處理任務的幾種方式

UIBackgroundTaskIdentifier

這種方式不能讓應用真正的一直在后臺活下去,只能讓應用延緩被掛起的時間直秆,在應用已經(jīng)進入后臺濒募,做一些善后工作,保存一些現(xiàn)場數(shù)據(jù)圾结。
監(jiān)聽UIApplicationDidEnterBackgroundNotification通知瑰剃,或者在applicationDidEnterBackground方法中加入以下代碼。

UIApplication *application = [UIApplication  performSelector:@selector(sharedApplication)];
__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
    // Clean up any unfinished task business by marking where you
    // stopped or ending the task outright.
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

// Start the long-running task and return immediately.
[self cleanDiskWithCompletionBlock:^{
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

cleanDiskWithCompletionBlock在該方法中啟動異步線程筝野,立刻返回晌姚,在異步線程中,最后執(zhí)行完成回調(diào)的block歇竟。

Background Mode
后臺模式.png
Background Fetch

后臺應用刷新挥唠,在手機設置->通用->后臺應用刷新,打開之后焕议,應用可以在后臺不定時的刷新內(nèi)容宝磨。因為這個機制也是由蘋果統(tǒng)一管理,而且調(diào)用時間也是不確定的盅安,所以開發(fā)者很難調(diào)試系統(tǒng)什么時候會分配你時間允許你刷新內(nèi)容唤锉。
打開方法
在XCode->TARGETS->Capabilities->Background Modes
選擇Background Fetch打勾,然后在plist文件中Required background modes添加相應的字段App registers for location updates
在應用啟動的代碼中添加

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

UIApplicationBackgroundFetchIntervalMinimum
UIApplicationBackgroundFetchIntervalNever
關(guān)于刷新的兩個參數(shù)别瞭,一個是盡可能頻繁的刷新窿祥,一個是從來不刷新,刷新頻率由系統(tǒng)來分配決定蝙寨,所以可以應用在實時性不高的場合晒衩。
系統(tǒng)會在刷新應用時号胚,調(diào)用appDelegate中下邊的方法,在下邊方法中處理刷新動作浸遗。

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
//刷新數(shù)據(jù)

completionHandler(UIBackgroundFetchResultNewData);
}

UIBackgroundFetchResultNewData,//刷新到新數(shù)據(jù)
UIBackgroundFetchResultNoData,//沒有新數(shù)據(jù)
UIBackgroundFetchResultFailed//刷新失敗
通過application的屬性去查應用是否開啟后臺刷新功能backgroundRefreshStatus,返回值
UIBackgroundRefreshStatusRestricted, //< unavailable on this system due to device configuration; the user cannot enable the feature
UIBackgroundRefreshStatusDenied, //< explicitly disabled by the user for this application
UIBackgroundRefreshStatusAvailable //< enabled for this application

在實際的IOS7環(huán)境中箱亿,F(xiàn)etch事件是由系統(tǒng)管理的跛锌,app開發(fā)者無法預先知道Fetch事件達到的時機。但XCode也提供了Fetch事件的調(diào)試辦法届惋,在XCode上運行程序后髓帽,在Debug->Simulate Background Fetch.
還有一種情況是app沒有運行(不在前臺也不在后臺),被Fetch事件喚醒執(zhí)行.這種情況的測試方法如下:
Product->Scheme->Edit scheme 在Debug模式選中Options,點選Launch due to a background fetch event脑豹,運行即可

具體可以查官方一些文檔

下邊是官方說明
The system guarantees that it will not wake up your application for a background fetch more frequently than the interval provided. Set to UIApplicationBackgroundFetchIntervalMinimum to be woken as frequently as the system desires, or to UIApplicationBackgroundFetchIntervalNever (the default) to never be woken for a background fetch.
This setter will have no effect unless your application has the "fetch" UIBackgroundMode.
See the UIApplicationDelegate methodapplication:performFetchWithCompletionHandler: for more.

Remote notifications

蘋果的APNS(Apple Push Notifications Server)連結(jié)著所有的蘋果可接收推送設備郑藏,如果服務器想主動給應用發(fā)送一些消息,必須通過APNS瘩欺。這里主要記錄一些推送在后臺如何接收必盖。
在iOS7之前,推送和應用完全沒有關(guān)系俱饿,設備收到一條推送消息歌粥,應用也完全不知道,而且拍埠,收到推送之后失驶,如果不是點擊推送消息啟動的App,應用啟動之后枣购,也不會回調(diào)下邊的方法

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

所以之前嬉探,經(jīng)常需要應用啟動之后,再去后臺拉取一遍消息棉圈,防止有些數(shù)據(jù)沒有正常接收涩堤。

之后,可以推送來了之后在后臺刷新應用內(nèi)容分瘾,在Background Mode中挑勾Remote notifications,在plist中添加字段App downloads content in response to push notifications定躏,然后在要發(fā)送的數(shù)據(jù)中添加字段content-available:1,否則發(fā)送和普通方式一樣芹敌。

Location updates

后臺定位的應用現(xiàn)在也好多痊远,可以在用戶跑步或者騎行的時候開啟,在后臺記錄下應用跑步的路程氏捞。
開啟方法和上邊基本一樣碧聪,添加Background Mode,然后在info.plist文件中添加App registers for location updates字段液茎。

_locationManager = [[CLLocationManager alloc ]init];
_locationManager.delegate = self;

_locationManager.pausesLocationUpdatesAutomatically = NO;
_locationManager.allowsBackgroundLocationUpdates=YES;
[_locationManager requestAlwaysAuthorization];

然后逞姿,應用在進入后臺會回調(diào)下邊方法更新位置

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辞嗡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滞造,更是在濱河造成了極大的恐慌续室,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谒养,死亡現(xiàn)場離奇詭異挺狰,居然都是意外死亡,警方通過查閱死者的電腦和手機买窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門丰泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人始绍,你說我怎么就攤上這事瞳购。” “怎么了亏推?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵学赛,是天一觀的道長。 經(jīng)常有香客問我吞杭,道長罢屈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任篇亭,我火速辦了婚禮缠捌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘译蒂。我一直安慰自己曼月,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布柔昼。 她就那樣靜靜地躺著哑芹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捕透。 梳的紋絲不亂的頭發(fā)上聪姿,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音乙嘀,去河邊找鬼末购。 笑死,一個胖子當著我的面吹牛虎谢,可吹牛的內(nèi)容都是我干的盟榴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼婴噩,長吁一口氣:“原來是場噩夢啊……” “哼擎场!你這毒婦竟也來了羽德?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤迅办,失蹤者是張志新(化名)和其女友劉穎宅静,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站欺,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡姨夹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镊绪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡洒忧,死狀恐怖蝴韭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熙侍,我是刑警寧澤馅袁,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布崎脉,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏家制。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一衩匣、第九天 我趴在偏房一處隱蔽的房頂上張望擂仍。 院中可真熱鬧,春花似錦笑跛、人聲如沸付魔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽几苍。三九已至,卻和暖如春陈哑,著一層夾襖步出監(jiān)牢的瞬間妻坝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工惊窖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刽宪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓界酒,卻偏偏與公主長得像纠屋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盾计,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容