如何在OpenUrl之后真正退出App? - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

如何在OpenUrl之后真正退出App?

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:40


SDK并没有供给终止应用法度榜样的办法。要想终止应用法度榜样,苹不雅推荐的独一的方法是按下Home按钮。
然则Foundation框架中集成了Darwin框架,大年夜而我们可以应用C函数exit(0)来终止Application。当然这只是对于企业开辟者而言。对于小我开辟者,你如许做的独一结不雅就是,你的应用将会被苹不雅市廛拒绝。
 
UIApplication的openUrl方轨则是退出应用法度榜样的另一种办法。当你在代码中调用OpenURL办法时,你的App过程会被终止(挂起),另一个App则被唤醒。
 
当然两种退出App的机制和最终效不雅并不雷同。当你应用exit(0)退出法度榜样时,你的App并不仅仅是退出前台,法度榜样所占用的内存也被清除了——这是弗成恢复的。如不雅再次Launch这个App,iOS将从新大年夜磁盘中攫取二进制——这是一份全新的App映像。
 
openURL则不合,它仅仅是把你的法度榜样挂起,这是可恢复的——你的App仅仅是早年台退出,但后台中仍然存在着。用户可以在某个时刻“唤醒”它,于是你的App又回来了,此时应用法度榜样的状况仍然唤醒之前的状况。当然,万一你命运运限不好,iOS也会将你的App彻底大年夜内存中收受接收,一如exit(0)所做的一样——这一般是体系内存重要的时刻。
 
这两种办法在某些时刻可能须要并存。例如,我们想在App退出之前,唤醒另一个App,比如Safari。同时我们欲望本身的App是真正的“退出”,收受接收App的所有内存。
这是一个“悖论”。因为无论exit(0)照样openURL,一旦履行之后,操作体系就会终止过程的履行。只要履行二者中的任何一句语句,别的一个语句就无法履行——因为过程已经终止了。
 
但在某种情况下,经由过程对iOS多义务机制的奇妙应用,这个悖论倒是真实成立的。
例如,我们可以应用如下O-C代率攀来实现这个目标:
 
[self performSelector:@selector(exitApp)withObject:nil afterDelay:0.5];
[[UIApplication sharedApplication]openURL:
[NSURLURLWithString:@"appScheme://"]];
 
exitApp办法实际上就是一句代码exit(0)。
如许二者就实现并存了。
起首,我们让exit(0)延迟0.5秒再履行,而在此之前openURL当然早就履行完了。
performSelector:afterDelay办法将会调剂一个义务在某个时光后履行。当然,这个时光不克不及太长,因为iOS许可app在进入后台之后仍然有一段“存活”时光,然则这个时光不克不及太长,如许即算后面的openURL办法履行后,App仍然处于存活状况,也就有机会去履行所调剂义务(即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过这个问题。
 
经由一番摸索,我发清楚明了让上述代码工作的办法,那就是将上述代码担保在新的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://")!)
 
        })
 

相关案例查看更多