Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在iOS 8中使用Swift编程退出应用程序并返回主屏幕_Iphone_Swift_Ios8 - Fatal编程技术网

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

Iphone 如何在iOS 8中使用Swift编程退出应用程序并返回主屏幕,iphone,swift,ios8,Iphone,Swift,Ios8,我正在尝试使用Swift以编程方式返回iOS8应用程序的主屏幕。不过我想继续在后台运行应用程序。有什么办法吗 提前感谢您的帮助。为此,您应该使用以下代码 import Darwin exit(0) 导入达尔文 出口(0) 除了崩溃、退出程序或调用非官方API之外,没有办法“以编程方式返回主屏幕”。两者都不受苹果欢迎。此外,人机界面指南也涵盖了这一点。启动应用程序时,系统调用UIApplicationMain函数;在其他任务中,该函数创建一个单例对象。然后,通过调用sharedApplicatio

我正在尝试使用Swift以编程方式返回iOS8应用程序的主屏幕。不过我想继续在后台运行应用程序。有什么办法吗


提前感谢您的帮助。

为此,您应该使用以下代码

import Darwin exit(0) 导入达尔文 出口(0)
除了崩溃、退出程序或调用非官方API之外,没有办法“以编程方式返回主屏幕”。两者都不受苹果欢迎。此外,人机界面指南也涵盖了这一点。

启动应用程序时,系统调用UIApplicationMain函数;在其他任务中,该函数创建一个单例对象。然后,通过调用sharedApplication类方法访问对象

要优雅地退出(iOS开发者库明确警告您不要使用退出(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)
        }}

要将你的应用程序强制放到后台,你可以合法地通过URL将另一个应用程序(如Safari)放到前台

见:

UIApplication.shared.open()(和较旧的openURL)是一个有文档记录的公共API

如果您在suspend plist键上设置了出口,那么通过URL打开另一个应用程序也会杀死您的应用程序。此密钥的使用是app plist密钥的合法使用,可供任何“合法”使用的应用程序使用

此外,如果你的应用程序出于某些不礼貌的原因,继续在后台分配并污染大量内存,而没有响应内存警告,操作系统很可能会将其杀死。

Swift 4:

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

编辑:值得一提的是,在iOS 12中,如果在发送挂起操作后将应用程序从后台带回,则存在一个会阻止网络连接的错误。

设置info.plist如何

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

或者使用代码编辑器添加这些行

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

就以编程方式将应用程序发送到后台并返回主屏幕而言,您不需要这样做。看见在保持应用程序在后台运行方面,根据应用程序在后台执行的操作,有不同的方法来实现这一点。请注意,现在返回“主屏幕”的唯一方法是关闭你的应用程序。苹果会认为这是一个崩溃,并拒绝你的应用。这太糟糕了-感谢回答代码7.3.1自动建议将“选择器(“挂起”)更改为“#选择器(NSURLSessionTask.suspend)”。似乎有效。我不知道如何检查模拟器中是否有崩溃。实际上我可以验证它是否工作。在我正在构建的秒表应用程序中,reinaH的代码成功地隐藏了秒表计时和重叠时的应用程序。双击home(主页)按钮调用该应用程序表明该应用程序继续正确计时。更新至Swift 3 UIControl().sendAction(#选择器(URLSessionTask.suspend),至:UIApplication.shared,for:nil)此解决方案只是隐藏应用程序,当您再次尝试打开它时,它将从保存状态/上次显示的屏幕激活Xcode 9.0,Swift 4:UIControl().sendAction(#选择器(NSXPCConnection.suspend),to:UIApplication.shared,for:nil)这将被视为崩溃,并可能导致应用程序被拒绝。这很好,尽管看起来有点黑客。当您调用
finish()
时,它的工作方式与android上的工作方式类似,这会关闭主活动,但如果您选择返回,它仍然可以从内存中使用。