一起为Xcode8写插件吧

字数 569阅读 1121

一、Xcode Source Editor Extension 简介

在Xcode8的以前,开发者可以在Xccode运行时通过注入代码来实现插件的功能。插件可以在Alcatraz上面提交和分发。不过Xcode8禁止了该方式的插件安装,转而向开发者提供了Xcode Source Editor Extension(以下简称Extension)的方式来做插件。

Extension特性(安全性)

  • 支持上架到AppStore
  • 每个Extension运行在独立的进程,如果它崩溃了,不会引起Xcode的崩溃,且会有错误提示

Extension不足(功能性)

  • 无UI交互
  • 只能够在开发者调用相关命令的时候直接的修改代码,具体表现为
    获取正在编辑的文本
    获取选中的区域
    替换正在编辑的文本
    选中正在编辑的文本
    在Editor菜单中生成一个子菜单,用于调用插件
    绑定快捷键
  • Extension不能在后台运行

虽然Extension有诸多不足,但是没有插件写代码是件痛苦的事情,所以在空闲的时候我也做了一些需要用到的Extension,帮助提高开发效率。

快速添加定义的#pragma mark 的Xcode8插件
快速添加定义的#pragma mark 的Xcode8插件

二、Xcode Source Editor Extension 实例

下面以删除选中行的Xcode8插件为例,详细介绍Extension的实现。

1.创建mac工程

创建mac工程

2.Add Target

Add Target
选择Xcode Source Editor Extension
输出信息

3.工程结构

工程结构

4.编写Extension代码(SourceEditorCommand.m)

- (void)performCommandWithInvocation:(XCSourceEditorCommandInvocation *)invocation completionHandler:(void (^)(NSError * _Nullable nilOrError))completionHandler
{
    //有选中了才删除
    if (invocation.buffer.selections.count != 0) {
        XCSourceTextRange* firstObject = invocation.buffer.selections.firstObject;
        
        //开始删除的位置
        NSUInteger start = firstObject.start.line;
        //删除的行数
        NSUInteger len = firstObject.end.line - start +1;
        //Index Set
        NSIndexSet* set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(start,len)];
        //移除指定代码
        [invocation.buffer.lines removeObjectsAtIndexes:set];
    }
    completionHandler(nil);
}
@end

5.修改Extension显示名称

修改Extension显示名称

修改Extension显示名称

6.Run DeletePlugin

Run

随意选择一个工程打开

7.测试Extension

测试Extension

8.绑定快捷键

绑定快捷键

下面解释一下Extension的Code部分

  • XCSourceEditorCommand 当插件触发后,在代理方法里面可拦截到消息(XCSourceEditorCommandInvocation)

  • XCSourceEditorCommandInvocation 存放着用来区分Extension的唯一标示(identifier) 和 数据(XCSourceTextBuffer)

XCSourceTextBuffer主要有两个属性需要了解

//当前的文本
@property (readonly, strong) NSMutableArray <NSString *> *lines;
//选中的区域
@property (readonly, strong) NSMutableArray <XCSourceTextRange *> *selections;

Delete Extension的流程如下:

1.菜单或快捷键触发Delete Extension
2.XCSourceEditorCommand 拦截到消息
3.从XCSourceEditorCommandInvocation 中拿到 XCSourceTextBuffer
4.在XCSourceTextBuffer中分析需要删除的行
5.删除选中行

三、总结

最后,一起为Xcode8写插件吧...

推荐阅读更多精彩内容