如何在iOS10上跳转到系统设置的位置服务?

时间:2016-10-09 05:06:32

标签: ios objective-c xcode

在我提出这个问题之前,我试过了:

  1. 使用[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=Privacy&path=LOCATION"]];它在iOS8和iOS9上运行正常,但iOS10上没有任何问题。
  2. 使用[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];它在iOS8和iOS9上也能正常工作。但是,在iOS10上,当应用程序跳转到系统设置时,系统设置会立即退出。
  3. 使用[[UIApplication sharedApplication]openURL:url options:@{}completionHandler:nil];它在iOS8和iOS9上崩溃,并且立即在iOS10上退出。
  4. 问题是我们的应用程序可以跳转到iOS10上的系统设置吗?如果是的话。如何[[UIApplication sharedApplication]openURL:url options:@{}completionHandler:nil]; options是什么意思?我们必须为options编写代码吗?

6 个答案:

答案 0 :(得分:8)

一段时间以来,只允许应用在设置应用中打开自己的设置窗格。过去曾有过各种设置网址,但最近Apple拒绝使用这些网址的应用。

您可以打开自己的应用程序设置:

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

或在Objective-C

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if (url != nil) {
    [[UIApplication sharedApplication] openURL:url options:[NSDictionary new] completionHandler:nil];
}

如果你的目标是早于10的iOS版本,那么你可能更喜欢使用较旧的,已弃用但功能正常的方法:

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if (url != nil) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [[UIApplication sharedApplication] openURL:url];
#pragma clang diagnostic pop
}

答案 1 :(得分:5)

别忘了添加网址方案: -

转到项目设置 - >信息 - >网址类型 - >添加新网址架构 - >网址架构= 首选项

之后使用此网址: -

let settingUrl =  URL(string: "App-Prefs:root=Privacy&path=LOCATION")

并使用: -

打开
      if #available(iOS 10.0, *) {
         UIApplication.shared.open(settingUrl) {
                (isOpen:Bool) in
                if !isOpen {
                    debugPrint("Error opening:\(settingUrl.absoluteString)")
                    // show error
                }
            }
      }else{ 
         if UIApplication.shared.canOpenURL(settingUrl) {
            UIApplication.shared.open(settingUrl, completionHandler: { (success) in
            print("Settings opened: \(success)") // Prints true

           })
         }
      }

享受:) ..这对我有用。

答案 2 :(得分:3)

注意:我使用这种方法已经很长时间了,但是今天(2018-9-14),我被拒绝了。

以下是我之前的回答,请勿永远使用此方法:

CGFloat systemVersion = [[UIDevice currentDevice].systemVersion floatValue];
if (systemVersion < 10) {
 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"App-Prefs:root=Privacy&path=LOCATION"]];
}else{
 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"App-Prefs:root=Privacy&path=LOCATION"]
                                          options:[NSDictionary dictionary]
                                completionHandler:nil];
}

现在我用这种方式:

if (@available(iOS 10.0, *)) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:[NSDictionary dictionary] completionHandler:nil];
} else {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

答案 3 :(得分:1)

您也可以打开"App-Prefs:root=your app bundle id"打开应用的设置中心。用户可以轻松更改应用的设置。

答案 4 :(得分:0)

感谢guy。我发现这个URL方案Prefs:root=Privacy&path=LOCATION仅在Today Widget中可用,但在包含app时没有用。

在今日小工具中,您可以试试这个:

[self.extensionContext openURL:[NSURL URLWithString:@"Prefs:root=Privacy&path=LOCATION"] completionHandler:nil];

有关系统网址架构的更多信息,您可以看到here

这就是我得到的。希望它会对你有所帮助。

答案 5 :(得分:0)

这对我有用。 iOS7〜iOS11

但是,如果您使用的是iOS11,则只能跳至应用的设置页面

        NSURL *url1 = [NSURL URLWithString:@"App-Prefs:root=Privacy&path=LOCATION"];
        NSURL *url2 = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        if (@available(iOS 11.0, *)) {
            if ([[UIApplication sharedApplication] canOpenURL:url2]){
                [[UIApplication sharedApplication] openURL:url2 options:@{} completionHandler:nil];
            }
        } else {
            if ([[UIApplication sharedApplication] canOpenURL:url1]){
                if (@available(iOS 10.0, *)) {
                    [[UIApplication sharedApplication] openURL:url1 options:@{} completionHandler:nil];
                } else {
                    [[UIApplication sharedApplication] openURL:url1];
                }
            }
        }