概述

我们平时也使用了非常多的xcode插件,尽管官方对于插件制作没有提供不论什么支持,可是载入三方的插件,默认还是被同意的.第三方的插件,须要存放在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins目录中,后缀名必须是.xcplugin (只是事实上际上是一种bundle).

所以我们创建一个插件project,直接创建bundleproject就可以,然后通过改动后缀名为.xcplugin,将其放到~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夹中就能够了

第一个demo插件功能:在xcode的edit菜单中增加一个叫做 測试菜单 的项目,当点击的时候,弹出一个警告框,显示一句话,完整的project放在TestPluginBundle

具体过程

创建Bundleproject TestPluginBundle

project名称就是 TestPluginBundle

project设置

插件project和普通的bundleproject还是有差别的,所以须要进行特殊的设置

首先是project的plist文件



加入 三项

XCPluginHasUI = NO

XC4Compatible = YES

DVTPlugInCompatibilityUUIDs 这是一个数组.数组内容字符串,指示了该插件兼容的xcode版本号,仅仅有相应版本号的xcode的UIID增加这个数组了,插件才干被载入,否则,即使你将插件放入xcode的插件目录,插件也不会被载入的

那么怎么获取你当前版本号的xcode的UUID呢?在terminal中输入 defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID ,terminal会返回一串字符串给你,这就是你的Xcode的DVTPlugInCompatibilityUUID.

接下来是 Build Setting了





Installation Build Products Location 设置为 ${HOME} [显示的时候,显示的是你的用户文件夹],这个是products的根文件夹

Installation Directory 设置为 /Library/Application Support/Developer/Shared/Xcode/Plug-ins,这个是指定你的插件安装的文件夹. 注意,这里填入的事实上是相对文件夹,插件的绝对文件夹是这种,比如 /Users/yohunl/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin ,最后的绝对文件夹是 Installation Build Products
Location和Installation Directory的结合,这也是为什么两者都要设置的原因

Deployment Location 设置为 YES,这个是指示该project不使用设置里的build location,而是用Installation Directory来确定build后放哪儿



我们默认project生成的相关文件放在哪.都是 Build Locations指示的,通过Deployment Location 设置为 YES告诉project,我们不使用这个默认的设置,而是我们自己定义的

Wrapper extension 设置为 xcplugin,后缀名必须为xcplugin,否则不会被载入

接下来就是插件的实现过程了

在project中加入一个文件 ,名称为 TestPluginBundle (当然,名字随便什么都能够),在当中加入代码

@implementation TestPluginBundle+(void)pluginDidLoad:(NSBundle *)plugin {    NSLog(@"插件执行了!");    [TestPluginBundle sharedInstance];}- (instancetype)init{    self = [super init];    if (self) {        [[NSNotificationCenter defaultCenter] addObserver:self                                                 selector:@selector(didApplicationFinishLaunchingNotification:)                                                     name:NSApplicationDidFinishLaunchingNotification                                                   object:nil];    }    return  self;}- (void)didApplicationFinishLaunchingNotification:(NSNotification*)noti{    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidFinishLaunchingNotification object:nil];    NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Edit"];    if (menuItem) {        [[menuItem submenu] addItem:[NSMenuItem separatorItem]];        NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"測试菜单" action:@selector(doMenuAction) keyEquivalent:@""];        [actionMenuItem setTarget:self];        [[menuItem submenu] addItem:actionMenuItem];    }}- (void)doMenuAction{    NSAlert *alert = [[NSAlert alloc] init];    [alert setMessageText:@"測试菜单执行"];    [alert runModal];}- (void)dealloc{    [[NSNotificationCenter defaultCenter] removeObserver:self];}+ (instancetype)sharedInstance{    static id instance;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance = [[self alloc] init];    });    return instance;}@end

ctrl+B来Buildproject,查看路径下/Library/Application Support/Developer/Shared/Xcode/Plug-ins,能够看到我们的插件TestPluginBundle.xcplugin存在了,接下来,重新启动xcode



点击 測试菜单



可能你 会说,这样尽管是起作用了,可是,难道开发一个插件project,没打单步调试么?

??

,当然不是啊

编辑project的scheme,将Executable设置为Xcode.app,意思是project调试的时候挂载到xcode中



将Options以下的Core Location,XPC Services,View Debugging前面的勾都去掉,否则,你调试的时候,可能会直接crash



当设置完后,你的project的scheme的图标会从bundle图标变为xcode的图标



再执行(这里是执行了,不是编译了)

不出意外的话,会出现xode启动另外一个xcode,接下来和你普通的调试project就是一样的了!

说了这么多,事实上仅仅是想让你明确一个插件的初始化的配置,调试等

