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











网友评论
- (void)injected{
//这里写你需要更新的代码方法。比如
[self viewDidLoad];
}
这样command+s 保存会触发injected里面要更新的ui,比如这里写的[self viewDidLoad];
NSLog(@"!!!!!!!!!!!!!!!!!!!!injected");
}
这个方法也有被回调,界面就是没有更新。。。
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
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
你好, 报这个错误是怎么回事?
*** 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.
***