【问题标题】:The "prefs" URL Scheme is not working in iOS 10 (Beta 1 & 2)“prefs” URL 方案在 iOS 10(Beta 1 和 2)中不起作用
【发布时间】:2016-10-30 02:14:09
【问题描述】:

我无法让“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 吗?

标签: swift url-scheme ios10


【解决方案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,使用将导致应用程序拒绝。

【讨论】:

  • 你有源链接吗?
  • stackoverflow.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)
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 2017-05-16
        • 2012-03-13
        • 2016-10-23
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多