给Xcode8安装插件

给Xcode8安装插件

背景

Xcode8以后安装以前Alcatraz上的插件就行不通了,不过网上也有很多方案,主要是重新给Xcode签名。这里把这些文章做一个汇总。

在Xcode8以后,苹果为了安全性(比如防止再次出现XcodeGhost事件),把Xcode增加了签名校验,不会再加载以前Alcatraz下载的插件。并给出了自己的插件机制(Xcode Source Editor Extension),但是这个插件机制实用性很低。所以很多人就想着要继续使用以前的插件。

现在的主流方案是是把Xcode复制一份,一个没有重签名,用来打包上线。另外一份重签名后,重新使用以前的插件,仅仅用来写代码。下面就来说说如何进行Xcode重签名、以及如何让以往的插件能在重签名的Xcode上跑起来

Xcode重签名

  1. 创建自签名证书
    打开钥匙串,创建新证书,名称填XcodeSigner,证书类型选择代码签名(名字里面尽量不要包含空格,免得在命令行容易出错)

  2. 复制Xcode。这里因为要留一份未重签名的Xcode来打包,所以这里先复制一份,并重命名为XcodeSigner

  3. 给Xcode重签名(这里的Xcode已经重命名为XcodeSigner)
    sudo codesign -f -s XcodeSigner /Applications/XcodeSigner.app

经过上面这些步骤Xcode就已经被重签名了,什么?你说为什么三步,能一步到位吗,恩、问得好。还真有一步到位的解决方案。
MakeXcodeGr8Again把上面说的这三步合在了一起,并提供了CLI和GUI两种使用方式。一步到位!

运行重新签名过后的Xcode很多人会发现以前的插件还是没有工作。这个问题在以前就有。原因是插件的DVTPlugInCompatibilityUUIDs包含了可运行的Xcode版本id,Xcode更新以后需要把新Xcode的id添加到插件的DVTPlugInCompatibilityUUIDs中。

把Xcode id加入DVTPlugInCompatibilityUUIDs

  1. 获取Xcode的uuid
    Xcode的Info.plist里就保存了自己的uuid。

    可以右键点击Xcode->显示包内容->Contents/Info.plist->复制DVTPlugInCompatibilityUUID来获取

    也可以通过defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID命令来获取

  2. 把uuid加入插件的DVTPlugInCompatibilityUUIDs
    Xcode插件放在~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins为xcplugin格式。通过显示包内容可以看到xcplugin中有个Info.plist,DVTPlugInCompatibilityUUIDs字段就是。

把uuid更新到插件中需要两步,但是!插件有很多个,一个个来肯定要把人逼疯,这里当然有all in one的解决方案。

1
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add `defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID`

这个命令主要做了这些:
通过find在插件目录下找到所有插件的Info.plist文件。
通过xargs对上一步的搜索结果进行枚举,针对每一个Info.plist文件,利用defaults write命令将当前Xcode版本的uuid加到DVTPlugInCompatibilityUUIDs中。

参考文档