1. 程式人生 > >關於iOS後臺長時間掛起的方法

關於iOS後臺長時間掛起的方法

iOS為了讓裝置儘量省電,減少不必要的開銷,保持系統流暢,因而對後臺機制採用墓碑式的“假後臺”。除了系統官方極少數程式可以真後臺,一般開發者開發出來的應用程式後臺受到以下限制:
1.使用者按Home之後,App轉入後臺進行執行,此時擁有180s後臺時間(iOS7)或者600s(iOS6)執行時間可以處理後臺操作
2.當180S或者600S時間過去之後,可以告知系統未完成任務,需要申請繼續完成,系統批准申請之後,可以繼續執行,但總時間不會超過10分鐘。
3.當10分鐘時間到之後,無論怎麼向系統申請繼續後臺,系統會強制掛起App,掛起所有後臺操作、執行緒,直到使用者再次點選App之後才會繼續執行。

當然iOS為了特殊應用也保留了一些可以實現“真後臺”的方法,摘取比較常用的:
1.VOIP
2.定位服務
3.後臺下載
4.在後臺一直播放無聲音樂(容易受到電話或者其他程式影響,所以暫未考慮)
5….更多
其中VOIP需要繫結一個Socket連結並申明給系統,系統將會在後臺接管這個連線,一旦遠端資料過來,你的App將會被喚醒10s(或者更少)的時間來處理資料,超過時間或者處理完畢,程式繼續休眠。
後臺現在是iOS7引入的新API,網上實現的程式碼比較少,博主也沒有細心去找。
由於博主要做的App需要在後臺一直執行,每隔一段時間給伺服器主動傳送訊息來保持帳號登陸狀態,因而必須確保App不被系統墓碑限制。
博主最先嚐試了很多方法,包括朋友發來的一個Demo,每180s後臺時間過期就銷燬自己然後再建立一個後臺任務,但是實際測試只有10分鐘時間。最後因為考慮到VOIP對服務端改動太大,時間又太緊,所以選擇了定位服務的方法來保持後臺。

要啟動定位服務:
1.需要引入標頭檔案:#import <CoreLocation/CoreLocation.h>
2.在AppDelegate.m中定義CLLocationManager * locationManager;作為全域性變數方便控制
3.在程式啟動初期對定位服務進行初始化:

1 2 locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self;//or whatever class you have for managing location</pre>

4.在程式轉入後臺的時候,啟動定位服務
[locationManager startUpdatingLocation];(第一次執行這個方法的時候,如果之前使用者沒有使用過App,則會彈出是否允許位置服務,關於使用者是否允許,後面程式碼中有判斷)
這樣在定位服務可用的時候,程式會不斷重新整理後臺時間,實際測試,發現後臺180s時間不斷被重新整理,達到長久後臺的目的。

但是這樣使用也有一些問題,在部分機器上面,定位服務即使開啟也可能不能重新整理後臺時間,需要完全結束程式再執行。穩定性不知道是因為程式碼原因還是系統某些機制原因。

下面貼上程式碼:
注意:程式碼中包含朋友給的demo中,180s時間後銷燬自己再建立自己的後臺方法,我自己實現過程中加入了定位服務來確保後臺能夠一直線上。
原始碼參考部分來自網上,因為翻了Google,找了很多英文方面的博文,在此感謝原作者分享。

判斷使用者是否打開了定位服務,是否禁用了該程式的定位許可權:

1 2 3 4 5 if(![CLLocationManager locationServicesEnabled] || ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied))//判斷定位服務是否開啟 { [InterfaceFuncation ShowAlertWithMessage:@"錯誤" AlertMessage:@"定位服務未開啟\n保持線上需要後臺定位服務\n請到 設定-隱私 中開啟定位服務" ButtonTitle:@"我錯了"]; return; }

AppDelegate.m原始碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

相關推薦

關於iOS臺長時間方法

