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]。当然,还有关键代码的改变。
相关推荐
冰冰的空间 2018-12-19