iOS跳转到系统设置里的指定子功能界面

以前做项目的时候,简单实现过在应用中点击邮箱、手机号码格式的字符串唤起手机邮件、发起拨号这样的openURL功能。

今天,看到一篇博客关于iOS应用跳转“prefs:root”无效的问题(包括iOS10),看到里面提到这种通常的做法:

NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];

在iOS 10以后被

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

代替。

(注:openURL这个api也在iOS10上过时,现在openURL:options:CompletionHandler:取代)

还提到:苹果已经不允许app跳到各个设置页面了,只能用UIApplicationOpenSettingsURLString。

可是我发现这种说法并不够严谨,对,UIApplicationOpenSettingsURLString这样是能跳转到系统设置界面的。经过我的测试,iOS 10还是能够支持跳转到具体的某个设置页面的(比如设置里的WiFi、定位服务界面这些),只是跟以前的做法不太一样了。

以前的写法是这样:

NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];
//    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }

但是现在不行了,报以下error:

下面提供解决方案:

1、首先还是得先在Info.plist文件里面配置参数:

添加 URL types 并设置一项URL Schemes为Prefs,如下图:

2、然后在我们的代码里面的写法是酱紫的:

// 我这里是跳转到“系统设置”->“隐私”->“定位服务”界面。
NSURL*url=[NSURL URLWithString:@"Prefs:root=Privacy&path=LOCATION"];

// !!!关键代码!!!跟之前的写法也不一样了!!!
Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");
    [[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:url withObject:nil];
- (void)defaultWorkspace{

}

- (BOOL)openSensitiveURL:(id)arg1 withOptions:(id)arg2{
    return YES;
}

相信是要万般细心才能发现,邪恶的是关键字符“prefs”变成了“Prefs”,是的,改变了大小写[手动鄙视一下Apple]。当然,还有关键代码的改变。