美文网首页iOS开发知识小集
Xcode UI界面调试神器-injectionIII

Xcode UI界面调试神器-injectionIII

作者: Dxc_iOS | 来源:发表于2018-06-13 10:42 被阅读2081次

前言:一直羡慕安卓开发:这边改代码,那边瞬间见效果;Xcode还需要编译、项目跑起来,模拟器才能看到效果。有时候XCode编译超慢,一等就是几分钟,实在急死人了。Xcode8以前可以安装插件Injection for Xcode 实现,但是Xcode8以后不能随心所欲的装插件了。现在好啦,不使用插件也可以实现UI即时调试了。

injection链接

Mac App Store
同时献上网上大牛对这个开发工具的实现原理的分析:《Injection:iOS热重载背后的黑魔法》
链接地址

使用:

一、OC:

1.在我们的项目中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法加入如下代码:

if DEBUG
// for iOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
// for tvOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/tvOSInjection.bundle"] load];
// for masOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle"] load];
endif

2.打开Mac APP injectionIII, 点击Mac 桌面的injectionIII 图标-> Open Recent -> 选择你的项目 ,最后再选择FileWatcher(有对号即可);

3.在任意继承自OC的类中加入如下需要跟新的UI代码,在我们修改了对应文件按下COMMAND + S即可看到UI reload了;

-(void)injected{
NSLog(@"I've been injected: %@", self);
self.view.backgroundColor = [UIColor goldColor];
}

二:Swift:

if DEBUG
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
//for tvOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/tvOSInjection.bundle")?.load()
//Or for macOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle")?.load()
endif

执行快捷键: COMMAND + S

@objc func injected(){

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

}

不过这只是不run XCode情况下,预览UI界面效果,最后要想项目重运行达到效果,还需要把注入的代码写粘贴复制在真实需要改变的地方。
injectionIIIDemo地址

相关文章

网友评论

  • 我们只是GitHub的搬运工:兄弟 xcode10 + macOS Mojave 可否行?
  • 跳跳虾:貌似不能用了,iOS11.4 我的报错
  • 微光星芒:真机不起作用, 只能在模拟器上看到效果.
  • 8ef7f923f5bb:新建一个工程,在默认创建的ViewController上实验command+s会报错,换一个类就正常了
  • 羊村里的羊:我Swift可以 oc报错syntax error near unexpected token `('
    羊村里的羊:@Dimon_Hu 解决了!重新建个工程可以
    Dimon_Hu:解决没?我一样的问题
  • 小熊0910:试了下,github上的demo没什么问题,但是自己的xcworkspace工程就是不行。哎
    小熊0910:需要在
    - (void)injected{
    //这里写你需要更新的代码方法。比如
    [self viewDidLoad];
    }
    这样command+s 保存会触发injected里面要更新的ui,比如这里写的[self viewDidLoad];
    小熊0910:对于OC工程需要额外设置什么么?swift倒是可以
    小熊0910:- (void)injected{
    NSLog(@"!!!!!!!!!!!!!!!!!!!!injected");
    }
    这个方法也有被回调,界面就是没有更新。。。
  • 泽小记:文档中在appdeleagte中的applicationDidFinishLaunching方法下插入代码不起作用,换到didFinishLaunchingWithOptions方法内。就没问题了。作者可以更新下文档
    泽小记:@Dxc_iOS 霸气更新 :smiley:
    Dxc_iOS:嗯呢,没写清楚,已经更新了。。。
  • yunFeng:Xcode 9.4.1 不行 用新版的 injectionIII 适配10的版本 也跑步起来 估计作者没更新
  • 未来行者:步骤按照作者的来了,但是报这个错:
    Error loading /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection: dlopen(/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection, 265): Library not loaded: @rpath/XCTest.framework/XCTest
    Referenced from: /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection
    Reason: image not found
    简书花花:xcode 10不支持吗,我用9都行,今天就报Error loading /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection: dlopen(/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection, 265): Symbol not found: __T0BOWV
    Referenced from: /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection
    Expected in: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/libswiftCore.dylib
    in /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection
    无敌BB小生:到底啥情况。。。。
    无敌BB小生:遇到了同样的问题 都是按照步骤来的 就报这个错误 是Xcode版本问题么
  • Mr卿:[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load]; 有些将InjectionIII.app 安装到别的路径了,没有在Applications (虽然很少)可以以提一下,嘻嘻
    Dxc_iOS:嗯嗯,是哦,不过从MacApp Store 直接安装的话,路径应该没问题的:smile:
  • 5c16631b5dbf:*** Could not locate containing project or it's logs. **
    你好, 报这个错误是怎么回事?
    5c16631b5dbf:@Mr卿 我直接从 mac appstore上安装的
    Mr卿:如果安装了 查看path:是否正确
    Mr卿:是否安装了injectionIII?
  • MYS_iOS_8801:这个报错请求怎么解决

    *** Compiling /Users/mys/Desktop/***/***/TKApp/modules/finances/Controller/TFSFinancesRootViewController.m ***
    *** Re-compilation failed (/Users/mys/Library/Containers/com.johnholdsworth.InjectionIII/Data/command.sh)
    fatal error: malformed or corrupted AST file: 'could not find file '/Users/mys/Desktop/***/***/TKApp/Modules/sso/Model/TFSFundAccountInfo.h' referenced by AST file '/Users/mys/Library/Developer/Xcode/DerivedData/Build/Intermediates.noindex/PrecompiledHeaders/GCS-Prefix-cqmfxvynofpsafafwdhhlfljpkor/GCS-Prefix.pch.pch''
    note: after modifying system headers, please delete the module cache at '/Users/mys/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/1CC1MBM3VFV58'
    1 error generated.
    ***
  • Mr卿:实验了一下不行,😓
    Mr卿:@Mr卿 好像要选择 -> Open Recent ->选中要热重载的工程
    Mr卿:@Dxc_iOS 可以了也
    Dxc_iOS:@Mr卿 我又更新了步骤,你再试一遍,可以的。
  • Mr卿:有dome么
    Dxc_iOS:@Mr卿 我已经更新了,文章末尾有Demo

本文标题:Xcode UI界面调试神器-injectionIII

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