前言
Xcode 的插件大大丰富了 Xcode 的功能,而且有了 Alcatraz ,插件的管理也非常容易,但是有个非常恼人的问题:一旦升级 Xcode ,插件就失效!终于有时间来写下自己恢复Xcode8.0插件的全过程了。也算无语,我在回复插件的时候尝试了两个不同的方法。不管怎样最后还是回复了插件的使用了。
Xcode8为什么禁止外来插件
我们可以看到在Xcode8中支持了开发插件工程,并且为我们提供了一个插件模板,开发的插件可以上传到App Store下载。苹果这么做有一个原因在于,之前Xcode和插件是运行在同一个进程的,所以插件的崩溃也会导致Xcode崩溃。苹果现在将插件作为一个单独的应用程序,分开进程运行,不会对Xcode带来其他影响。
插件的工作原理
让我们首先了解下,插件是怎样在Xcode中其作用的。Xcode 的插件放置在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 目录下,为 .xcplugin 格式。通过 Show Content 可以看到 xcplugin 中存在一个 Info.plist,其中有一项为 DVTPlugInCompatibilityUUIDs,而这就是插件失效的原因。
由于 Apple 没有公开插件开发的相关资料,这里我只能通过命名跟值猜测 DVTPlugInCompatibilityUUIDs 的作用:插件通过 DVTPlugInCompatibilityUUIDs 来指定能够运行此插件的 Xcode 版本。因此,DVTPlugInCompatibilityUUIDs 中存放的是 Xcode 版本对应的 UUID,Xcode 在启动加载控件时,将当前 UUID 同插件 Info.plist 中 DVTPlugInCompatibilityUUIDs 存放的 UUID 数组进行匹配,如果没有匹配项,说明此插件无法在该版本的 Xcode 运行,插件也就失效了。
解决办法:将当前版本的 UUID 加到 DVTPlugInCompatibilityUUIDs 中即可。更多查看
一.通过xcode_plugins 破解Xcode 签名保护
复制一份xcode8出来,对其进行unsign.
然后用这个unsign的xcode继续愉快的和插件玩耍;( 通过update_xcode_plugins这个库)
当我们需要打包的时候,我们可以继续回到安全的xcode上工作。
可以参考:update_xcode_plugins里面有很详细的步骤,
需要注意的是里面有一个说明:(if still having problems: sudo gem install -n /usr/local/bin update_xcode_plugins)
当你输入命令行时可以直接输入这里的,我当时输入前面的命令行时有问题,输入这里的才可以。
需要说明的是 (Choose which Xode.app you would like to copy and unsign (use arrows) ) 时,箭头指的是键盘上方向键的 上下键!!!!
终端输入命令行中报了错:
-
权限问题
这是因为要执行这些操作时必须有管理员的权限(比如更新软件)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
** 只需要在命令前加上sudo,** 例如:sudo gem install cocoapods即可.sudo是获取管理员权限,现在按照步骤输入管理员密码即可.
- Unable to download data from http:// ruby.taobao.org/ - bad response Not Found 404..
原因:需要升级http://ruby.taobao.org/为https://ruby.taobao.org/
在官网中看到:我们已经停止基于 HTTP 协议的镜像服务, 请在配置中使用 HTTPS 协议代替
$ gem sources --add https://ruby.taobao.org/ --remove http://ruby.taobao.org/
二.通过证书重签
我为什么没有详细描述上个方法的步骤?因为那个方法我试过了,但是没有效果!! T_T
下面说的这个方法是有效的,详细介绍下。
这个方法是在Alcatraz的issue里面看到的:https://github.com/XVimProject/XVim/blob/master/INSTALL_Xcode8.md亲测可用,并且修改过后的xcode可用正常打包上架,不必担心
更新Xcode,目前最新版本是8.1;
-
由于安装插件会影响原来的Xcode打包上传,我们在应用程序里复制一个Xcode,并重命名为XcodeSigner;
XcodeSigner
-
打开钥匙串,创建新证书,名称填XcodeSigner,证书类型选择代码签名(Code Signing);
创建证书
填写证书信息
- 在终端命令中输入:sudo codesign -f -s XcodeSigner /Applications/XcodeSigner.app,耐心等待命令执行完毕。
这里我要说一下,这个时间很长,长的很,反正我当时等了半个小时也没有好,最后下班后放那里回家了,第二天来了,反正是好了。
- 安装Alcatraz,如果重启xcode没有显示load bundle,在终端运行如下代码 添加xcode8的id给插件 应该可以解决大部分插件的问题
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
PS:有可能在终端输入命令行时会报如下错误提示:
this identity cannot be used for signing code
此时是因为你在生成 证书的时候 证书类型选择的不是 “代码签名”这个类型,导致的错误。
最后
最后 1 部分出现了,可是 2部分没有出现。因为Xcode屏蔽了插件,打开插件功能,打开终端:
sudo /usr/libexec/xpccachectl
然后重启电脑即可生效。一定要重启电脑才行
一些好用的插件
AutoCompletion
extract-localizable-string-plugin-xcode
小结
至此,Xcode8 的插件就可以恢复使用了。