美文网首页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