如何使用Swift编程在iOS 8中退出应用程序并返回主屏幕

19
我试图使用Swift编写代码,以编程方式在iOS8应用程序中返回到主屏幕。但我希望应用程序可以在后台继续运行。有没有什么好的想法?
谢谢提前帮助。

5
关于以编程方式将应用程序发送到后台并返回主屏幕,是不需要的。请参见https://dev59.com/hm435IYBdhLWcg3wigkk。关于在后台保持应用程序运行,在不同情况下有不同的实现方法,具体取决于应用程序在后台中的操作。请参阅 iOS 应用程序编程指南:后台执行 - Rob
3
请注意,目前唯一返回“主屏幕”的方法是关闭您的应用程序。苹果将视此操作为崩溃并拒绝您的应用程序。 - rckoenes
这太糟糕了 - 感谢答案 - Dave Tsay
6个回答

35
当一个应用程序启动时,系统调用UIApplicationMain函数;除了其他任务之外,这个函数还创建了一个单例UIApplication对象。之后,您可以通过调用sharedApplication类方法来访问该对象。
为了优雅地退出(iOS开发文档明确警告您不要使用exit(0),因为这会被记录为崩溃),您可以使用:
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)

例如,我的应用程序在用户晃动设备时退出。因此,在ViewController.swift中:
override func motionEnded(motion: UIEventSubtype,
    withEvent event: UIEvent?) {

        if motion == .MotionShake{

            //Comment: to terminate app, do not use exit(0) bc that is logged as a crash.

            UIControl().sendAction(Selector("suspend"), to: UIApplication.sharedApplication(), forEvent: nil)
        }}

2
Xcode 7.3.1自动建议将'Selector("suspend")'更改为'#selector(NSURLSessionTask.suspend)'。看起来可以工作。我不确定如何检查模拟器中是否有崩溃。 - rockhammer
实际上,我可以验证它确实有效。在我正在构建的秒表应用中,reinaH的代码成功地在秒表计时和分段计时时隐藏了应用程序。双击主页按钮以召回应用程序后,显示应用程序已继续正确计时。 - rockhammer
1
更新到Swift 3 UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil) - Qadir Hussain
这个解决方案只是隐藏了应用程序,当你再次尝试打开它时,它将从保存的状态/上次显示的屏幕恢复。 - Amr Angry
如果您需要强制关闭应用程序(例如更改应用程序语言)等某些情况,此解决方案将无法帮助。针对这种情况是否有任何解决方案? - vivek agravat
3
xcode 9.0,Swift 4:UIControl().sendAction(#selector(NSXPCConnection.suspend),to: UIApplication.shared,for: nil) - DmitryKanunnikoff

31

Swift 4:

UIControl().sendAction(#selector(NSXPCConnection.suspend),
                       to: UIApplication.shared, for: nil)

编辑:值得一提的是,在iOS 12中,如果应用程序在发送挂起操作后从后台返回,则会出现一个错误,导致无法连接到网络。


这很棒,尽管看起来有点像hack。当您调用finish()时,它的工作方式类似于Android上关闭主活动,但如果您选择返回,则仍可从内存中使用。 - OzzyTheGiant

8
你应该使用以下代码:
import Darwin
exit(0)

1
这将被视为崩溃,并可能导致应用程序被苹果拒绝。 - user4886069

2

如果你想让你的应用程序进入后台,可以通过使用URL合法地启动另一个应用程序(例如Safari),使其处于前台。

请参阅:如何在Swift3中打开URL

UIApplication.shared.open()和旧版本的openURL是文档化的公共API。

如果您设置了 exits-on-suspend plist关键字,通过URL打开另一个应用程序也将终止您的应用程序。该关键字的使用是app plist关键字的文档化合法用途,可供任何应用程序“合法”使用。

此外,如果您的应用程序由于某种不礼貌的原因在后台继续分配和污染大量内存而未响应内存警告,则操作系统很可能会终止它。


0

关于 info.plist 的设置怎么样?

您可以使用编辑器在 info.plist 中将“应用程序不在后台运行”设置为 true。

或者使用代码编辑器添加以下行。

    <key>UIApplicationExitsOnSuspend</key>
    <true/>

-1

除了崩溃、退出程序或调用非官方API之外,没有办法“以编程方式返回主屏幕”。这些方法都不被Apple所欢迎。此外,人机界面指南也涵盖了这一点。

更新:

也许苹果在这个问题上有不同的立场,但对于iOS8,不赞同的意见并不降低事实的真实性。这里甚至有人引用了苹果公司的评论:https://dev59.com/hm435IYBdhLWcg3wigkk#5362887

还请参阅现已过时的苹果技术问答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接