“prefs” URL 方案在 iOS 10(Beta 1 和 2)中不起作用

Posted

技术标签:

【中文标题】“prefs” URL 方案在 iOS 10(Beta 1 和 2)中不起作用【英文标题】:The "prefs" URL Scheme is not working in iOS 10 (Beta 1 & 2) 【发布时间】:2016-06-27 23:03:39 【问题描述】:

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

这是一个错误还是被重命名/删除了?

代码:

let settingsUrl = NSURL(string: "prefs:root=SOMETHING")
if let url = settingsUrl 
    UIApplication.sharedApplication().openURL(url)

更新: (Beta 2) 仍然无法在 Beta 2 中工作。 它似乎是一个错误。例如,如果您想在 iOS 10 中使用 GameCenter 邀请某人并且您没有登录 iMessage,您会收到一个弹出窗口,要求您登录。但“设置”按钮绝对没有任何作用。

【问题讨论】:

你可能需要LSApplicationQueriesSchemes,它从iOS9开始就可用 iOS 10 中是否删除了 URL-Schemes?找不到任何关于此的发行说明。 @ClausJørgensen 你知道 iOS 设置应用程序的 LSApplicationQueriesSchemes 吗? 【参考方案1】:

对于 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")!)

斯威夫特 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")!)

为我工作。

快乐编码?

【讨论】:

您好 Saumil,首先感谢您的回答,我尝试了您的“LOCATION_SERVICES”代码,但应用程序会将我导航到设置页面而不是直接启用位置服务页面 我会检查并通知您 刚刚猜到新方案:App-Prefs:root=Privacy&path=LOCATION 是的,它应该适用于位置App-Prefs:root=Privacy&path=LOCATION 接缝 App-Prefs:root=SOMETHING 也适用于 ios 9【参考方案2】:

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

【讨论】:

你有源链接吗? 见***.com/questions/38582888/… 的一个例子。这里还有很多其他问题,应用程序因使用而被拒绝 这太糟糕了。除了 UIApplicationOpenSettingsURLString 之外,还有其他方法可以打开任何其他设置页面吗?【参考方案3】:

你可以使用Prefs:root=SOMETHING

iOS 10 更新 URL Scheme for Settings,您需要将“p”大写。

参考:https://github.com/cyanzhong/app-tutorials/blob/master/schemes.md

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

@Saumil Shah 的解决方案在 App 中运行,更有用。

【讨论】:

【参考方案4】:

为了记录,定位服务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)
    

【讨论】:

【参考方案5】:

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

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

这会给你你想要的。 隐藏得很好,它适用于 iOS 10。

【讨论】:

请问如何隐藏? 隐藏私有 API 并不难。查看 Objective C 运行时以及如何将它与字符串一起使用。然后,您可以随意构造或编码这些字符串。 我导入 LSApplicationWorkspace.h,并使用你的方法 [[LSApplicationWorkspace defaultWorkspace] openSensitiveURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"] withOptions:nil];当我编译到 ipad 时,它会显示 当前受到限制并且没有资格打开 方案。日志。你有没有在 ipad 或 iphone 上运行的示例,而不是在模拟器上运行?我在测试模拟器上的代码可以运行,但是在设备上就不行了。 嗯,很有趣。我确实在设备上运行,它工作。这是在后者的测试版中。也许通用汽车发生了一些变化。我对此表示怀疑,因为 Apple 使用此 API 从他们的警报中打开各种设置。 你在github上有示例代码吗?我希望我可以在我的设备中尝试您的代码。也许那是我的代码有问题?!谢谢【参考方案6】:

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

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

【讨论】:

以上是关于“prefs” URL 方案在 iOS 10(Beta 1 和 2)中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ios prefs url 路径方案到邮件

ios app store rejection - 您的应用使用“prefs:root =”非公共URL方案

iOS 构建问题 App Store prefs:root=

IOS系统设置页面跳转

IOS 跳转到系统的url

系统设置