美文网首页SwiftiOS开发新发现利器集合
Injection for Xcode:成吨的提高开发效率

Injection for Xcode:成吨的提高开发效率

作者: 没故事的卓同学 | 来源:发表于2016-03-11 00:31 被阅读15630次

今天强烈推荐一个Xcode高端必备插件: Injection Plugin for Xcode
直接放demo演示动图:

Injection Plugin for Xcode
我很久以前就希望有这么一种功能,直接修改某行代码,F5一下就能刷新这个实例,而不用重写build整个项目。靠夭,我不是在说前端!
没想居然有一天,梦想照入现实!!!是的,就是它,不用重新启动应用就可以让修改的代码生效。

使用

超级简单:修改源码,按下刷新的快捷键<code>ctrl</code>+<code>=</code>。会有一个快速的进度条闪过,修改的代码就生效了。

安装

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

检验安装成功

在某个类里添加下面的方法:
<pre><code>

  • (void)injected{

    NSLog(@"I've been injected: %@", self);

}
</code></pre>
或者swift下:
<pre><code>
func injected() {

print("I've been injected: (self)")

}
</code></pre>
打一个断点在这行代码上,按下快捷键ctrl+=后,代码执行到这个类时,如果断点进入这个方法说明你已经安装成功了。

支持Swift

Swift中的大部分类都可以正常使用。不过以下一些情况使用会有问题:

  • 结构中的修改
  • 标记为final的func和class
  • 不在类里的全局函数和变量

工作原理

Injection是一个Xcode的扩展插件,可以让你修改一个类的代码实现而不用重启整个应用。

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

swizzling利用了OC的runtime。这个也可以在Swift中没有标记为final或者private的方法(可以被override的方法)。对结构体无效。

这个插件还可以做点什么

  • 按照这个文档操作,还可以支持Storyboard Storyboard-based iOS projects.
  • 也可以可视化的调整颜色 collection of tunable parameters
  • 当你开始注入时,会在同一个目录下生成一个项目文件:iOSInjectionProject 或者 OSXInjectionProject。这个项目用于注入你的修改到原项目。建议加入<code>.gitignore</code>。
  • ctrl+=的快捷键可以在 "Tunable App Parameters"面板里自定义
  • 如果想在一台设备上使用,参考这个文档patch to your project..

我安装时遇到的一个错误

第一次使用,提示我项目里使用的一个第三方framework找不到。这个时候打开它自动生成的iOSInjectionProject,编译一下可以看到错误的具体原因。我看到issue里也好多人遇到。解决方式就是将自己项目framework search paths中的这个第三方框架的路径拷贝到iOSInjectionProject里。

欢迎关注我的微博:@没故事的卓同学

相关文章

网友评论

  • _东阁堂主_:楼主,现在这个好像用不了吧!
  • 强子ly:xcode8以后不能用了。
  • 507c8564b280:我有一个简单的UItableViewcell,里面给它的lable 重新赋一个对象的字段,control = 后,不论是在主页刷新,还是退出,重新进来,这个都没有改变啊,但是在控制器修改东西,会有效,这是为什么
  • 晨阳聊电影:表示xcode最新版不能安装插件呀~烦人
  • Hengry:观摩观摩
  • 蜀道为为:楼主,这个插件Xcode8支持吗,现在很多插件Xcode8都不支持
  • 臭脚丫子CC:这个插件xcode8还能用么
    没故事的卓同学:@呈呈呈 不能了。。。💔
  • 75cba68968ad:安装成功了,但是修改代码没有达到你说的那效果,Xcode应用图标上多了一个未读消息那样的小圆点数1,请问这是咋回事呢
    75cba68968ad:哦,但是没有达到你演示的那效果,出现了下进度条 界面上显示的没变
    没故事的卓同学:@william66688 有时会提醒要不要购买。可以忽略
  • 75cba68968ad:楼主,为何我的安装不成功呢,ctrl + = 一直没反应,跳不到那个方法那
  • 964bc28be7a4:求楼主大神们 解答下
  • 964bc28be7a4:*** 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/yangyang/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/common.pm line 57.
 main::error('Build Failed with status: 65. You may need to open and edit t...') called at /Users/yangyang/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/injectSource.pl line 465
