Injection Plugin for Xcode 分析

Injection Plugin for Xcode 分析

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

实现功能

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

安装方法

  • 可以使用Alcatraz安装;
  • 或者clone这个项目,运行InjectionPluginLite/InjectionPlugin.xcodeproj。

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

由于我只尝试了自签名的方法,所以下面详细介绍一下自签名的具体步骤:
1. 打开电脑里面钥匙串;
2. 选择创建一个证书(在钥匙串访问 ->证书助理);
3. 输入你的名字(你喜欢的名字),然后选择“代码签名”的证书类型。不是必需的,但该名称在命令行以后使用,因此可以更好地用在这里很容易区分的名称(我在这里使用XcodeSigner);
4. 在终端中输入sudo codesign -f -s XcodeSigner /Applications/Xcode.app对Xcode进行重新签名。

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

使用方法

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

工作原理

它通过解析应用的build日志来判断源代码文件上次是怎么被编译的。然后会把这些重新编译一遍包在一个已经通过动态加载器(dynamic loader)注入到应用的bundle里。这个时候其实有两个版本的类在app里,一个原始的和一个修改过的版本。修改过的版本通过和原始类“swizzled”来产生效果。swizzling利用了OC的runtime。

遇到的问题

我尝试在公司的项目中使用Injection插件的时候,遇到了一个bundle has failed to load错误,在控制台中显示的错误信息是symbol not found,折腾了一下午后发现只要把Build Setting中的symbols hidden by default设置为NO,就不会再出现这个错误了。不过并不是所有的工程都需要修改这个设置项,似乎只有使用了静态库的工程才需要修改。我猜测原因可能是在解析build日志时由于symbol被隐藏,它无法找到调用静态库的类,从而出现这个问题。

参考链接

  • https://www.jianshu.com/p/27be46d5e5d4
  • http://blog.csdn.net/yake_099/article/details/53392718

你可能感兴趣的:(Injection Plugin for Xcode 分析)