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)
}}
要强制您的应用进入后台,您可以合法地通过URL将另一个应用(如Safari)启动到前台。 参见:how to open an URL in Swift3 UIApplication.shared.open() (and the older openURL) are a documented public APIs. 如果您设置了exits-on-suspend plist密钥,通过URL打开另一个应用也会杀死您的应用。此密钥的使用是app plist密钥的记录合法使用,可供任何app“合法”使用。 此外,如果您的应用程序出于某种不礼貌的原因,继续在后台分配和污染大量内存,而不响应内存警告,操作系统很可能会杀死它。
6条答案
按热度按时间tf7tbtn21#
当一个app启动时,系统调用UIApplicationMain函数;在它的其他任务中,这个函数创建一个单例UIApplication对象。然后,通过调用sharedApplication类方法来访问该对象。
要正常退出(iOS开发者库明确警告您不要使用exit(0),因为这会被记录为崩溃),您可以使用:
例如,当用户摇动设备时,我的应用程序退出。在ViewController.swift中:
lsmepo6l2#
Swift 4:
编辑:值得一提的是,在iOS 12中有一个错误,如果应用程序在发送暂停操作后从后台返回,则会阻止网络连接。
r8uurelv3#
为此,您应该使用以下代码
rkkpypqq4#
要强制您的应用进入后台,您可以合法地通过URL将另一个应用(如Safari)启动到前台。
参见:how to open an URL in Swift3
UIApplication.shared.open() (and the older openURL) are a documented public APIs.
如果您设置了exits-on-suspend plist密钥,通过URL打开另一个应用也会杀死您的应用。此密钥的使用是app plist密钥的记录合法使用,可供任何app“合法”使用。
此外,如果您的应用程序出于某种不礼貌的原因,继续在后台分配和污染大量内存,而不响应内存警告,操作系统很可能会杀死它。
3pmvbmvn5#
如何设置info.plist?
您可以在info.plist中使用编辑器设置“Application doesn't run in background”true。
或者用代码编辑器添加这几行。
1u4esq0p6#
除了崩溃、退出你的程序或调用非官方的API,没有办法“以编程方式返回主屏幕”。苹果也不欢迎。此外,人机界面指南也涵盖了这一点。
更新:
也许苹果现在对此有不同的立场,但否决并没有使iOS8不那么真实。在这里,有人甚至引用了苹果的话:https://stackoverflow.com/a/5362887/33165
另见现已过时的Technical Q&A from Apple