一起为Xcode8写插件吧

作者: CatchZeng | 来源:发表于2016-11-16 21:53 被阅读958次

一、Xcode Source Editor Extension 简介

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

Extension特性(安全性)

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

Extension不足(功能性)

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

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

  • 删除选中行的Xcode8插件:
    https://github.com/CatchZeng/DeleteLine

    创建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写插件吧...

相关文章

网友评论

  • 西叶lv:只能在运行插件程序的时候,使用黑色Xcode插件调试,可以使用插件,一旦把插件程序关闭,在打开Xocde,根本不显示插件
    很花花:可以将里面的.app拖到应用程序中,“系统偏好设置” -> "扩展" -> "Xcode Source Editor" -> 确认插件名字前已打钩,即可常驻
  • 西叶lv:安装完自动导入头文件的插件,重新打开Xode就没有这个插件了,这是为啥??
  • MrLiu_2696:并没有显示啊
  • 十一岁的加重:黑马课程
  • 摇滚马农:删除代码引起了崩溃,博主有遇到吗
    摇滚马农:@CatchZeng 再请教你个问题 我的插件菜单不是每次都能正常出现 这个能解决吗
    CatchZeng:@1a352bff90aa 我暂时没遇到,我查查代码是不是有bug
  • 戴仓薯:赞,感谢,不过现在允许的功能暂时还是太有限 :cry:
    CatchZeng:@戴仓薯 是的,只能期待苹果的进一步开放了

本文标题:一起为Xcode8写插件吧

本文链接:https://www.haomeiwen.com/subject/hsucuttx.html