iOS两种通过私有api打开目标应用的方法

前言


在钟颖大神的JSBox中有个模块叫Launch Center,核心实现功能是点击图标就会跳转到目标应用(如果已安装的话),我有点儿不相信他是用正常方式实现的~???,真的很佩服他,JSBox真的是屌炸天的应用,大家可以试试(不是广告,人家根本不认识我,纯粹是崇拜)

好了,进入正题,iOS应用正儿八经的进行应用跳转的方法我就不说了,这里介绍的是两种”非正常“方法进行应用间跳转。


准备工作

1.通过应用 bundle id 打开目标应用

这个头文件中能看到这样一个函数:

- (bool)openApplicationWithBundleID:(id)arg1;

从字面意思就知道啦!通过传入一个bundle id去打开这个应用。利用NSInvocation通过构造LSApplicationWorkspace实例,调用openApplicationWithBundleID,参数就是对应的bundle id

示例代码

id LSApplication = NSClassFromString(@"LSApplicationWorkspace");
id workspace = [LSApplication bql_invokeMethod:@"defaultWorkspace"];
[workspace bql_invoke:@"openApplicationWithBundleID:" arguments:@[@"com.biqinglin.ivideo"]];
复制代码

2.通过临时注册scheme白名单打开目标应用(iOS10以后)

我们知道正常情况下,应用间跳转可通过在配置文件中增加目标应用的scheme的方式去实现,我要说的就是利用这点,只不过我是通过临时注册而非应用内配置的方式,这样就达到足够灵活的目的,不用修改任何线上代码即可实现新增哪些需要跳转的目标应用

同样的,你可以在这个头文件中发现这样一个函数:

- (void)setWhitelistedBundleIDs:(id)arg1;

示例代码

id LSApplication = NSClassFromString(@"LSApplicationRestrictionsManager");
id shared = [LSApplication bql_invokeMethod:@"sharedInstance"];
[shared bql_invoke:@"setWhitelistedBundleIDs:" arguments:@[@"com.biqinglin.ivideo"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"com.biqinglin.ivideo://"] options:@{} completionHandler:^(BOOL success) {
    // 如果!success就重新注册一下,不过我测试发现注册一次,所有app都能通过该函数唤起scheme打开
}];
复制代码

方法2很特别,讲道理应该是跳转谁,就去注册谁,但是测试发现一部设备中注册一次之后,其他所有应用都能跳转而不需要去注册了,这就极其流氓了...


以上两种方式都能灵活配置,不用修改线上代码就可以配置跳转哪些应用,这在积分墙业务中是核心功能,并且都亲测有效(成功上架到app store),虽然如此但还是希望慎用,毕竟违反了苹果爸爸的游戏规则,最后附上Demo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值