Global Shortcutで覚えにくい設計原則を確認しやすくするポップアップMacアプリを作った

設計原則、SOLIDとかKISSとかが覚えられないので、コードを書いたりしながら確認しやすいようにしたかった。ちょうどこんな記事があったので、真似したり改造してmacOSアプリを作ってみることにした。
[会社の行動規範浸透を図るため、メニューバーからいつでも確認できるアプリを作った🤔 \- Qiita](https://qiita.com/isaoeka/items/7a46ab5b7a8c09bff68f#comment-f3c5ec13f884855cdc58)

アプリのコードはGitHubにあげておきました。
https://github.com/ktanaka117/PrincipleCheatSheet

## メニューバーにポップアップを開くボタンを追加する

### 完成イメージ
<img width="650" alt="スクリーンショット 2018-12-22 18.15.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/1cdce8d0-d9bf-ac08-3f68-f8e850413a8d.png">

### 解説
このステップまでは、元ネタの記事を真似ればできますので省略します。

[会社の行動規範浸透を図るため、メニューバーからいつでも確認できるアプリを作った🤔 \- Qiita](https://qiita.com/isaoeka/items/7a46ab5b7a8c09bff68f#comment-f3c5ec13f884855cdc58)

## Global ShortCutでポップアップを開くようにする

### 完成イメージ

[アニメーションはこちらのTweetから。](https://twitter.com/ktanaka117/status/1076369123653779457)

コードを書きながらも確認可能。
<img width="1106" alt="スクリーンショット 2018-12-22 18.14.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/782bb32b-874d-5319-9f6c-48dd83a0d52f.png">

### 解説

コードを書いてる最中に、いちいちカーソルをメニューバーにうつしてポップアップを開いて...とするのが面倒だったので、ショートカットで開けるようにしたくなりました。例えば `Command + Ctrl + P` を押すと、すぐに開いてくれるみたいな。

グローバルショートカットを実装する方法はいくつかあるようですが、以下の記事を参考に [Magnet](https://github.com/Clipy/Magnet) というライブラリを利用して設定しました。

[Macアプリでグローバルホットキーを使用する \- Qiita](https://qiita.com/econa77/items/a415f8d0fd834164506a)

具体的なコードとしてはこんな感じでショートカットの登録ができます。

```swift
// 35 = p
guard let keyCombo = KeyCombo(keyCode: 35, cocoaModifiers: [.control, .command]) else { return }
let hotKey = HotKey(
        identifier: "CommandControlP",
        keyCombo: keyCombo,
        target: self,
        action: #selector(togglePopover(_:)))
hotKey.register()
```

keyCodeは以下で確認しました。
[MacOS フルキーボードのキーコード一覧 \- Qiita](https://qiita.com/baba163/items/e2390c4529ec0448151d)

## Xcodeの実行時以外も常駐させる

アーカイブして`.app`ファイルとして出力することで、アプリケーション化できます。
アプリケーション化すると、普段使っているXcodeとかその他アプリと同じように起動できるようになって、常駐するようになります。

### 手順
`Product > Archive`でプロジェクトをアーカイブを実行する。アーカイブが完了すると、以下のようにアーカイブ一覧を表示するウィンドウが表示されるので、`Distribute App`を押します。

<img width="1312" alt="スクリーンショット_2018-12-22_18_30_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/9e4c0f42-5578-5fba-2846-44fb46cb1e08.png">

`Development`を選んで`Next`

<img width="1312" alt="スクリーンショット_2018-12-22_18_33_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/5bcb0f2b-3f8b-be97-b601-5dd76ca0ff84.png">

適当なDevelopment Teamを選んで`Next`

<img width="1312" alt="スクリーンショット_2018-12-22_18_33_09.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/e2c014ff-e548-aa73-aa5e-87616a8ec61c.png">

signingはAutoでやっておきましょう。

<img width="1312" alt="スクリーンショット_2018-12-22_18_33_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/a310679d-2e91-d2b6-8408-b6fa2ab4cb74.png">

最後にExportを押して、Archiveの出力先を選択して終了。

<img width="1312" alt="スクリーンショット_2018-12-22_18_33_22.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/9921b731-697a-fb11-ee7d-a6e09f80ba8c.png">

保存したものの内容物がこんな感じです。写真だと一番右にある`.app`ファイルを開くと、アプリが常駐してくれるようになります。

<img width="882" alt="スクリーンショット 2018-12-22 18.38.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/88922eda-0cc2-73d6-0e5c-f301938a9c01.png">

## ハマりどころ

ライブラリをインストールするのはCocoaPodsを使いましたが、最新のXcodeでのビルドと相性が悪かったのか、エラーが出てハマりました。CocoaPodsのbetaバージョンをインストールすることで解決できました。
詳しくは以下の別記事にまとめました。

[macOS向けのxcworkspaceでこんなエラーが出たら: Command PhaseScriptExecution failed with a nonzero exit code - Qiita](https://qiita.com/ktanaka117/items/9becfa5ccef439764f5c)

## 感想

**はじめてのmacOSアプリが作れたぞ！！！やった！！！！！**

普段はiOSアプリを開発しているので、なんとなくの予想でArchiveによるアプリの常駐化までたどり着けました。ArchiveビルドがiOSと違って爆速だったのが感動ポイントでした。