關(guān)于
關(guān)于
Xcode
的插件已經(jīng)層出不窮了。但筆者憑著興趣也小有研究了一下。
由于Xcode
的控制臺不支持數(shù)組和字典里的中文的值輸出(更準確的說是輸出為Unicode
編碼),這讓開發(fā)者(至少是我)在打印數(shù)據(jù)進行調(diào)試的時候很不方便也很不爽。故此寫了一個Category
來解決這個問題(github地址點此)。只要把分類拖入到項目里就能讓數(shù)組和字典里的中文打印正常。
不過,至少筆者覺得還是挺麻煩的。所以憑著興趣研究了一下插件開發(fā),并打算把這個小需求整成一個插件。然后裝在Xcode
里一勞永逸。
開發(fā)
關(guān)于插件開發(fā)入門教程網(wǎng)上也有很多。總之大體就是先安裝Xcode-Plugin-Template
然后再新建一個project
的時候選擇xcode plugin
這樣就把插件開發(fā)的基本框架給搭好了。(Xcode-Plugin-Template傳輸門)
但是,插件開發(fā)是不開放的,而蘋果官方文檔也沒有。而網(wǎng)上給出大部分建議都是獲取所有的通知名,然后根據(jù)名字去猜這些通知是做什么的。這樣在開發(fā)過程中也是很大的阻礙,而我的需求是讓控制臺把Unicode
編碼轉(zhuǎn)成中文,所以我直接去看了別人寫的開源,找我需要相關(guān)的代碼。而核心代碼則是參考的MCLog
插件(過濾控制臺區(qū)域的插件)。
其中核心代碼是叫一個IDEConsoleItem
的類,這個類是每次控制臺輸出信息的時候調(diào)用的,實例化的方法是initWithAdaptorType:content:kind:
。一開始我是寫了method_exchangeImplementations
交換實現(xiàn),然后在切入一套邏輯,根據(jù)KVC
取出content
里的內(nèi)容(控制臺的內(nèi)容),然后在進行Unicode轉(zhuǎn)碼
,轉(zhuǎn)碼過后的字符串在利用KVC重新賦值content
即可。
但是...不盡人意,崩潰了。還不知道為什么,然后我嘗試了一下method_getImplementation
先把IDEConsoleItem
的initWithAdaptorType:content:kind:
的IMP實現(xiàn)給保存起來,然后在method_setImplementation
重新設(shè)置它的IMP,在新的IMP里調(diào)用原有IMP,然后在Unicode
轉(zhuǎn)碼,既然就沒報錯了。。。核心參考代碼如下:
//保存原有的IMP
IMP_IDEConsoleItem_initWithAdaptorType = method_getImplementation(class_getInstanceMethod(NSClassFromString(@"IDEConsoleItem"), @selector(initWithAdaptorType:content:kind:)));
//設(shè)置新的IMP method_setImplementation(class_getInstanceMethod(NSClassFromString(@"IDEConsoleItem"), @selector(initWithAdaptorType:content:kind:)), class_getMethodImplementation([P_ZXP_IDEConsoleItem class], @selector(initWithAdaptorType:content:kind:)));
IMP代碼
- (id)initWithAdaptorType:(id)arg1 content:(id)arg2 kind:(int)arg3
{
id (*execIMP)(id,SEL,id,id,int) = (void *)IMP_IDEConsoleItem_initWithAdaptorType;
id item = execIMP(self, _cmd, arg1, arg2, arg3);
if (kZXPIsDecodeInConsole) {
NSString *logText = [item valueForKey:@"content"];
NSString *resultText = [ZXPUnicodeDecodePlugsForXcode convertUnicode:logText];
[item setValue:resultText forKey:@"content"];
}
return item;
}
最后
總之目前關(guān)于插件開發(fā)也沒任何知識可分享的,就目前而言,筆者感覺需要實現(xiàn)那些需求,然后找擁有類似需求的插件直接去看源碼,比去看通知名字猜想來的更實際一些。如果有關(guān)于插件開發(fā)這一塊的大神指點,我也很樂意受教。最后附上插件(讓Xcode支持中文的輸出)地址以供學(xué)習(xí),代碼很簡單,就一百行左右的代碼https://github.com/biggercoffee/ZXPUnicodeDecodePlugsForXcode