Xcode6插件开发入门

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.前往[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.打开插件工程的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

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(notificationLog:)name:nilobject:nil];

将这行代码加入到我们的工程初始化中

1234

-(void)notificationLog:(NSNotification*)notify{NSLog(@"%@",notify.name);}

这样我们就可以监听我们在对xcode做操作的时候xcode发出的所有通知了。跑一下,是不是通知刷刷的来了。。。

实现一个Xcode插件功能

寻找需求

既然我们都知道了这么多通知,我们是不是可以通过抓取其中某一个通知动手优化下Xcode呢。现在Xcode插件辣么多,好多咱们能想到的功能,其实用心在网上google一下,都能找到。鉴于入门,那么我们来坐一个比较简单的功能吧。

比如我们在xcode文件导航区域要显示这个文件在Finder中的位置的时候,我们需要在这个文件中右键点击,然后在展示列表中点击show in finder,而且这个show in finder按钮还没有快捷键。要是能有个快捷键能够快速打开就好了。

构思实现

1.我们需要监听文件导航区域选中的文件改变时候的通知,然后保存当前选中的文件的路径

2.我们需要新建一个NSMenuItem,然后设置我们需要的快捷键。

3.当我们按下快捷键的时候打开我们的workspace,并且选中到指定的文件。

talk is cheep,show u the code

1.我们需要监听文件导航区域选中的文件改变时候的通知,然后保存当前选中的文件的路径

根据之前监听xcode通知,我们会发现一个叫transition from one file to another这个通知,这就是我们需要的选中文件改变时候的通知。

12345678910

-(void)notificationLog:(NSNotification*)notify{if([notify.nameisEqualToString:@"transition from one file to another"]){NSURL*originURL=[[notify.objectvalueForKey:@"next"]valueForKey:@"documentURL"];if(originURL!=nil&&[originURLabsoluteString].length>=7){self.url=[originURL.absoluteStringsubstringFromIndex:7];}}}

我们将这个通知给我们的文件路径保存下来,为什么要substringFromIndex:7,因为返回的URL是file:///User........格式的,需要切换成/User...的格式。

2.我们需要新建一个NSMenuItem,然后设置我们需要的快捷键。

这个比较简单修改下模板帮我们生成的那几行代码,加入快捷键就可以

12345678

NSMenuItem*menuItem=[[NSAppmainMenu]itemWithTitle:@"Edit"];if(menuItem){[[menuItemsubmenu]addItem:[NSMenuItemseparatorItem]];NSMenuItem*actionMenuItem=[[NSMenuItemalloc]initWithTitle:@"Do action"action:@selector(doMenuAction)keyEquivalent:@"F"];[actionMenuItemsetKeyEquivalentModifierMask:NSShiftKeyMask];[actionMenuItemsetTarget:self];[[menuItemsubmenu]addItem:actionMenuItem];}

objective-c

关键在于这两行:

12

NSMenuItem*actionMenuItem=[[NSMenuItemalloc]initWithTitle:@"Do action"action:@selector(doMenuAction)keyEquivalent:@"F"];[actionMenuItemsetKeyEquivalentModifierMask:NSShiftKeyMask];

这里的快捷键就是shift + F,读者可以根据自己的方式修改。

3.当我们按下快捷键的时候打开我们的workspace,并且选中到指定的文件。

12345

-(void)doMenuAction{self.url=[self.urlstringByURLDecodingStringParameter];[[NSWorkspacesharedWorkspace]selectFile:self.urlinFileViewerRootedAtPath: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命令一样,非常实用。

nstask-tutorial

Cocoa

是Cocoa,不是Cocoa touch,应为Xcode是MacOS上的app。所以编写Xcode插件会用到很多Cocoa的API,需要了解Cocoa编程。

扩展阅读

Xcode5 Plugins 开发简介

Creating an Xcode Plugin: A Quick-Start Guide

Extending Xcode 6 with plugins

How to create Xcode plugin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265

推荐阅读更多精彩内容