Injection Plugin for Xcode

Alt text

介绍

Injection Plugin For Xcode 是 Xcode 上的一个插件。利用它可以修改应用代码,实时在模拟器或实机上看到效果而不需要重启应用。

安装

点此下载 Injection Plugin for Xcode
安装后,重启Xcode,会发现在 Product 菜单下多了两个选项:
001

点击 Product > 你的工程名 > Patch Project for Injection 选项, 之后插件会在 Prefix.pch 和 main.m 中插入两段代码。这不会影响程序原有代码,如果要还原,随时可以通过点击 Revert Injection’s Changes 选项来还原。
002

基本使用

我们做一个很简单的应用,其有一个 UIButton 和一个 UILabel,当点击 button 后,label 显示一段文本,ViewController 的代码如下:

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@end

@implementation ViewController

- (IBAction)buttonTouched:(id)sender
{
    self.label.text = @"阿布上班不为了钱";
}
@end

运行后,点击按钮,效果如图所示:
003

之后我们修改代码,将赋给 label 的字符串改为:

self.label.text = @"阿布钱多到花不完";

但区别于一般的使用 CMD+R 来重新编译并运行程序,这次我们使用 control= 这个快捷键来注入。你会发现代码上方出现一个进度条:
004

注入完成后,修改的类的代码就生效了,点击模拟器中应用的按钮试试。
005

实时参数调整

Injection Plugin 还提供了5个变量和5个颜色,分别存在插件提供的全局数组变量 INParameters 和 INColors 中。我们可以在程序使用这两个数组变量,并可以在程序运行过程中实时修改。
我们建立个新工程,这一次,我们通过修改插件提供的一个颜色参数,实时修改应用中 View 的背景色。代码如下:

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:0.1
                                     target:self
                                   selector:@selector(changeColor)
                                   userInfo:nil
                                    repeats:YES];
}

- (void)changeColor
{
    self.view.backgroundColor = INColors[0];
}
@end

运行程序,之后点击 Product > 你的工程名 > Tunable App Parameters 选项。
006

点击第一个颜色,试着调整颜色,看看模拟器发生了什么。
007

真机调试

真机调试涉及到证书问题,需要告诉 bundle project 正确的证书。可以通过在工程文件中添加以下 RunScript 实现:

echo "$CODESIGNING_FOLDER_PATH" >/tmp/"$USER.ident" && echo "$CODE_SIGN_IDENTITY" >>/tmp/"$USER.ident" && exit;

具体操作如下:
008

之后就可以正确在真机上使用了。如果依然出现证书错误,尝试删除工程文件夹里的 iOSInjectionProject 目录。

结尾

最后,例如 storyboard injection 这些 Xcode 5 上已经失效的功能就不介绍了。如果想要了解更多,请访问
Injection Plugin for Xcode 的 Github 页面
阿布最高!

2014-06-30 13:5024807
  • Tru2014-03-20 10:25

    阿布,你为何这么屌~~~

  • zucknet2014-03-20 10:27

    阿布最高!

  • XiangqiTu2014-03-20 14:08

    阿布最高!++

  • Lonely_Soul2014-03-24 10:58

    实时修改参数是一定要用计时器吗?如果没有用的话,修改了参数后按ctr+=看不到效果

  • larry2014-03-31 10:43

    Xcode 5.1下报错:
    Build Failed with status: 65. You may need to open and edit the bundle project to resolve issues with either header include paths or Frameworks the bundle links against. at /Users/Larry/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/common.pm line 42.
 main::error(‘Build Failed with status: 65. You may need to open and edit t…’) called at /Users/Larry/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/injectSource.pl line 396
