Injection Plugin for Xcode 分析

插件地址:https://github.com/johnno1962/injectionforxcode

实现功能

Injection Plugin For Xcode 是 Xcode 上的一个插件。利用它可以修改程序代码,实时在模拟器或实机上看到效果而不需要对程序进行重新编译。

demo.gif

安装方法

第一步:移除签名

从Xcode8开始,苹果引入了官方的扩展API,但目前只局限于资源编辑器扩展,苹果还将Xcode签名来阻止未签名的代码的注入与执行。所以但也阻止了一些类似于injection的工具的安装。网上提供的Xcode8以上版本安装插件的解决方案:

由于我只尝试了自签名的方法,所以下面详细介绍一下自签名的具体步骤:

  1. 打开电脑里面钥匙串;
keychain.jpg
  1. 选择创建一个证书(在钥匙串访问 ->证书助理);
choose.png
  1. 输入你的名字(你喜欢的名字),然后选择“代码签名”的证书类型。不是必需的,但该名称在命令行以后使用,因此可以更好地用在这里很容易区分的名称(我在这里使用XcodeSigner);
create.png
  1. 在终端中输入如下代码对Xcode进行重新签名,等待十几分钟即可。
sudo codesign -f -s XcodeSigner /Applications/Xcode.app

但是移除签名可能会无法保证安全性,并且会影响应用程序的发布,所以可以在重新签名之前拷贝一个Xcode的副本,专门用于应用程序的发布。有兴趣的话,你也可以尝试一下前三种方法。

第二步:安装插件

  1. 下载完之后,打开红圈选中的文件夹。
open.png
  1. 在终端中输入如下代码获取当前版本Xcode的UUID:

    defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
    

    打开info.plist,在plist文件中找到DVTPlugInCompatibilityUUIDs。如果刚才从终端中获得的UUID已存在,则什么也不用做;反之,点击+, 添加一个item, 对应的value值为输入刚才从终端中获得的UUID,保存。

    UUID.png
  1. 打开工程并运行,成功之后即完成了安装。
run.png
  1. 安装后重启Xcode,会发现在Product菜单下多了两个选项(注意重启的时候,应该选择load bundle,而不应该选skip bundle,否则不能再Xcode中找到),即说明安装成功。
success.png

使用方法

修改源码,按下刷新的快捷键ctrl+=。会有一个快速的进度条闪过,修改的代码就生效了。

工作原理

它通过解析应用的build日志来判断源代码文件上次是怎么被编译的。然后会把这些重新编译一遍包在一个已经通过动态加载器注入到应用的bundle里。这个时候其实有两个版本的类在app里,一个原始的和一个修改过的版本。修改过的版本通过和原始类“swizzled”来产生效果。swizzling利用了OC的runtime。这个也可以在Swift中没有标记为final或者private的方法(可以被重写的方法),但是对结构体无效。以下为插件作者对原理说明的原文:

Injection for Xcode is an extension to the Xcode IDE that allows you to patch the implementation of a class's method without having to restart the application.
It performs this by parsing the build logs of the application to determine how a source file was last compiled. With this it wraps the result of re-compiling into a bundle which is injected into the application using the dynamic loader. At this point there are two versions of a class in the app, the original and a new modified version from the bundle. The modified version is then "swizzled" onto the original class so changes take effect.
This swizzling takes advantage of the fact that Objective-C binds method invocations to implementations at run time. This can also be performed on Swift classes provided that the method or class is not final or private (i.e. the method can be overridden) by patching the class' "vtable". This excludes the injection of methods of structs.

遇到的问题

我尝试在公司的项目中使用Injection插件的时候,遇到了一个bundle has failed to load错误,在控制台中显示的错误信息是symbol not found,于是我去gitHub的issues中逐个阅读发现了相同的问题而插件作者给出的回答是

answer.png

但是因为我报错的类并不是第三方库中的类,所以我觉应该还有救。折腾了一下午最后发现只要把Build Setting中的symbols hidden by default设置为NO,就不会再出现这个错误了。不过并不是所有的工程都需要修改这个设置项,似乎只有使用了静态库的工程才需要修改。我猜测原因可能是在解析build日志时由于symbol被隐藏,它无法找到调用静态库的类,从而出现这个问题。

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,520评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,391评论 0 12
  • 正月初五,前往忠县一游。近日得空,得以形成文字。 忠县原名临江,在古代出了两个有名的守土忠臣(一为东周...
    沉云阁主阅读 1,197评论 8 7
  • 杀戮从开馆之前就已经开始,直到多数人已经进入睡梦。
    林翊觉阅读 97评论 0 0