前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 极致速度优化:快速打开任意 APP 的设置界面

iOS 极致速度优化:快速打开任意 APP 的设置界面

作者头像
酷酷的哀殿
发布2021-06-22 22:28:23
1.5K0
发布2021-06-22 22:28:23
举报

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

打开 APP 设置入口的流程分析

进入当前 APP 的设置页面 的方案很简单,只需要下列代码就可以进入当前 APP 的设置页面

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

通过一些常见的调试技巧,我们可以推理出上面系统库方法调用背后的执行逻辑:

UIApplicationopenURL: 方法被调用时,会先做一系列的预处理:

  1. 通过 _shouldAttemptOpenURL: 判断是否可以打开地址:
    1. 通过 com.apple.lsd.open 系统服务判断是否需要重写地址

    image

    1. 判断字符串是否等于 app-prefs

    image

  2. 随后开始通过 -[UIApplication _urlWithSettingsPrivateURLSchemeIfNeeded:] 重写地址
    1. 判断是否等于字符串 app-settings

    image

    1. 如果检测到参数是:app-settings ,就会拼接一个新的地址:app-prefs:test.HostDemo

    image

前面的处理结束后,开始通过 -[LSApplicationWorkspace openURL:] 打开地址

  1. 创建 xpc connection 通过 -[NSXPCConnection initWithMachServiceName:options:] 创建 XPCConnection,对应的服务名是 com.apple.lsd.open

image

  1. 发送信息

image

打开任意 APP 的设置界面

通过对 -[UIApplication openURL:] 背后的流程进行分析,我们可以得到以下两种方案打开任意 APP 的设置界面:

  1. 通过构造 xpc 信息,直接调用 com.apple.lsd.opn 系统服务打开
  2. 通过拼接最后的字符串,通过 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 调用,可以大幅度提升打开设置页面的速度。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 酷酷的哀殿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 打开 APP 设置入口的流程分析
  • 打开任意 APP 的设置界面
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档