*** Bundle build failed ***
 求告知下 这个怎么回事啊
  • Andy_WangPeng:[3788:126848] Injection attempting connection to: 127.0.0.1:31442
    [3788:126848] Connected to "Injection" plugin, ready to load x86_64 code.
  • iOSPeter:shift+ctrl+= 可以。不知道大神说的ctrl+= 和这个有啥区别
    TobyoTenma:@4b1c168af58d 这两个快捷键的区别在于:带shift的是插入修改代码后重新运行,不带shift的是插入后接着原来的位置运行;我个人喜欢用前者,后者有些情况会无效
  • iOSPeter:ctrl+=的快捷键可以在 "Tunable App Parameters"面板里自定义 搞半天没搞懂怎么添加
    强子ly:@没故事的卓同学 Tunable App Parameters 老铁, 具体位置在什么地方,xcode8.2
    没故事的卓同学:@4b1c168af58d 就是这个快捷键可以自定义。
  • Song1025:为什么我的Ctrl+=不行呀。并且也不走- (void)injected这个方法。我用Alcatraz下载的,下载的其他插件都用的好好的呀
    Song1025:搞好啦。谢啦
    Song1025:@没故事的卓同学 试过了。都不行。
    没故事的卓同学:@AmySong 直接下载源码安装试一试呢?
  • 没有黑眼圈de熊猫:我的也是安装成功,但是control + =,有进度条显示,但是界面没有改变,模拟器运行,是什么原因呢?难道是Xcode 7.3不支持?
    没故事的卓同学:@普罗旺斯_minmin 返回重新进入页面。他不会自动刷新当前页面
    没有黑眼圈de熊猫:@没故事的卓同学 什么意思,我就在页面上加了个label,改变显示的文字,怎么改变不了呢
    没故事的卓同学:@普罗旺斯_minmin 需要重新进入界面
  • 695696c24c41:ctrl+=没有变化,Tunable App Parameters 面板在哪啊,没有找到
    没故事的卓同学:@saasad 要重新进入页面。
  • 37ef9cd970b7:错误提示error: ::posix_spawnp ( pid => 8025, path = '/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/debugserver', file_actions = 0x7000015080d8, attr = 0x700001508118, argv = 0x7fa6e11d31b0, envp = 0x7fa6c9e81820 ) err = Bad file descriptor (0x00000009)
    是怎么回事,前几次是可以的,现在运行报这个错
    没故事的卓同学:@被盗号通知 给作者提个issue把。这个我没遇到过。帮不上忙。抱歉。
    37ef9cd970b7:@被盗号通知 而且是编译成功了之后报的错
  • a05832db24ea:请问xcode可以对swift进行重构了吗?
    没故事的卓同学:@屎壳郎123 现在还不支持。
  • chatwyn:*** Could not open "iOSInjectionProject/InjectionBundle.xcodeproj/project.pbxproj" as: No such file or directory ***
    没故事的卓同学:@chatwyn 看下项目文件夹下有没有正确生成iOSInjectionProject这个项目文件。
  • 科了个技:Build Failed with status: 65。楼主我报这个错误,看你说的,应该去哪里添加framework去哪里呢
    科了个技:噢,好的,谢谢
    没故事的卓同学:@科了个技 这个时候打开它自动生成的iOSInjectionProject,编译一下可以看到错误的具体原因
  • lyonse:请问一下swift工程该怎么配置,swift里面没有.m文件也没有prefix.pch,是不是要手动配置到.swift和桥接文件里面啊?
    没故事的卓同学:@lyonse 这是Xcode的插件。和你本身的项目语言没关系。无痛接入。
  • 3471c4738abf:我也同样的疑惑,上面的gif图是在viewdidload中直接修改的代码,可是我却必须在injected修改才能生效,很不方面啊。比如我在viewdidload中写了label的约束,我想调整一下,还要在injected中重写一遍,麻烦。。。。还有一些label不许修改,所以没有声明为成员变量,那在injected中还不能用了。。。。


    目测,这东西做不到gif中那样的话,就没有多大实用性
    3471c4738abf:@没故事的卓同学 刚才又试了一下。确实是需要在injected中回调一次。非常感谢
    3471c4738abf:@没故事的卓同学 我用了一下用shift+ctrl+=(injecte and reset app)是可以的.
    没故事的卓同学:@duanhjlt 你理解错了。injected是非必须的。任何可以修改的地方,ctrl+=后代码就注入runtime中。gif图中直接刷新viewDidload估计他还做了其他操作。比如在injected中回调了viewDidLoad
  • 男儿心:你好,我想知道,必须把更改的内容写到这个方法里(injected)才管用吗?能不能不只局限在这个方法里面呢?
    没故事的卓同学:@男儿心 不必的。其他地方也可以。
  • 程序猿_老李:Injection attempting connection to: 127.0.0.1:31442
    Connected to "Injection" plugin, ready to load x86_64 code.
    objc[7311]: Class ViewController is implemented in both /Users/lidongxu/Library/Developer/CoreSimulator/Devices/BCDBDD48-277A-4176-A7AF-897407D65AE6/data/Containers/Bundle/Application/E3DC37F0-A616-47E2-AF32-85D98DBC0ACC/哈哈哈.app/哈哈哈 and /Users/lidongxu/Desktop/哈哈哈/iOSInjectionProject/build/Debug-iphonesimulator/InjectionBundle1.bundle/InjectionBundle. One of the two will be used. Which one is undefined.
    9 injections performed so far.
    c9ffb7e109a8:@没故事的卓同学 Ignore any warning, Swizzled ShopController 0x109971b68 -> 0x10062dd30
    程序猿_老李:@没故事的卓同学 好嘞!!!
    没故事的卓同学:@M_Lee 没遇到过,去github上提issue吧。作者应该会帮你看一下
  • 码修:error 65
    ___as7:同65
    徐佳斌:@码修 我也是 你解决了吗
    没故事的卓同学:@码修 可能引用的第三方framework没有配置好的问题。你看下错误信息
  • 南栀倾寒:不知道那个控制面板是干嘛的
    南栀倾寒:@没故事的卓同学 暂时没看懂怎么使用的
    没故事的卓同学:@南栀倾寒 方便直接调一些颜色的值
  • c9f90e758efe:马克一个
  • 程旭媛:请问如何把iOSInjectionProject加到.gitignore文件里呢?是直接把名字贴进去就行了么?
    肥朝:@没故事的卓同学 怎么设置,能截个图吗,谢谢~
    没故事的卓同学:@小木偶的 查一下git命令吧。我用的sourceTree菜单里可以直接设置。
  • ColeX:楼主你好,大概试了下,有几点粗浅的看法
    1界面的绘制,比如label根据内容自适应,如果字体变大或者内容变多的时候,约束还是以前那个约束,所以很有可能造成显示不全的效果
    2.跟React Native不同,很多时候(界面)需要返回在进入才能刷新
    3.没有找到iOSInjectionProject,请问是在哪里?
    c9ffb7e109a8:@没故事的卓同学 楼主 大部分开发app 都不会在模拟器下看效果 特别是要准确的根据像素点做界面 不能运行真机 这个插件就有点鸡肋的感觉 你的可以运行真机么 我的一运行就报 main::error('Could not codesign as 9hone Developer: RuiNan Ye (C7937SCY...') called at /Users/wd/Library/Application Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin/Contents/Resources/injectSource.pl line 508
    没故事的卓同学:@ColeXm 在你当前项目文件的那个文件夹下。
    ColeX:@ColeXm 对于逻辑的刷新是很不错的,感谢分享
  • df57d5e6a14d:实测太吊了 伙计!
    余不悟:@坚持先生 在菜单里 有" Patch Project for injection"
    余不悟:@坚持先生 真机需要Patch 一下
    c9ffb7e109a8:@选1个昵称 兄弟你运行的是真机?
  • c9ffb7e109a8:为什么我运行了 插件插件也安装成功了 但是control + = 界面没有改变 只有inject And Reset APP 才有效 但是这是重启app
    没故事的卓同学:@坚持先生 你有看完吗?运行真机需要再配置一个地方。你看文章最后
    c9ffb7e109a8:@没故事的卓同学 运行真机貌似不行啊
    没故事的卓同学:@坚持先生 如果是界面你要返回,重新进入那个页面。它不会直接刷新当前的界面值
  • 疯狂的老中医:多谢楼主,这个插件方便了好多。赞一个!

本文标题:Injection for Xcode:成吨的提高开发效率

本文链接:https://www.haomeiwen.com/subject/grgtlttx.html