Swift ";prefs";URL方案在iOS 10中不起作用(Beta 1和Beta 2)

Swift ";prefs";URL方案在iOS 10中不起作用(Beta 1和Beta 2),swift,url-scheme,ios10,Swift,Url Scheme,Ios10,我无法让“prefs”URL方案在iOS 10(Beta 1)中工作 它设置正确,因为同一个应用程序在iOS 9上运行良好 这是一个bug还是被重命名/删除了 代码: 更新:(测试版2) 在Beta 2中仍然不起作用 这可能是一只虫子。例如,如果你想邀请某人使用iOS 10中的GameCenter,但你没有登录iMessage,你会得到一个弹出窗口,要求你登录。但是“设置”按钮完全不起作用。您可以使用UIApplicationOpenSettingsURLString打开您自己的应用程序设置(这

我无法让“prefs”URL方案在iOS 10(Beta 1)中工作
它设置正确,因为同一个应用程序在iOS 9上运行良好

这是一个bug还是被重命名/删除了

代码:

更新:(测试版2)
在Beta 2中仍然不起作用

这可能是一只虫子。例如,如果你想邀请某人使用iOS 10中的GameCenter,但你没有登录iMessage,你会得到一个弹出窗口,要求你登录。但是“设置”按钮完全不起作用。

您可以使用
UIApplicationOpenSettingsURLString
打开您自己的应用程序设置(这从iOS 8开始提供),但是任何其他
prefs:
URL现在都被视为私有API,使用将导致应用程序被拒绝

如果有人对“灰色区域”API感兴趣,您可以使用:

//url = "prefs:root=SOMETHING"
[[LSApplicationWorkspace defaultWorkspace] openSensitiveURL:url withOptions:nil];

这会给你你想要的很好地隐藏它,它在iOS 10中工作。

您可以使用
Prefs:root=SOMETHING

iOS 10更新了设置的URL方案,您需要将“p”升格

参考:

注意:它只适用于小部件,不适用于应用程序。(iOS 10.0.2)


@Saumil Shah的解决方案在应用程序中工作,更有用。

只需将iOS 10的
prefs
替换为
App-prefs

以下代码适用于iOS 8,9,10

Swift 3.0和Xcode>=8.1

if #available(iOS 10.0, *)
{
       UIApplication.shared.openURL(URL(string: "App-Prefs:root=SOMETHING")!)
}
else
{
       UIApplication.shared.openURL(URL(string: "prefs:root=SOMETHING")!)
}
Swift 2.2

if #available(iOS 10.0, *)
{
      UIApplication.sharedApplication().openURL(NSURL(string:"App-Prefs:root=SOMETHING")!)
}
else
{        
    UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=SOMETHING")!)
}
对我有用


快乐编码对于记录,对于定位服务
App-Prefs:root=Privacy&path=Location
对我来说很有效。当我在设备上而不是模拟器上测试时

我不会列出我尝试过但没有成功的事情,这是一个很长的清单

假设位置服务已禁用或权限被拒绝或未确定的使用示例:

if !CLLocationManager.locationServicesEnabled() {
    if let url = URL(string: "App-Prefs:root=Privacy&path=LOCATION") {
        // If general location settings are disabled then open general location settings
        UIApplication.shared.openURL(url)
    }
} else {
    if let url = URL(string: UIApplicationOpenSettingsURLString) {
        // If general location settings are enabled then open location settings for the app
        UIApplication.shared.openURL(url)
    }
}

这在iOS 11上不可用,我们可以打开如下设置:

if let url = URL(string:UIApplicationOpenSettingsURLString) {
   if UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.open(url, options: [:], completionHandler: nil)
   }
}

您可能需要
LSApplicationQueriesSchemes
,自iOS9在iOS 10中删除URL方案后,哪些方案可用?找不到任何关于此的发行说明。@ClausJørgensen您知道iOS设置应用程序的LSApplicationQueriesSchemes吗?您有源链接吗?请参阅一个示例。这里还有很多其他问题,这些应用程序因为使用它而被拒绝,因为它太差劲了。除了UIApplicationOpenSettingsUrlstring之外,还有其他方法可以打开任何其他设置页面吗?请问如何隐藏?隐藏私有API并不难。了解Objective C运行时以及如何将其与字符串一起使用。然后,您可以根据需要构造或编码这些字符串。我导入LSApplicationWorkspace.h,并使用您的方法[[LSApplicationWorkspace defaultWorkspace]openSensitiveURL:[nsurlurlwithstring:@“prefs:root=LOCATION\u SERVICES”]with options:nil];当我编译到ipad时,它将显示当前受限制,不符合打开该方案的资格。日志你有没有在ipad或iphone上运行的示例,而不是在模拟器上?我正在测试模拟器上的代码可以工作,但在设备上不工作。嗯,很有趣。我确实在这个设备上运行过,它运行正常。这是在后一个贝塔。也许通用汽车发生了一些变化。我对此表示怀疑,因为苹果公司使用这个API来打开他们警报中的各种设置。你有github上的示例代码吗?我希望我能在我的设备上试用你的代码。也许那是我的密码有问题?!谢谢您好Saumil,首先谢谢您的回答,我尝试了您的“位置服务”代码,但应用程序将引导我进入设置页面而不是直接启用位置服务页面我会检查并让您知道刚刚猜到了新方案:
app Prefs:root=隐私&路径=位置
是,它应该适用于Location
App-Prefs:root=Privacy&path=Location
seam,App-Prefs:root=SOMETHING也适用于ios 9
if let url = URL(string:UIApplicationOpenSettingsURLString) {
   if UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.open(url, options: [:], completionHandler: nil)
   }
}