“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 时,它会显示这在 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 app store rejection - 您的应用使用“prefs:root =”非公共URL方案