• Xcode6插件开发


    工欲善其事必先利其器,Xcode是我们做iOS Dev必须掌握的一款开发工具。

    Xcode本身也是一门Cocoa程序,与其来说它是一个Cocoa程序,是不是意味着,我们可以去动态去让它做某件事,或者监听它的某个事件呢?答案是:当然可以。  

    Xcode每次打开的时候都会去加载这个目录底下的文件,~/Library/Application Support/Developer/Shared/Xcode/Plug-ins . 这个文件夹底下就是装着所有的Xcode插件。

     

    那么插件究竟是什么?

    插件就是在Xcode基础之上,由第三方个人写的一些对Xcode功能的拓展,好用的插件比如,文档注释的

    VVDocumenter-Xcode

    https://github.com/onevcat/VVDocumenter-Xcode

    图片有提醒的 KSImageNamed插件,还有鄙人写的快速跳转到 https://github.com/MakeZL/ZLGotoSandboxPlugin 等等很多好用的。

     

     

    那么插件是如何做出来的呢?

    其实做插件最好有一些Cocoa的知识。

     

    我们做一个Hello plugin开始

     

    你会看到一个空的项目,你打开info.plist文件。

    需要配置参数

    关于Info.plist参数

    XC4Compatible = YES, // Xcode 4 编译器

    XC5Compatible = YES, // Xcode 5 编译器

    XCPluginHasUI = NO, // NO让插件有效

    XCGCReady = YES,

    DVTPlugInCompatibilityUUIDs = [A2E4D43F-41F4-4FB9-BB94-7177011C9AED,AD68E85B-441B-4301-B564-A45E4919A6AD,C4A681B0-4A26-480E-93EC-1218098B9AA0] // Xcode兼容的UUID

     

    Note: 这样已经配置成功一半了,但还需要配置Build Settings里面的属性才行~

    配置:Build Settings

    Deployment要配置几个地方

    不要急,我把需要改的地方列出来。

    改的地方

    1.Deployment Location YES

    2.Installation Build Products Location 改为 ${HOME}

    3.Installation Directory /Library/Application Support/Developer/Shared/Xcode/Plug-ins // 插件地址

    4.Skip install NO

     

    恭喜你,已经完成 85%了。

    还需要配置Build Settings 里面的 Packaging

    1. Warpper Extension 改为 xcplugin

     

    ok! 终于配置完了,接下来,我们要创建一个类,继承NSObject。

     

    在.m中实现

    + (void)pluginDidLoad:(NSBundle *)plugin;

    pluginDidLoad就像ViewDidLoad一样。界面一创建完,就调用,pluginDidLoad是插件加载完调用。

     

    好了,我们重启下Xcode。 打开控制台, -> console.

     

    就会看到 Hello world!的字眼了。

     

    一般插件我们都会创造一个单例对象。

     

    监听Xcode发出的通知 , 

    NSApplicationDidFinishLaunchingNotification通知是加载完这个插件后发出的。我们可以做一些我们想要做的事情。

     

    [objc] view plaincopy
     
    1. - (instancetype)init{  
    2.     if(self = [super init]){  
    3.         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching:) name:NSApplicationDidFinishLaunchingNotification object:nil];  
    4.   
    5.     }  
    6.     return self;  
    7. }  

     


    如果你将接收通知的名字写成nil,将代表你将接收所有Xcode发出的通知。比如切换Xcode,切换导航栏都会调用通知

     

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching:) name:nil object:nil];

     

    给Xcode导航栏添加Menu分类

    [objc] view plaincopy
     
    1. Menu *menu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Hello"];  
    2. NSMenuItem *newItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Hello" action:@selector(<#selector#>) keyEquivalent:@""];  
    3.       
    4. [[NSApp mainMenu] addItem:newItem];  



    顶部的菜单栏就会出来。 我们可以为newItem分配子subMenu(子Menu)

     

     

    [objc] view plaincopy
     
    1. newItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Haha"action:NULL keyEquivalent:@"T"];  
    2.     [newItem setTag:EmptyTrashItemTag];  
    3.     [newItem setTarget:self];  
    4.     [newItem setAction:@selector(Haha:)];  
    5.     [newMenu addItem:newItem];  


     

    第一个小插件完工. 

    其他通知补充

     

    NSMenuDidChangeItemNotification // 打开新Project

     

    IDEIndexDidChangeStateNotification // 切换Xcode

     

    NSTextDidChangeNotification // 监听Xcode的写入

     

    IDEEditorDocumentDidChangeNotification // 监听工作路径

    还有很多需要不断的挖掘~~

     

    插件的优缺点。

    插件固然好,但插件多了会令Xcode变的非常卡。因为每个人实现的插件方式不一样,并且有些是非常浪费效率的。 有些比较坑的插件还很容易让Xcode经常卡死.

    所以大家尽可能的选择一款比较出名的插件。

  • 相关阅读:
    Python_Crawler_Foundation1-2_MYSQL_Regular Expression
    Linux_Best Practice_01_Ubuntu_set prox_set Repositories
    python_Note_Preview_01
    Python_Note_Day 10_Coroutine
    Python_Note_Day 9_threading.Thread_multiprocessing.Process_Queue
    Linux_学习_Day4_user/group/permission
    Linux_学习_Day3_bash
    Linux_学习_Day2~3
    Python_Note_Day 8_socket
    Python_Note_Day 7_Advanced Class
  • 原文地址:https://www.cnblogs.com/ligun123/p/4262846.html
Copyright © 2020-2023  润新知