2016-09-30 46 views
10

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

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中的设置应用程序,但它会立即崩溃而不会出现崩溃日志。如果我使用相同的方法打开像Google这样的网站,它在iOS 9和10上都可以很好地工作。我做了大量的研究,看起来他们已经通过URL方案更改了一些内容,但找不到任何内容修复/解决方法。

+0

我已经独立测试的应用程序在设备上不运行Xcode时,如果这就是你的意思?我仍然得到同样的行为。 – BenSDConway

+0

这是一个自定义的键盘扩展,所以在容器应用程序中,我们只是简单地显示一个按钮,点击后直接将它们发送到设置应用程序,而不必自己在那里导航。它在用户有机会在设置应用程序中执行任何操作之前崩溃。这主要是一种用户体验,但我们相信非常重要。 – BenSDConway

+0

如果您的应用程序仍支持iOS 9,为什么不使用较旧的'openURL'方法而不考虑iOS版本?这是完全有效和安全的。 – rmaddy

回答

6

我找到了一种方法通过将设置捆绑到我的项目,并使用此代码来打开iOS设置应用程序:

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

看起来这是你可以为了打开使用的唯一途径本机设置应用程序,如果您的应用程序没有自定义键盘。

+0

这与任何键盘设置无关。此代码段不会阻止iOS 10中的设置应用崩溃。无论模拟器或实际设备如何,设置都会在从任何应用打开时崩溃。我用一个按钮创建了一个新项目,只是为了打开设置。并从应用程序中打开导致iOS 10崩溃的设置。仅供参考,相关的线程:http://stackoverflow.com/questions/39659720/open-phone-settings-when-button-is-clicked-in-my- APP-IOS-10迅速-3-问题,您能不能给点“苹果文档” – Mesbah

5

Apple没有正式记录自定义URL方案。它不再适用于iOS 10。该应用程序仅允许用户使用您的应用程序拥有设置页面。 如果在iOS 10中没有设置页面,则您的应用程序会崩溃。

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

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

+0

你是指什么? – Mesbah

+0

对不起,我的错。我想说我没有在他们的文档中找到自定义URL方案。 – User9527

0

你的代码是正确的,不用担心。这只是因为,在您的应用程序设置中没有任何内容(例如,相机访问权限或照片访问权限等任何类型的权限)。所有你需要做的是在重定向到你的应用程序设置页面之前询问任何类型的许可,然后它将完美工作。

注:您的应用没有得到坠毁,它只是将背景因为没有什么显示(您的应用设置中只包含您的许可和访问信息。)