本文会提供一种打开任意 APP 权限设置页面(比如微信的设置页面)的方案,同时,该方案能够提高打开任意设置界面的速度。

进入当前 APP 的设置页面 的方案很简单,只需要下列代码就可以进入当前 APP 的设置页面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
通过一些常见的调试技巧,我们可以推理出上面系统库方法调用背后的执行逻辑:

UIApplication 的 openURL: 方法被调用时,会先做一系列的预处理:
_shouldAttemptOpenURL: 判断是否可以打开地址:com.apple.lsd.open 系统服务判断是否需要重写地址

image
app-prefs

image
-[UIApplication _urlWithSettingsPrivateURLSchemeIfNeeded:] 重写地址app-settings

image
app-settings ,就会拼接一个新的地址:app-prefs:test.HostDemo

image
前面的处理结束后,开始通过 -[LSApplicationWorkspace openURL:] 打开地址
xpc connection
通过 -[NSXPCConnection initWithMachServiceName:options:] 创建 XPCConnection,对应的服务名是 com.apple.lsd.open

image

image
通过对 -[UIApplication openURL:] 背后的流程进行分析,我们可以得到以下两种方案打开任意 APP 的设置界面:
xpc 信息,直接调用 com.apple.lsd.opn 系统服务打开LSApplicationWorkspaceHook 间接调用 com.apple.lsd.opn 系统服务打开下面,我们尝试一下第二种方案:
@interface LSApplicationWorkspaceHook : NSObject
+ (instancetype)defaultWorkspace;
- (void)openURL:(NSURL *)url;
@end
void openWeChat() {
// 调用 LSApplicationWorkspace 的单例方法
Class aClass = NSClassFromString(@"LSApplicationWorkspace");
LSApplicationWorkspaceHook *hook = [aClass defaultWorkspace];
// 调用 LSApplicationWorkspace 的 `openURL:` 方法
[hook openURL:[NSURL URLWithString:@"app-prefs:com.tencent.xin"]];
}
代码执行效果:

本文通过分析 -[UIApplication openURL:] 的背后逻辑,提供了一种打开任意 APP 设置页面的方法。同时,我们也可以发现,该方案可以减少了很多检验逻辑,并减少了 xpc 调用,可以大幅度提升打开设置页面的速度。