【Xcode】自定义Xcode插件实现

xcodegraniteincon
在使用xcode的过程中,我们经常会遇到重复繁杂的操作。而作为程序员,我们要实现的就是用程序去替代人类的双手,让人能提高效率,产生更大价值。
于是我想到了Xcode的插件,在网上google了一番之后,发现虽然繁杂,但是鲜有能够完全满足个人需求的插件,那既然如此,何不自己动手写一个插件呢。于是乎现在就开始行动:

第一步,下载Plugin模板

插件的创建需要一系列的设置,都是一些重复的工作,在这里,有现成的插件模板,可以给我们一键生成插件:
将下载下来的模板放到目录下 ~/Library/Developer/Xcode/Templates/Project Templates/Application Plug-in/Xcode Plugin.xctemplate,如果没有该目录,创建即可。
接下来需要重启Xcode,在创建新的工程的时候,就可以看到你想要的工程模板:
6248894b-38d1-42e1-bc6b-256118a1ac88
 
 

第二步,查询出你xcode的版本号DVTPlugInCompatibilityUUID

由于你的Xcode版本并没有写入程序当中,因此需要查询出来
read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
3330c8a3-98d2-4fa7-94a5-0dc477d809b6
并手动填入刚创建的Xcode插件工程的info.plist中去。
9a374124-7dd7-4ce0-b94b-73f5865a93f4
我们此次插件编写的目的是实现一个在Xcode任一界面,用Shift+F的快捷方式打开Finder文件目录,定位到当前显示的文件。

第三步,开始编写插件业务逻辑

由于Xcode的接口并没有开放,关于插件的编写并没有可以作为指导的文档。因此我们只能通过监听事件的方式来获取程序运行状态,并挨个查看事件可能带来的通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:nil object:nil];
我们会监听到,当文件编辑器切换文件的过程中,会触发如下事件:
if([notify.name containsString:@”IDENavigableItemCoordinatorObjectGraphChangeNotification”] ){
   
id items = [notify.userInfo objectForKey:@”IDEChangedItems”];
   
id item = [items firstObject];
   
if([item respondsToSelector:@selector(fileURL)]){
        
NSURL *url = [item performSelector:@selector(fileURL)];
      
 NSLog(@”%@”,url);
    }
}
我们将获取到的文件目录保存下来,在程序里增加Shift+F功能打开Finder窗口的功能:
NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@”Do Action” action:@selector(doMenuAction) keyEquivalent:@”F”];
[actionMenuItem setKeyEquivalentModifierMask:NSAlphaShiftKeyMask ];
打开Finder:
// Sample Action, for menu item:
– (
void)doMenuAction
{
    [[
NSWorkspace sharedWorkspace] selectFile:strUrl inFileViewerRootedAtPath:nil];
}
注意:
如果开发插件过程中,错误插件已经被安装上去,每次打开Xcode程序会崩溃,可以在一下目录中删除该插件即可。
1234
本文中涉及的项目,已上传Github欢迎下载: