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

无夜之*_*之星辰 5 xcode objective-c ios

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

  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上立即退出.

问题是我们的应用程序可以跳转到iOS10上的系统设置吗?如果是的话.[[UIApplication sharedApplication]openURL:url options:@{}completionHandler:nil];如何options?这意味着什么?我们必须为此代码options

Pau*_*w11 8

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

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

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

或者在Objective-C中

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

如果您的目标是早于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
}
Run Code Online (Sandbox Code Playgroud)


Ayu*_*dav 5

别忘了添加URL方案: -

转到项目设置 - >信息 - > URL类型 - >添加新URL方案 - > URL方案= prefs

之后使用此网址: -

let settingUrl =  URL(string: "App-Prefs:root=Privacy&path=LOCATION")
Run Code Online (Sandbox Code Playgroud)

并打开使用: -

      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

           })
         }
      }
Run Code Online (Sandbox Code Playgroud)

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

  • 请不要使用它.我的应用程序刚被拒绝,因为不允许使用```Prefs:root = Privacy&path = LOCATION``` (10认同)
  • 有谁在iOS 11上测试这个?在iOS 11上不适合我 (3认同)

无夜之*_*之星辰 5

注意:我使用这种方法已经很长时间了,一切进展顺利,但是今天(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];
}
Run Code Online (Sandbox Code Playgroud)

现在,我使用这种方式:

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