在我提出这个问题之前,我试过了:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=Privacy&path=LOCATION"]];
它在iOS8和iOS9上运行正常,但iOS10上没有任何问题。[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
它在iOS8和iOS9上也能正常工作。但是,在iOS10上,当应用程序跳转到系统设置时,系统设置会立即退出。[[UIApplication sharedApplication]openURL:url options:@{}completionHandler:nil];
它在iOS8和iOS9上崩溃,并且立即在iOS10上退出。问题是我们的应用程序可以跳转到iOS10上的系统设置吗?如果是的话。如何[[UIApplication sharedApplication]openURL:url options:@{}completionHandler:nil];
options
是什么意思?我们必须为options
编写代码吗?
答案 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];
}
}
}