欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

如何在OpenUrl之后真正退出App? - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網(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://")!)
 
        })
 

相關案例查看更多