本文会提供一种打开任意 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
调用,可以大幅度提升打开设置页面的速度。