いつかに備えてXcode Plugin作成コトハジメ


普段Androidをやってるんですが、仕事ではiOSをやり始めてます。

Xcodeをdisるわけじゃないけど、たまに○○な機能あったらいいなーと思うことがよくあって、Pluginとかないのかなと思って探してみたら非公式なんですが一応はありました。

ただ、欲しい機能はそれでもなかったので自分で作ってみようと考えたわけです。

で、Hello Worldレベルまで終わって、ここまででそれなりに詰まったので念のために残しておきます。

早速。

### まずはプロジェクト作成お作法

#### プロジェクト新規作成

Bundleを選びます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/102cf359-8019-8645-f692-676291d5fc57.png" width=450 />


Bundle Extensionには`xcplugin`と入れましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/12077b51-4181-6491-d2bf-309c9f34363d.png" width=450 />


#### info.plist

info.plistに下記の値を追加する。


| key                         | type    | value                                |
|-----------------------------|---------|--------------------------------------|
| XCGCReady                   | Boolean | YES                                  |
| XCPluginHasUI               | Boolean | NO                                   |
| XC5Compatible               | Boolean | YES                                  |
| XC4Compatible               | Boolean | YES                                  |
| DVTPlugInCompatibilityUUIDs | Array   | 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 |

DVTPlugInCompatibilityUUIDsはXcodeのVersionによって違うので、複数対応する場合は複数の値を入れれば良い。

過去のVersionなどを見たければ[Alcatraz-Info.plist](https://github.com/supermarin/Alcatraz/blob/master/Alcatraz/Alcatraz-Info.plist)などを参照すると良い。

現状使ってるXcodeのDVTPlugInCompatibilityUUIDsを調べる場合は下記コマンドをTerminalで実行すれば良い。

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/8eaad437-5690-11f3-a7a8-d1aac99a7d64.png" width=450 />


#### Build Setting

| 設定名                               | 値                                                          |
|--------------------------------------|-------------------------------------------------------------|
| Installation Build Products Location | $(HOME)                                                     |
| Installation Directory               | /Library/Application Support/Developer/Shared/Xcode/Plug-ins |
| Deployment Location                  | YES                                                         |
| Embedded Content Contains Swift Code | YES                                                         |
| Skip Install                         | NO                                                       |



### Hello World

#### プログラム

適当にHelloPlugin.swiftというファイルを作って下記を書いてみる。

```HelloPlugin.swift
import Foundation

class HelloPlugin: NSObject {
    
    class func pluginDidLoad(plugin: NSBundle) {
        NSLog("Hello Plugin!")
    }
    
}
```

そして、ビルド(Cmd + B)したのちに、「$(HOME)/Library/Application Support/Developer/Shared/Xcode/Plug-ins」に「HelloPlugin.xcplugin」ができていれば完了です。

下記コマンドで確認できます。

```
ls ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins 
```

#### 確認

上記までやったら、一度Xcodeを閉じて、再度開きましょう。

すると、下記のようなダイアログがでてくるので「Load Budnle」を押します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/6364cd45-298c-8fce-08a1-7096c0e67f5b.png" width=450 />


起動した時に、先ほどのpluginDidLoadは呼ばれ、さらにNSLogの出力は `/var/log/system.log`にはかれるのでこのlogを確認します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/61d53176-83ce-daaf-46ae-1f12d6bb5802.png" width=150 />

#### ちなみに。。

NSLogを継承してなかったり、NSLogじゃなくてprintにした場合は出力されなかった。

### まとめ

これから先が大変そうなんですが、ここまででも「Skip Install」を「No」にするとか幾つか見た限りではどこにも載ってなくて心折れかけました。