*** Bundle build failed ***
Check Bundle project.

  • Tristen2014-03-31 12:38

    能不能帮忙看看? 无论如何表示谢谢

    Xcode 5.1下编译通过可以运行(虚拟机上可以正常使用),真机运行ctr+=之后会提示
    Bundle build or injection has given an error. This is generally due to missing frameworks or header include paths or an imcompatable change to the code or header. Open Injection's Bundle Project to resolve these problems?

  • nonomori2014-03-31 12:41

    @Tristen 工程Code Signing Identity 选对(不要选 iOS Developer,要显式的选出正确的CSI),然后 RunScript 加 echo "$CODESIGNING_FOLDER_PATH" >/tmp/"$USER.ident" && echo "$CODE_SIGN_IDENTITY" >>/tmp/"$USER.ident" && exit; 把工程目录里 iOSInjectionProject 目录删了,重新Build

  • nonomori2014-03-31 12:42

    @Lonely_Soul 不一定要计时器啊,插件只是提供了这几个全局变量,怎么用随便你喽

  • Tristen2014-03-31 13:50

    可以用了,非常感谢

  • leapoct2014-04-03 16:31

    阿布,有bug啊,我用这个后,模拟器里都提示注入了,结果页面的内容却没更新。另外,我们的项目用了cocopods来管理,用这个没效果还报错

  • 7076898172014-04-09 17:42

    10.8.5 系统安装不了

  • answer-huang2014-04-10 18:00

    你好,我是刚用着好的,突然不好用了。就报这个错:
    Bundle build or injection has given an error. This is generally due to missing frameworks or header include paths or an imcompatable change to the code or header. Open Injection's Bundle Project to resolve these problems?
    用的是模拟器,知道是什么原因吗?

  • nonomori2014-04-10 18:02

    @answer-huang 你是不是工程添加了什么framework但是Injection的bundle project没有相应添加?

  • nonomori2014-04-10 18:02

    @leapoct 不会啊! 我也有用cocopods

  • answer-huang2014-04-10 18:06

    使用Injection后没添加framework,但是看bundle project里面报找不到shareSDK的头文件,但那个是在使用injection之前添加的,并且我刚刚还用的好好的。后来我想在真机上调试,添加RunScript没成功,模拟器也跑不了了。

  • nonomori2014-04-10 18:07

    @answer-huang 试试删除工程文件夹里的 iOSInjectionProject 目录

  • answer-huang2014-04-10 18:08

    使用Injection后没添加framework,但是看bundle project里面报找不到shareSDK的头文件,但那个是在使用injection之前添加的,并且我刚刚还用的好好的。后来我想在真机上调试,添加RunScript没成功,模拟器也跑不了了。

  • answer-huang2014-04-10 18:09

    @nonomori 删掉了,我都把injection插件删了重装了。 对了,你刚说Injection的bundle project添加相应的framework是怎么添加。

  • nonomori2014-04-10 18:15

    @answer-huang 之前模拟器跑成功,后来换真机跑不成功,那应该和framework等无关。你看下是不是什么地方设置不正确。包括RunScript是否去掉,code sign是否正确等。 Injection 确实报错错误信息基本没什么用处。之前我code sign不正确,也是给我报的framework不正确的错误

  • blackchen2014-04-14 11:29

    安装了这个 插件之后 我的xcode总是出现simulate in use 必须强退,请问怎么卸载这个,我点File里面的remove出现error

  • zander2014-05-15 15:49

    注入成功 界面没有改变

  • zander2014-05-15 16:05

    @nonomori

  • riven2014-06-30 13:48

    快捷键是control=呀,control+=好容易误解

  • nonomori2014-06-30 13:56

    @riven 谢谢,改了~

  • vook2014-07-11 14:57

    阿布 么么哒 太强大啦

  • polo2014-10-23 16:19

    你好 我想问一下你那个全局变量直接用就行?不用引头文件什么的么?

  • nonomori2014-10-27 11:26

    @polo 不用

  • Austin2014-11-04 17:38

    @nonomori 你好,我在我的项目里面安装上面的设置,运行出现Injection Bundle Error 提示Bundle build or injection has failed.

    This is generally due to missing frameworks or header include paths or an incompatable change to the code or header.

    Open Injection Bundle Project to resolve these problems? 上面的操作基本都设置了,也尝试在Injection工程里面添加framework Path 设置 等等 都没有效果。工程里面用了第三方的一些lib 我在Injection也尝试过把Header Library Framework 路径写对,还是不能调试。

  • Austin2014-11-04 17:40

    @nonomori 在run script 也添加过相应的代码 也无解

  • zgjun_06282015-06-10 17:12

    这个现在不能用了,安装了,xcode没反应啊

  • TP_kechao2015-08-08 16:45

    现在安装完之后没有任何反应 是因为插件升级的问题么

  • Shobhit Bhatt2015-09-11 14:03

    When I try to use INColors[0], I am getting error like "Use of undeclared identifier 'INColors'. Where to define these dynamic parameter macros? I am not able to access it. Please help me out. Thanks in advance

  • leo2015-12-16 11:23

    [BundleInjection load] 192.168.2.174 (see project's main.(m|mm)
    2015-12-16 11:21:26.882 InjectionTest[10842:107383] Injection attempting connection to: 127.0.0.1:31442
    2015-12-16 11:21:26.883 InjectionTest[10842:107383] Connected to "Injection" plugin, ready to load x86_64 code.
    Compiling /Users/tanpeng/项目/InjectionTest/InjectionTest/ViewController.m
    0.06 real 0.03 user 0.02 sys
    ... First time learning of project, one second ...
    objc[10842]: Class ViewController is implemented in both /Users/tanpeng/Library/Developer/CoreSimulator/Devices/EA1E4CED-5E51-43E0-BD4A-AE97D7EDF0B4/data/Containers/Bundle/Application/0ECD2D39-79C3-4CB1-944D-BB9CA5A6A07D/InjectionTest.app/InjectionTest and /Users/tanpeng/项目/InjectionTest/iOSInjectionProject/build/Debug-iphonesimulator/InjectionBundle2.bundle/InjectionBundle. One of the two will be used. Which one is undefined.
    2015-12-16 11:21:32.927 InjectionTest[10842:107312] Swizzled ViewController 0x1188602b8 -> 0x10ba64940

    这是怎么回事?大牛能告知一下吗?

  • 戴超2016-03-12 21:38

    你好,xcode是7.2.1,安装后修改代码,没效果;我是通过Alcatraz管理的;请问是什么原因

  • 糖糖丸2016-03-14 19:33

    我出现的问题了楼上的Leo、戴超同学一样,xcode同样是7.2.1版本的

  • liaoting2016-03-15 00:33

    BEGIN failed--compilation aborted at /Users/liaoting/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/injectSource.pl line 15.

  • 9080709622016-05-11 15:15

    *** Build Failed with status: 65. You may need to open and edit the bundle project to resolve issues with either header include paths or Frameworks the bundle links against. ***
    这个东西和cocoapod能结合使用么?
    测试代码类是pod中的子类
    但是在Injection工程里面不管怎么配置framework或者searchpath都不行

  • AmySong2016-05-19 11:39

    为什么我的按照@@Tristen 工程Code Signing Identity 选对(不要选 iOS Developer,要显式的选出正确的CSI),然后 RunScript 加 echo "$CODESIGNING_FOLDER_PATH" >/tmp/"$USER.ident" && echo "$CODE_SIGN_IDENTITY" >>/tmp/"$USER.ident" && exit; 把工程目录里 iOSInjectionProject 目录删了,重新Build 还是运行失败呀

  • AmySong2016-05-19 11:40

    打错了。不是Bulid失败。而是ctrol= 还是失败