一起为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