Xcode提供了所有你建立一個App需要的功能。但是由於其不開源以及沒有製作Xcode-Plugin相關的文件,在我們需要新增一些自己的想法和功能的時候變得缺乏靈活性。 但是我們可以通過一些非官方的手段來擴充套件我們自己的Xcode,並且分享給別人使用。
Xcode Plug-in能做什麼
太多了,我們可以自動生成程式碼註釋(VVDocumenter),我們可以在程式碼編輯器中直接顯示我們初始化的UIColor的顏色(ColorSense-for-Xcode),我們也可以在程式碼編輯器中直接顯示我們要新增到UIImage的圖片(KSImageNamed-Xcode),我們還可以調整控制檯的顏色,修改程式碼樣式,等等等等….
我們還可以用Alcatraz來管理我們的外掛,簡直方便!
Xcode Plug-in放在哪
所有的Xcode Plug-in都會放在一個叫~/Library/Application Support/Developer/Shared/Xcode/Plug-ins
檔案目錄下,並且所有的外掛都會以.xcplugin
作為字尾。
開發自己的Xcode Plug-in
準備工作
1 2 3 |
1.前往[Xcode-Plugin-Template](https://github.com/kattrali/Xcode-Plugin-Template)下載Xcode外掛開發的模板。 2.將下載下來的template複製到 ~/Library/Developer/Xcode/Templates/Project Templates/Application Plug-in/Xcode5 Plugin.xctemplate資料夾中,如果沒有對應的資料夾就自己手工建立一個。 3.重啟Xcode,當你新建一個工程的時候就可以在OSX中看到一個Application Plug-in的選項,裡面有一個Xcode Plug-in模板。 |
進入開發
我們新建一個Xcode Plug-in模板的工程,可以看到模板為我們生成了好多程式碼。看與你工程同名的檔案的initWithBundle
方法。閱讀一下後你就可以知道模板為我們填充了一個在Edit
中新增一個Do Action
的按鈕,點選後會回撥doMenuAction
方法。
我們可以run一下我們的工程,你會發現啟動了一個新的Xcode,因為我們做的是Xcode外掛,啟動的當然是Xcode,用Xcode編寫Xcode的程式碼,是不是很有意思。試試點選新的Xcode的Edit有一個Do Action
按鈕,點選Do Action
按鈕,再回撥中打個斷點,看有沒有回撥你的方法。
DVTPlugInCompatibilityUUIDs
是的,你會發現你的回撥方法木有呼叫,木有呼叫啊,什麼鬼!其實這是因為你的外掛不認識你正在跑的Xcode的版本,把你的Xcode版本介紹給它認識就好了。
1 2 3 |
1.開啟外掛工程的Info.plist,找到DVTPlugInCompatibilityUUIDs,開啟這個下拉框,這裡有所有你的外掛認識的Xcode版本。 2.在terminal中輸入 defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID ,terminal會返回一串字串給你,這就是你的Xcode的DVTPlugInCompatibilityUUID,把這串字串新增到DVTPlugInCompatibilityUUIDs中即可。 3.再跑一次Xcode,是不是可以了~ |
竊聽Xcode通知
因為Apple至今也沒有公開Xcode Plugin的文件。所以我們需要通過一些其他的思路尋找方法。比如竊聽我們在操作Xcode的時候Xcode發出的各種通知。
1 |
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:nil object:nil]; |
將這行程式碼加入到我們的工程初始化中
1 2 3 4 |
- (void)notificationLog:(NSNotification *)notify { NSLog(@"%@",notify.name); } |
這樣我們就可以監聽我們在對xcode做操作的時候xcode發出的所有通知了。跑一下,是不是通知刷刷的來了。。。
實現一個Xcode外掛功能
尋找需求
既然我們都知道了這麼多通知,我們是不是可以通過抓取其中某一個通知動手優化下Xcode呢。現在Xcode外掛辣麼多,好多我們們能想到的功能,其實用心在網上google一下,都能找到。鑑於入門,那麼我們來坐一個比較簡單的功能吧。
比如我們在xcode檔案導航區域要顯示這個檔案在Finder中的位置的時候,我們需要在這個檔案中右鍵點選,然後在展示列表中點選show in finder
,而且這個show in finder
按鈕還沒有快捷鍵。要是能有個快捷鍵能夠快速開啟就好了。
構思實現
1 2 3 |
1.我們需要監聽檔案導航區域選中的檔案改變時候的通知,然後儲存當前選中的檔案的路徑 2.我們需要新建一個NSMenuItem,然後設定我們需要的快捷鍵。 3.當我們按下快捷鍵的時候開啟我們的workspace,並且選中到指定的檔案。 |
talk is cheep,show u the code
1.我們需要監聽檔案導航區域選中的檔案改變時候的通知,然後儲存當前選中的檔案的路徑
根據之前監聽xcode通知,我們會發現一個叫transition from one file to another
這個通知,這就是我們需要的選中檔案改變時候的通知。
1 2 3 4 5 6 7 8 9 10 |
- (void)notificationLog:(NSNotification *)notify { if ([notify.name isEqualToString:@"transition from one file to another"]) { NSURL *originURL = [[notify.object valueForKey:@"next"] valueForKey:@"documentURL"]; if (originURL != nil && [originURL absoluteString].length >= 7 ) { self.url = [originURL.absoluteString substringFromIndex:7]; } } } |
我們將這個通知給我們的檔案路徑儲存下來,為什麼要substringFromIndex:7
,因為返回的URL是file:///User........
格式的,需要切換成/User...
的格式。
2.我們需要新建一個NSMenuItem,然後設定我們需要的快捷鍵。
這個比較簡單修改下模板幫我們生成的那幾行程式碼,加入快捷鍵就可以
1 2 3 4 5 6 7 8 |
NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Edit"]; if (menuItem) { [[menuItem submenu] addItem:[NSMenuItem separatorItem]]; NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Do action" action:@selector(doMenuAction) keyEquivalent:@"F"]; [actionMenuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [actionMenuItem setTarget:self]; [[menuItem submenu] addItem:actionMenuItem]; } |
objective-c
關鍵在於這兩行:
1 2 |
NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Do action" action:@selector(doMenuAction) keyEquivalent:@"F"]; [actionMenuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; |
這裡的快捷鍵就是shift + F
,讀者可以根據自己的方式修改。
3.當我們按下快捷鍵的時候開啟我們的workspace,並且選中到指定的檔案。
1 2 3 4 5 |
- (void)doMenuAction { self.url = [self.url stringByURLDecodingStringParameter]; [[NSWorkspace sharedWorkspace] selectFile:self.url inFileViewerRootedAtPath:nil]; } |
這個就比較好理解了。把第一步儲存的URL傳遞過去就可以,不過需要做一個URLDecoding,因為xcode給我們的是encode過的URL。
Xcode “API”
Xcode外掛開發已經不是什麼新技術了,所以也有很多開發者dump出了很多Xcode的API。大家可以按需要加入到自己的工程中使用。
Working with projects files
XcodeEditor有一組強大的操縱專案檔案的API,比如inspect headers, list frameworks, add classes等功能。如果你要對你專案檔案進行操作,千萬不要忘記這個庫。
NSTask
NSTask
的功能類似像terminal中執行command命令一樣,非常實用。
Cocoa
是Cocoa
,不是Cocoa touch
,應為Xcode是MacOS上的app。所以編寫Xcode外掛會用到很多Cocoa
的API,需要了解Cocoa
程式設計。
擴充套件閱讀
Creating an Xcode Plugin: A Quick-Start Guide