Xcode 6.3.2 で Plugin を動くようにするまで

「[Xcode 6.3.2 で Plugin を動くようにするまで](http://blog.dealforest.net/2015/05/fix_launched_plugin_for_xcode6-3-2/)」から引用です

## TL;DR

* Xcode 6.3.2 用の DVTPlugInCompatibilityUUIDs を追加する
* Xcode 起動時に Plugin を有効にするポップアップがでるようになった
* 大抵の Plugin はメニューに表示されないが動作は初期設定の動作はする(設定で有効にしないと動かないようなものはダメ)

以下、それぞれの詳細です

**追記 2015/05/22 14:04**

人によって Plugin が入っている場所が違うので適宜変更してもらえればと。

|  | パス |
|:--|:----|
| グローバル領域 | /Library/Application\ Support/Developer/Shared/Xcode/Plug-ins |
| ユーザー領域 | ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins |

**追記終わり**

## DVTPlugInCompatibilityUUIDs を追加

以下のコマンドで一括して DVTPlugInCompatibilityUUIDs(`E969541F-E6F9-4D25-8158-72DC3545A6C6`) を追加

```
$ find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add E969541F-E6F9-4D25-8158-72DC3545A6C6
```

### DVTPlugInCompatibilityUUIDs が異なる

**追記 2015/05/22 14:04**
`FILE` のところには plist を指定すれば問題ありませんでした。
使い方をミスってただけです。お騒がせしました。

```
$ defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID
```

**追記おわり**

普段 `defaults read ...` で `DVTPlugInCompatibilityUUIDs` を確認してたので無駄にはまった。。。なんで違うのかはよくわかりません。僕の環境だけかもしれませんが `defaults read ...` は信じないと心に誓いました。

```
$ defaults read FILE DVTPlugInCompatibilityUUIDs /Applications/Xcode.app/Contents/Info.plist

(
    "9F75337B-21B4-4ADC-B558-F9CADF7073A7"
)
```

```
$ cp /Applications/Xcode.app/Contents/Info.plist ~
$ plutil -convert xml1 ~/Info.plist
$ cat ~/Info.plist

...
  <key>DVTPlugInCompatibilityUUID</key>
  <string>E969541F-E6F9-4D25-8158-72DC3545A6C6</string>
...
```

## Xcode 起動時に Plugin を有効にするポップアップがでるようになった
Plugin の数によって多少メッセージが異なりますが大体こんな感じです
![popup](https://qiita-image-store.s3.amazonaws.com/0/957/66ef2191-ef64-e911-4209-627c9bae74ba.png)

これが曲者で、UUID 追加後に Xcode を起動すると初回のみ表示されます。
"Skip Bundle" を選択すると **Plugin が無効**になり、**Xcode を再起動してもポップアップはでてきません**。
しかも default が "Skip Bundle" のため、適当に Enter を押すと Plugin が無効になるという悲しさ...

### ポップアップを再度表示する方法

**追記 2015/05/22 14:04**
コメントから教えてもらいました。
```
defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.3.2
```
でもリセットできるみたいです！

**追記終わり**

1. Xcode を閉じる
2. `~/Application Support/Developer/Shared/Xcode/Plug-ins` の名前を変更する
3. Xcode を起動
4. `~/Application Support/Developer/Shared/Xcode/Plug-ins` に名前を戻す
5. Xcode を再起動

こうすれポップアップが表示されるので "Load Bundle" を選択しましょう

## メニューを表示する方法
これは Xcode Plugin 開発者用ですね。

どうやら `pluginDidLoad:` が呼ばれたタイミングだと `-[[NSApp mainMenu] itemWithTitle:]` が `nil` を返すようになったのが原因です。

`NSMenuDidChangeItemNotification` を Observe するようにしてメニューを設定するようにすれば出るようになります。
[Tuna](https://github.com/dealforest/Tuna/blob/b28efb2edb7b88eb677c4ec5581cba5d62ecc4c5/Tuna/Tuna.m#L68-L72) の場合はこんな感じで対応しました。

PR おくれば大抵マージされると思うので空前の GitHub Chance がやってきたわけですね。
みなさんガンガンおくりましょう。

## 感想

ただただつらい...


## 補足
ふむふむ

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">ロードタイミングがはやくなってる感じやね。しかしアラート選択ミスると辛いな。&#10;&quot;Xcode 6.3.2 で Plugin を動くようにするまで - Qiita&quot; &#10;<a href="http://t.co/iAKSHn5Uhh">http://t.co/iAKSHn5Uhh</a></p>&mdash; hetima (@hetima) <a href="https://twitter.com/hetima/status/601384178723069952">May 21, 2015</a></blockquote>

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">pluginDidLoad: 時点で対象クラスが未ロードだったので、 NSApplicationDidFinishLaunchingNotification で対処した。 <a href="https://t.co/HbEEHGq1zs">https://t.co/HbEEHGq1zs</a></p>&mdash; hetima (@hetima) <a href="https://twitter.com/hetima/status/601385410971836417">May 21, 2015</a></blockquote>