上面的过程,已经有国外大神制作成了一个 project模板了,https://github.com/kattrali/Xcode-Plugin-Template 其支持OC和Swift,当你安装它后,会在新建project时候,看到
Xcode Plugin模板,使用这个模板创建一个新project,以上的配置等,就都设置好了,直接执行就是一个demo了.


iOS 插件制作的更多相关文章

  1. iOS:插件制作入门

    本文将介绍创建一个Xcode4插件所需要的基本步骤以及一些常用的方法.请注意为Xcode创建插件并没有任何的官方支持,因此本文所描述的方法和提供的信息可能会随Apple在Xcode上做的变化而失效.另 ...

  2. Xcode 4 插件制作入门

    转自:http://www.onevcat.com/2013/02/xcode-plugin/ 2014.5.4更新 对于 Xcode 5,本文有些地方显得过时了.Xcode 5 现在已经全面转向了 ...

  3. JS图片上传预览插件制作(兼容到IE6)

    其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方 ...

  4. chrome谷歌浏览器插件制作简易教程

    1.在磁盘上创建一个目录,用来放应用的代码和资源 2.在这个目录中,创建一个文本文件,命名为manifest.json,其内容为: { "manifest_version": 2, ...

  5. npm插件制作及发布基础教程

    最近有同事在搞npm插件,想用了这么久的npm也没有自己制作一个插件出来练一练,所以动手把之前的图片随手势移动的react组件改写成了npm插件,之前的博客地址http://www.cnblogs.c ...

  6. unity3D 搞定任意ios插件

    原地址:http://www.cnblogs.com/U-tansuo/archive/2012/11/22/unity_ios-plugin.html 说起unity调ios插件,好多淫比较头痛,探 ...

  7. jq 幻灯片插件制作

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. 【酷Q插件制作】教大家做一个简单的签到插件

    酷Q插件已经有很多了,社区分享一大堆,不过还是自己写才有乐趣,哈哈.不得不吐槽一下,酷Q竟然不更新了,出了个酷Q pro,还收费!!诶.不过这也影响不了咱写插件的心情,今天教大家写一个酷Q签到插件,虽 ...

  9. WordPress插件制作教程(八): 最后总结

    WordPress插件教程最后一篇,还是为大家简单的做下总结.这次插件制作教程讲的内容和知识点个人觉得不是很多,因为插件制作不单单是这些内容,它涉及的知识很多很多,不是说你会一些函数就可以做出一个好的 ...

随机推荐

  1. PHP 格式化显示时间 date()函数

    Y 4位数字年,y为2位数字,如99即1999年 m 数字月份,前面有前导0,如01.n 为无前导0数字月份 F 月份,完整的文本格式,例如 January 或者 March M 三个字母缩写表示的月 ...

  2. hdu3667

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. python操redis

    Python操作redis python连接方式:点击 下面介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redi ...

  4. iOS学习笔记28-系统服务(一)短信和邮件

    一.系统应用 在开发某些应用时,我们可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,或者直接调用安装的第三方应用,这个要怎么实现呢? 这里统一使用UIApplication的一个对象方法 ...

  5. 【bzoj2333】[SCOI2011]棘手的操作 可并堆+STL-set

    UPD:复杂度是fake的...大家还是去写启发式合并吧. 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条 ...

  6. Java防止SQL注入的途径介绍

    为了防止SQL注入,最简洁的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只 ...

  7. Python基础教程总结(一)

    引言: 一直都听说Python很强大,以前只是浏览了一些博客,发现有点像数学建模时使用的Matlab,就没有深入去了解了.如今Python使用的地方越来越多,最近又在学习机器学习方面的知识,因此想系统 ...

  8. xsy 1845 - GCD

    from NOIP2016模拟题34 Description 给定一个长度\(n\le 10^6\)的序列, 给定\(A, B\) 给出一个序列,要求你通过如下两个操作使得序列中所有数的最大公约数大于 ...

  9. 你如果知道这些css常用命名,绝对事半功倍!--摘抄

    对于布局,即用.g-作为前缀,通常有以下推荐的写法 对于模块,即.m-作为前缀.元件,.u-作为前缀,通常有下面推荐的写法. 对于功能,即以.f-为前缀,通常推荐如下: 对于颜色,即以.s-为前缀,通 ...

  10. 转 使用putty从linux主机上面往windows主机下面拷贝文件

    更新一下,把putty的包解压以后,想要在dos窗口中直接使用,必须把putty解压的文件的路径添加到环境变量中,这样使用起来就会非常简单了. 郁闷了好久,终于搞定了putty的上传下载文件命令psc ...