知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
如何在OpenUrl之后真正退出App?
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):60
SDK并沒有供給終止應用法度榜樣的辦法。要想終止應用法度榜樣,蘋不雅推薦的獨一的方法是按下Home按鈕。
然則Foundation框架中集成了Darwin框架,大年夜而我們可以應用C函數(shù)exit(0)來終止Application。當然這只是對于企業(yè)開辟者而言。對于小我開辟者,你如許做的獨一結不雅就是,你的應用將會被蘋不雅市廛拒絕。
UIApplication的openUrl方軌則是退出應用法度榜樣的另一種辦法。當你在代碼中調(diào)用OpenURL辦法時,你的App過程會被終止(掛起),另一個App則被喚醒。
當然兩種退出App的機制和最終效不雅并不雷同。當你應用exit(0)退出法度榜樣時,你的App并不僅僅是退出前臺,法度榜樣所占用的內(nèi)存也被清除了——這是弗成恢復的。如不雅再次Launch這個App,iOS將從新大年夜磁盤中攫取二進制——這是一份全新的App映像。
openURL則不合,它僅僅是把你的法度榜樣掛起,這是可恢復的——你的App僅僅是早年臺退出,但后臺中仍然存在著。用戶可以在某個時刻“喚醒”它,于是你的App又回來了,此時應用法度榜樣的狀況仍然喚醒之前的狀況。當然,萬一你命運運限不好,iOS也會將你的App徹底大年夜內(nèi)存中收受接收,一如exit(0)所做的一樣——這一般是體系內(nèi)存重要的時刻。
這兩種辦法在某些時刻可能須要并存。例如,我們想在App退出之前,喚醒另一個App,比如Safari。同時我們欲望本身的App是真正的“退出”,收受接收App的所有內(nèi)存。
這是一個“悖論”。因為無論exit(0)照樣openURL,一旦履行之后,操作體系就會終止過程的履行。只要履行二者中的任何一句語句,別的一個語句就無法履行——因為過程已經(jīng)終止了。
但在某種情況下,經(jīng)由過程對iOS多義務機制的奇妙應用,這個悖論倒是真實成立的。
例如,我們可以應用如下O-C代率攀來實現(xiàn)這個目標:
[self performSelector:@selector(exitApp)withObject:nil afterDelay:0.5];
[[UIApplication sharedApplication]openURL:
[NSURLURLWithString:@"appScheme://"]];
exitApp辦法實際上就是一句代碼exit(0)。
如許二者就實現(xiàn)并存了。
起首,我們讓exit(0)延遲0.5秒再履行,而在此之前openURL當然早就履行完了。
performSelector:afterDelay辦法將會調(diào)劑一個義務在某個時光后履行。當然,這個時光不克不及太長,因為iOS許可app在進入后臺之后仍然有一段“存活”時光,然則這個時光不克不及太長,如許即算后面的openURL辦法履行后,App仍然處于存活狀況,也就有機會去履行所調(diào)劑義務(即exit(0))。
這段代碼在iOS 5今后都工作得很好。但不幸的是,Swift說話來了。
在Swift中,performSelector辦法不再存在。
當然,我們急速想到了另一個替代籌劃,即GCD:
var dispatchTime: dispatch_time_t =dispatch_time(
DISPATCH_TIME_NOW,Int64(0.5 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),
{
exit(0)
})
UIApplication.sharedApplication().openURL(NSURL(string:"appScheme://")!)
然而,這段代碼根本不克不及工作。原因未知,很能是一個新的Bug,但我至今沒有看到有人向蘋不雅Radar過這個問題。
經(jīng)由一番摸索,我發(fā)清楚明了讓上述代碼工作的辦法,那就是將上述代碼擔保在新的GCD異步塊中:
dispatch_async(dispatch_get_main_queue(),{()->Voidin
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW,Int64(0.5 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), {
exit(0)
})
UIApplication.sharedApplication().openURL(NSURL(string:"appScheme://")!)
})
相關案例查看更多
相關閱讀
- 云南網(wǎng)站建設開發(fā)
- 云南建設廳網(wǎng)站首頁
- 云南省建設廳網(wǎng)站官網(wǎng)
- 網(wǎng)站建設方案 doc
- 報廢車管理系統(tǒng)
- uniapp開發(fā)小程序
- 網(wǎng)站建設方法
- 云南小程序開發(fā)報價
- 汽車報廢拆解管理系統(tǒng)
- 昆明小程序公司
- 昆明做網(wǎng)站
- 云南etc微信小程序
- 云南網(wǎng)站建設方案 doc
- 網(wǎng)站收錄
- 報廢車拆解軟件
- 花農(nóng)小程序
- 網(wǎng)站建設公司網(wǎng)站
- 大理網(wǎng)站建設公司
- 汽車回收系統(tǒng)
- 云南做網(wǎng)站
- 智慧農(nóng)貿(mào)市場
- 云南網(wǎng)絡營銷
- 正規(guī)網(wǎng)站建設公司
- 網(wǎng)站建設專業(yè)品牌
- 小程序生成海報
- 云南軟件公司
- 怎么做網(wǎng)站
- 全國前十名小程序開發(fā)公司
- 海報插件
- 麗江小程序開發(fā)