iOS為了讓裝置儘量省電,減少不必要的開銷,保持系統流暢,因而對後臺機制採用墓碑式的“假後臺”。除了系統官方極少數程式可以真後臺,一般開發者開發出來的應用程式後臺受到以下限制: 1.使用者按Home之後,App轉入後臺進行執行,此時擁有180s後臺時間(iOS7)或

GCD 保持iOS app臺長時間執行

GCD的另一個用處是可以讓程式在後臺較長久的執行。 在沒有使用GCD時,當app被按home鍵退出後,app僅有最多5秒鐘的時候做一些儲存或清理資源的工作。但是在使用GCD後,app最多有10分鐘的時間在後臺長久執行。這個時間可以用來做清理本地快取,傳送統計資

iOS 程式後臺執行保持程式臺長時間執行

新增UIBackgroundModes中audio值,註冊後臺音訊應用。這個值使得應用程式可以在後臺使用可聽的背景,如音樂播放或者音訊流應用。對於支援音訊和視訊功能的應用程式也可以新增該值以保證可以繼續持續的執行流。 當audio值設定後,當你的應用程式進入後臺後,系統

臺長時間定時定位-Location實踐經驗

前言 最近接到這樣一個需求,每隔固定時間採集使用者的位置,然後再把這些資料上傳到伺服器。研究了下ios的定位功能,在後臺定時遇到了一些困難。當app進入後臺狀態,定時器就不再執行,導致無法取到使用者的位置。 在網上查了一些資料,發現有人已經實現了這個功能,它是一個Github上的第三方庫,叫Location

如何讓NSTimer變相的在臺長時間執行

我們都知道NStimer 在iPhone裡面後臺的可以執行時間是3分鐘。即使掛在前臺,只要手機開始鎖屏了。NSTimer會立即停止執行。即使如下面這樣 - (void)applicationDidEnterBackground:(UIApplication *)appli

android 臺長時間執行週期性定時任務 解決方案收集

Alarm manager 主要管理硬體時鐘。 一些與時間相關的應用,如日曆,鬧鐘等需要使用Alarm Manager的服務。Alarm manager功能相對比較簡單,相關程式碼位於 frameworks/base/core/jni/server/com_android_server_AlarmMan

為什麽在我停止網絡協議捕獲Wireshark會

