【问题标题】:How to exit app and return to home screen in iOS 8 using Swift programming如何使用 Swift 编程在 iOS 8 中退出应用程序并返回主屏幕
【发布时间】:2014-12-18 02:42:59
【问题描述】:

我正在尝试使用 Swift 以编程方式返回 iOS8 应用程序的主屏幕。我想继续在后台运行应用程序。关于如何做到这一点的任何想法?

提前感谢您的帮助。

【问题讨论】:

  • 在以编程方式将应用程序发送到后台并返回主屏幕方面,您不需要。见stackoverflow.com/q/5360846/1271826。在保持应用程序在后台运行方面,有不同的方法可以实现这一点,具体取决于应用程序在后台执行的操作。见App Programming Guide for iOS: Background Execution
  • 还要注意,现在返回“主屏幕”的唯一方法是杀死你的应用程序。 Apple 会将此视为崩溃并拒绝您的应用。
  • 这太糟糕了 - 感谢您的回答

标签: iphone swift ios8


【解决方案1】:

应用启动时,系统调用 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)
        }}

【讨论】:

  • xcode 7.3.1 自动建议将 'Selector("suspend")' 更改为 '#selector(NSURLSessionTask.suspend)'。似乎工作。我不确定如何检查模拟器中是否发生崩溃。
  • 其实我可以验证它确实有效。在我正在构建的秒表应用程序中,reinaH 的代码在秒表计时和计时时成功隐藏了应用程序。双击主页按钮以调出应用程序,表明该应用程序继续正常计时。
  • 更新到 Swift 3 UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
  • 此解决方案只是隐藏应用程序,当您尝试再次打开它时,它将从您显示的保存状态/上一个屏幕变为活动状态
  • xcode 9.0, Swift 4: UIControl().sendAction(#selector(NSXPCConnection.suspend), to: UIApplication.shared, for: nil)
【解决方案2】:

斯威夫特 4:

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

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

【讨论】:

  • 这很棒,虽然看起来有点骇人听闻。当您调用 finish() 时,它就像在 android 上一样工作,这会关闭主要活动,但如果您选择返回,它仍然可以从内存中使用。
【解决方案3】:

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

进口达尔文 退出(0)

【讨论】:

  • 这将被视为崩溃,并可能导致应用被 Apple 拒绝
【解决方案4】:

要强制您的应用进入后台,您可以通过 URL 合法地将另一个应用(例如 Safari)启动到前台。

见:how to open an URL in Swift3

UIApplication.shared.open()(和旧的 openURL)是一个记录在案的公共 API。

如果您设置 exits-on-suspend plist 键,通过 URL 打开另一个应用程序也会杀死您的应用程序。此密钥的使用是应用 plist 密钥的合法使用记录,可供任何应用“合法”使用。

此外,如果您的应用出于某种不礼貌的原因,继续在后台分配和弄脏大量内存,而不响应内存警告,则操作系统很可能会杀死它。

【讨论】:

    【解决方案5】:

    info.plist的设置怎么样?

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

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多