【问题标题】:iOS 10 Open Settings CrashiOS 10 打开设置崩溃
【发布时间】:2017-02-09 02:30:07
【问题描述】:

因此,我们正在创建一个 iOS 应用,只需按下按钮即可打开设备的设置应用。我已经看到该方法在 iOS 10 和 Swift 3 中略有变化,所以我使用条件来检查用户在执行代码之前使用的 iOS 版本。

if let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) {

    if #available(iOS 10.0, *) {

        // iOS 10.0.

        UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)

    } else {

        // Fallback on earlier versions.

        UIApplication.shared.openURL(settingsUrl)
    }
}

这在 iOS 9 设备上运行良好,但在 iOS 10 设备上却不行。问题是,虽然应用程序会将用户发送到 iOS 10 中的设置应用程序,但它会立即崩溃而没有崩溃日志。如果我用同样的方法打开一个像谷歌这样的网站,它在 iOS 9 和 10 上都可以正常工作。我做了很多研究,似乎他们用 URL 方案改变了一些东西,但找不到任何东西修复/解决方法。

【问题讨论】:

  • 我已经在设备上独立测试了该应用程序,但它没有通过 Xcode 运行,如果这就是你的意思吗?我仍然得到相同的行为。
  • 它用于自定义键盘扩展,因此在容器应用程序中,我们只是显示一个按钮,单击该按钮时将它们直接发送到设置应用程序,而不必自己导航。它在用户有机会在设置应用程序中执行任何操作之前崩溃。这主要是一个 UX 的事情,但我们相信它非常重要。
  • 如果您的应用仍然支持 iOS 9,为什么不使用旧的 openURL 方法而不考虑 iOS 版本呢?这是完全有效和安全的。
  • 我刚刚试了一下,又遇到了同样的问题。我认为这与 iOS 10 而不是 swift 3 有关。
  • 在这里讨论过stackoverflow.com/q/8246070/1040347 在答案/cmets 中人们说在 iOS 10 上它不起作用。

标签: ios swift swift3 ios10 openurl


【解决方案1】:

我找到了一种在 iOS 中打开设置应用程序的方法,方法是向我的项目添加设置包并使用以下代码:

    let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString) as! URL
    UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)

如果您的应用程序没有自定义键盘,这似乎是您可以用来打开本机设置应用程序的唯一方法。

【讨论】:

  • 与任何键盘设置无关。此代码 sn-p 不能防止 iOS 10 上的设置应用程序崩溃。无论是模拟器还是真实设备,从任何应用程序打开设置都会崩溃。我用一个按钮创建了一个新项目,只是为了打开设置。并从导致 iOS 10 崩溃的应用程序中打开设置。仅供参考,相关线程:stackoverflow.com/questions/39659720/…
【解决方案2】:

Apple 没有正式记录自定义 URL 方案。它不再适用于 iOS 10。该应用只能将用户带到您的应用自己的设置页面。 如果您的应用在 iOS 10 中没有设置页面,它将崩溃。

您可以尝试通过“灰色区域”API打开设置页面,如下所示。但我在 Swift 中还没有成功。祝你好运!

The "prefs" URL Scheme not woring in iOS 10 (Beta 1 & 2)

【讨论】:

  • 您能指出您所指的“Apple 文档”吗?
  • 对不起,我的错。我想说我没有在他们的文档中找到自定义 URL 方案。
【解决方案3】:

打开 UIApplicationOpenSettingsURLString 会使应用程序崩溃。

我正在使用“App-Prefs:root=WIFI”网址,它工作正常。

let settingsUrl = URL(string: "App-Prefs:root=WIFI")
        if UIApplication.shared.canOpenURL(settingsUrl!) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(settingsUrl!, options: [:], completionHandler: {(success) in debugPrint("Successfully opened settings")})
            } else {
                UIApplication.shared.openURL(settingsUrl!)
            }
    }

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多