設置 保存 bug 題解 org har 版本 捕獲 偏好設置 在使用Wireshark進行網絡協議捕獲和分析的完成停止的時候,Wireshark會自動掛起,你是否也遇到了這個問題?最可能的原因是Wireshark試圖在捕獲中查找IP地址以將其轉換為名稱(例如,它可以在源地

IOS 後臺程式 當程式到後臺,繼續完成定位任務

// 當應用程式掉到後臺時,執行該方法 - (void)applicationDidEnterBackground:(UIApplication *)application { } 當一個 iOS 應用被送到後臺,它的主執行緒會被暫停。你用 NSThre

IOS applicationWillResignActive

註意 sdi rri active options 啟動 前臺 lte 清理 一、掛起 當有電話進來或者鎖屏,這時你的應用程會掛起,在這時,UIApplicationDelegate委托會收到通知,調用 applicationWillResignActive 方法,你可以重

SetProcessWorkingSetSize() 方法使內存降低了很多(把內存放到交換區,其實會降低性能)——打開時間不使用軟件,會有很長時間的加載過程,原來是這個!

相關 opera UNC 情況下 縮小 ole careful however guarantee 在項目中對程序性能優化時,發現用SetProcessWorkingSetSize() 方法使內存降低了很多,於是查閱了相關的資料如下: 我的程序為什麽能夠將占用的內存

iOS 後臺的一些坑

遠程服務 為我 top 暫停 word ucc 資源 isp 沒有 特別說明: 後臺狀態:當前app如果不是作為屏幕中的第一層,呈現顯示給用戶,那麽此時app就是後臺狀態。 鎖屏(包括:當前應用下鎖屏、其他應用下鎖屏、桌面鎖屏) 用戶在使用其他應用app2,當

關於心跳ajax請求pending狀態(被),stalled時間過長的問題。涉及tcp連接異常。

.net section 解決 5.1 網絡問題 chrome瀏覽器 time iou 數據包 環境:景安快雲服務器(聽說很垃圾,但是公司買的,我也剛來),CentOS-6.8-x86_64,Apache,MySQL5.1,P

Java併發程式設計(3):執行緒、恢復與終止的正確方法(含程式碼)

JAVA大資料中高階架構 2018-11-06 14:24:56掛起和恢復執行緒Thread 的API中包含兩個被淘汰的方法,它們用於臨時掛起和重啟某個執行緒,這些方法已經被淘汰,因為它們是不安全的,不穩定的。如果在不合適的時候掛起執行緒(比如,鎖定共享資源時),此時便可能會發生死鎖條件——其他執行緒在等待該

linux後臺程序的方法

開發的時候,我們可能需要啟動某個程序,並且讓它一直keep online,但是我們電腦一旦關閉螢幕以後,就發現程序自動被終結掉,這時候我們除了nohup命令之外,還有screen和tmux可以用;nohup大家都知道nohuo xxxxxx &就可以使用了,所以我就省略nohup的介紹了,直接告訴sc

js h5頁面調App(IOS 和android)的實現方法

js h5頁面調起App(IOS 和android)的實現方法 第一次寫這個:我們的app是由原聲和h5組成的,當用戶使用瀏覽器開啟我們的頁面時我們會引導使用者使:開啟App 下載App 剛開始我是使用定時器來實現的,當用戶點選了開啟App經過一定時間之後沒有反應,則我們認為她調起App

ubuntu作業系統,虛擬機器,繼續執行虛擬機器,無網路連線,該怎麼辦?

每次把虛擬機器關機後,網路就可以通了,但是很多時候,我們需要它能在我們下次再來的時候能夠保持原樣。 我的虛擬機器是ubuntu作業系統,所以開啟終端 輸入命令:vim /etc/network/interfaces 然後發現自己沒有許可權 這時候我們給這個檔案新增可執行,讀寫,

Linux 3.15核心將啟用非同步執行緒來減少和恢復時間

Phoronix近期報道:Linux 3.15核心版本,預計將於2014年中期公佈,該版本“將有大量的ACPI和電源管理的更新”,並允許基於Linux的計算機掛起和恢復速度更快。 Linux的最新的穩定版本是3.13.6版本,Linux 3.14即將釋出,同時Linux 3.15的合併視窗即將開啟。

IOS微信6.7.4輸入框失去焦點,軟鍵盤關閉,被撐的頁面無法回退到原來正常的位置

IOS微信6.7.4輸入框失去焦點,軟鍵盤關閉後,被撐起的頁面無法回退到原來正常的位置   近期在開發微信H5頁面時碰到這個問題,如圖,軟鍵盤彈起後,若原輸入框被遮擋,頁面整體將會上移,然而當輸入框失焦,軟鍵盤收起後,頁面未恢復,這也是ios的微信版本更新6.7.4之後才

oracle update並commit誤操作,利用閃回方法 flashback可以還原上個時間點的資料

今天在生產環境更新一個選單的URL時,用update更新資料,但是忘記加上where限定條件,將所有選單的URL都更新為同一個。一時間感覺我惹大事了,慌忙找了個以前的備份表將整個表替換掉。可是備份表與真是表之間存在一些差異,結果就只能一個一個查詢並修改了。 事後才淡定下來,

【已解決】電腦無法開機

前兩天,博主的電腦遭遇了一個奇怪的現象:上午用的時候還好好的,因為需要從之前的工作繼續,所以點選了“掛起”;下午回來再開機就悲劇了,伺服器無法完成自檢,很小的聲音,也就沒有辦法開機了。今天叫了售後過來,順利解決。在這裡把解決方案分享出來。更新於2018.12.18。 斷電,開