记一次Runtime的巧用

背景
我们的视频直播是用的大华乐橙的解决方案,而他们近期出来个新的SDK,并且对老版SDK不兼容,而这周,终于把大华乐橙的新版SDK切换了,和这一周做的新的东西,一起提交审核了,并且今天也通过审核了。然后就和大华的技术支持联系,商讨数据的迁移。突然发现,我们用的是一个开发者帐号(该帐号下面创建了也只能创建一个应用,大华给了App ID和App Secret)来开发了两个App(用户版和商家版),而旧版的SDK这样是可行的,但是新版的不行。这是因为在大华新版SDK那边请求接口的时候会验证一个安全码,这个安全码是由Bundle identifier 和 Project name组合的,他们的SDK内部会获取当前的App的Bundle identifier,heProject name,和开发者帐号创建应用时提供的安全码做比较,如果不一致,那么就直接拒绝请求。
解决过程
互相了解了情况之后,双方都有点不知所措,就像后台隆哥说的:奇葩碰奇葩了。一开始,我们这边是一直在等待大华那边出方案,看看能不能在数据库做个映射,把两个开发者帐号关联起来。但是大华那边好像不太好弄,毕竟涉及到线上数据库的操作,可以理解。但是我们这样坐以待毙下去也不行,只能想想自己这边能不能做一些事情。
首先,开始理清思路:
- 大华那边需要验证
安全码,而这个安全码又是Bundle identifier和Project name组合,我们不可能去改工程的Bundle identifier和Project name,所以,修改工程这个方法不行。 - 那么我们这边可不可以给他们返回固定的
Bundle identifier和Project name,来欺骗他们的验证,这个貌似是可以,但是这也有几个问题:- 他们的SDK是
.a静态库,所以不能改他们的代码。 - 那就只能去猜测他们可能会获取当前
Bundle identifier和Project name的方法,http://www.90168.org/在iOS中,获取Bundle identifier和Project name的方法,我知道的,也是最常用的就是:
- 他们的SDK是
1 2 |
NSString *identifier = [NSBundle mainBundle].bundleIdentifier; NSString *projectName = [[NSBundle mainBundle].infoDictionary objectForKey:(NSString *)kCFBundleNameKey]; |
所以,我猜测他们可能也是用的这个方法,那么能不能劫持他们调用这个方法,给他们返回固定的值,由于劫持函数这一方面实在是不懂,所以这个没搞头。
在谷歌上面转了一圈,突然,发现了一个词:method_exchangeImplementations.哈,Bingo.
方案确定:method_exchangeImplementations.
在SO上面看到这个词,让我灵机一动,我可不可以去替换他们用来获取Bundle identifier 和 Project name的方法,说搞就搞,我在AppDelegate.m里面写了一下代码来测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- (void)changeIdentifierAndName { method_exchangeImplementations(class_getInstanceMethod([NSBundle class], @selector(bundleIdentifier)), class_getInstanceMethod([self class], @selector(jly_bundleIdentifier))); method_exchangeImplementations(class_getInstanceMethod([NSBundle class], @selector(infoDictionary)), class_getInstanceMethod([self class], @selector(jly_bundleName))); } - (NSString *)jly_bundleIdentifier { return @"com.xiongqi.XXXXX"; } // 发现直接调用kCFBundleNameKey不行,然后就打印了这个Key,发现kCFBundleNameKey对应的是CFBundleName - (NSDictionary *)jly_bundleName { return @{@"CFBundleName":@"XXXXXXX"};// 这里简化了infoDictionary,仅仅是为了测试。 }
|
然后在didFinishLaunchingWithOptions:里面调用了changeIdentifierAndName.然后进入运行我们的App,打开店铺的直播,熟悉的画面出现在眼前,也就是我们通过Runtime来绕过了大华的所谓安全码检测!
后续
但是,这又引起了另一个问题,我们这样去替换系统的方法,会不会被苹果拒绝审核?在家shadowsocks不能用,明天去公司谷歌一下,或者就给经理说说去提交试试。然后来完善。
感想
从想法到确定方案到实现,20分钟,这件事也教会我,有些事还是要靠自己,依靠别人是行不通的!公司不缺干活的,但是需要解决问题的。
记一次Runtime的巧用的更多相关文章
- 巧记 In/hasOwnProperty/for…in/for…of/forEach区别
写在前面 上面提到的这些东西,反复的记忆,反复的忘记.现分享一种巧记方法,有需要,请参考,希望你也过目不忘. 仅提供巧记思路.仅提供巧记思路.仅提供巧记思路. 1. in 用于判断属性是否在对象上(包 ...
- “华尔街之狼”:ICO是“史上最大骗局”
勘探船进村的那个夏季,父亲从城里带回了那把手电.手电的金属外壳镀了镍,看上去和摸起来一样冰凉.父亲进城以前采了两筐枸杞子,他用它们换回了那把锃亮的东西.父亲一个人哼着<十八摸>上路,鲜红透 ...
- 深入Go的错误处理机制使用
开篇词 程序运行过程中不可避免的发生各种错误,要想让自己的程序保持较高的健壮性,那么异常,错误处理是需要考虑周全的,每个编程语言提供了一套自己的异常错误处理机制,在Go中,你知道了吗?接下来我们一起看 ...
- epclise设置tomcat方法(步骤)(菜鸟巧记二)
epclise设置tomcat 1.打开epclise→window→preferences 2.输入server,打开server→runtime environments→选择add新建 3.打开 ...
- 记一次antlr错误:ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.2ANTLR
场景:重构spark 2.1版本的sql语法.因此 需要使用antlr: 前期准备:idea安装了antlr插件(antlr的4.7.2版本) 因此在maven工程中添加了antlr的依赖: < ...
- 巧记--Css选择器
love ------> hate 即: a:link --> a:visited --> a:hover --> a:active a:link ...
- JDK和Tomcat的简单配置(菜鸟巧记一)
JDK和Tomcat的配置 1.先好安装JDK 1.1先到oracle官网下载合适自己的JDK 地址http://www.oracle.com/technetwork/java/javase/down ...
- IO流巧记图
本文特意将各种IO流的类总结到一起,作成图,方便记忆 1.流的写入和读取 2.字符输入流 3.字符输出流 4.字节输入流 5.字节输出流 6.概念杂记 * Buffered;带缓冲区的字符读取流,高效 ...
- 【算法随记七】巧用SIMD指令实现急速的字节流按位反转算法。
字节按位反转算法,在有些算法加密或者一些特殊的场合有着较为重要的应用,其速度也是一个非常关键的应用,比如一个byte变量a = 3,其二进制表示为00000011,进行按位反转后的结果即为110000 ...
随机推荐
- Android Studio新建了一个项目看不到手机界面的效果
我今天新建了一个项目,但是在这里却看不到手机的界面效果,如下图:
- 执行HQL语句出现Remember that ordinal parameters are 1-based
今天使用hibernate出个奇怪的错误,第一次碰到 Remember that ordinal parameters are 1-based! 原因是 问题发生的原因是:hql语句里不需要参数,却添 ...
- iOS中UITableView的一些设置
不可滑动: ? 1 tableView.userInteractionEnabled = NO; 也可以在storyboard中的userInteractionEnable属性设置 显示导向箭头: ? ...
- Google earth
装了Google earth之后,需要联网,才能放缩看不同精细程度的场景,除非你之前看过,在你自己的缓存中有存储. Google earth有自己的server,我们交互化的时候,server传数据给 ...
- SQL TO LINQ(Linqer神器)
此软件可以把SQL语句转换成LINQ语句 首先把Linqer下载到本地, 1.在VS中创建.dbml文件和.cs文件 打开VS,创建一个控制台项目即可,再添加一个dbml项目 2.添加连接数据库 3. ...
- Android 实现类似微信客户端朋友圈更新提示的小红点&栏目订阅
用到的类: com.jauker.widget.BadgeView 实现代码: BadgeView imageBadge = new BadgeView(getContext()); imageBad ...
- hdu1018(数位)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1018 题意:求n!的数位(即n!有多少位): 思路:对于一个数x,它的数位ans=log10(x): ...
- SAE云平台上传图片和发送邮件
1.远程图片保存至Storage 其中public是Storage中的容器名,"目录1/目录2/"是容器下的路径 $file_content 是得到的文件数据 $s = new S ...
- mysql 关于列的语句
查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除 ...
- Jquery学习笔记--性能优化建议
一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或 ...