?? 只適用于模擬器上調(diào)試,真機(jī)無效
1拴竹、Mac的App Store上下載安裝 InjectionIII剧罩,安裝好之后栓拜,打開工具運(yùn)行,會在桌面頂部狀態(tài)欄挑势,初始狀態(tài)是藍(lán)色啦鸣,配置好之后是橘紅色
2潮饱、打開InjectionIII诫给,Open Project,選擇你的項(xiàng)目目錄
3中狂、選擇的項(xiàng)目會在Open Recent中出現(xiàn),保持File Watcher的選項(xiàng)勾選证鸥,如果有多個勤晚,要保持當(dāng)前運(yùn)行的項(xiàng)目在第一個,之后可以快捷選擇赐写。
4膜赃、在AppDelegate的DidFinishLaunchingWithOptions配置InjectionIII的路徑
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
#ifdef DEBUG
//InjectionIII 注入
//oc
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
//switf
Bundle(path:"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
#endif
return YES;
}
5、在需要動態(tài)調(diào)試的頁面控制器中寫上injected方法跳座,把需要操作的UI方法添加到injected中執(zhí)行,如果想讓全部的控制器都能使用疲眷,直接添加到BaseViewController
// Objective-C:
- (void)injected {
#ifdef DEBUG
NSLog(@"I've been injected: %@", self);
[self viewDidLoad];
#endif
}
// Swift
@objc func injected() {
#if DEBUG
print("I've been injected: \(self)")
self.viewDidLoad()
#endif
}
6、修改完UI换淆,直接cmd + S就能看到效果几颜,部分頁面可能耗時比較久或無法使用,正常頁面均能使用
iOS擁有熱重載的原理:
Injection for XCode
GitHub地址:https://github.com/johnno1962/InjectionIII
- Injection工具可以動態(tài)地將iOS代碼在已運(yùn)行的程序中執(zhí)行, 不用重啟.
- Injection會監(jiān)聽源代碼文件的變化, 如果文件被改動了,
- Injection Server就會執(zhí)行rebuildClass重新進(jìn)行編譯蛋哭、打包成動態(tài)庫.dylib文件,
編譯、打包成動態(tài)庫后, 使用writeString方法通過Socket通知運(yùn)行的App.
- (BOOL)writeString:(NSString *)string {
const char *utf8 = string.UTF8String;
uint32_t length = (uint32_t)strlen(utf8);
if (write(clientSocket, &length, sizeof length) != sizeof length ||
write(clientSocket, utf8, length) != length)
return FALSE;
return TRUE;
}
- Server會在后臺發(fā)送和監(jiān)聽Socket消息, Client也會開啟一個后臺去發(fā)送和監(jiān)聽Socket消息.
- Client接收到消息后會調(diào)用inject(tmpfile: String)方法, 運(yùn)行時進(jìn)行類的動態(tài)替換(新類動態(tài)替換舊類).
- dlopen會把tmpfile動態(tài)庫文件載入運(yùn)行的App里, 返回指針dl.
- 接下來, dlsym會得到tmpfile動態(tài)庫的符號地址, 然后就可以處理類的替換工作了.
- 當(dāng)類的方法都被替換后, 我們就可以開始重新繪制界面了.
- 使用動態(tài)庫方式極速調(diào)試, 整個過程無需重新編譯和重啟App.