Apple Silicon MacでiOSアプリ開発は可能なのか？

こんにちは。都内でiOSエンジニアをやっております、 @zrn-ns です。

Apple Silicon搭載MacBook Airを使用し始めて、半月ほどが経過しました。
使うたび、その挙動の機敏さや排熱の少なさ、バッテリー持ちに感動します。

しかし、**開発用途で使い始めると、これまでのIntel製チップでは発生しなかった多くの問題にぶち当たり、その対処に多くの時間を割く羽目になりました。**
（既存のプロジェクトをビルドできる状態にするまでに1週間ほどを費やしました）

これからApple Silicon搭載Macを買うiOSエンジニアの方向けに、レポートを残そうと思います。

## 🏃‍♂️TL;DR

M1 Macはまだ手放しではおすすめできない。
iOSアプリ開発をこれから始める人やあまり熟練度の高くない人はIntel Macを購入したほうが無難。

## オフィスワーク用途としてのコスパは申し分ない

**オフィスワークやネットサーフィン等の用途であれば、このMacは間違いなく『買い』です。**
普段のネットサーフィンや文字書き、オフィスワーク程度の用途であれば、間違いなく今まで出会ったノートPCの中でも最高のノートPCだと思います。

Appleが初めてリリースしたApple Silicon搭載Macであるにも関わらず、ハードウェアの不具合は非常に少なく（全く無いわけではないですが）、驚くほど快適に動作します。

## ハードウェアの制約

多くはないのですが、ディスプレイ周りの不具合に遭遇したので、記載しておきます。

### スリープ解除時に外付けディスプレイの挙動が安定しない

僕はMacBook Airを[CalDigit TS3 Plus(Thunderbolt 3接続のドッキングステーション)](https://amzn.to/2LjZT44)に接続して利用しています。
このDockはBelkinなどの他社のDockと比べてもかなり安定して動作するのでかなり気に入って使っているのですが、このDockを経由して外付けディスプレイを接続した場合、**スリープ復帰時にディスプレイの接続ができないことがあります。**（体感で3日に1回ほどの頻度で発生します）

Dockの問題である可能性もありますが、手元にあるIntel Macでは発生しないため、モニター側の問題でないのは確かです。

### DDC/CI系のユーティリティがうまく動作しない

僕は普段[Lunar](https://github.com/alin23/Lunar)というユーティリティを使用しています。
これはDDC/CIというプロトコルを使用することで、Mac側から外部ディスプレイのコントラストや明るさを調整できるもので、これを使用することでMac側の画面の明るさと外部ディスプレイの明るさを同期させることができます。

しかし**Apple Silicon搭載Macでは現状DDC/CIに対応していない**らしく、これらのユーティリティは動作しないようです。
M1チップの制限なのかはわかりませんが、今後解消することを祈ります。

## Apple Silicon搭載MacでiOS開発はできるのか？

少なくとも僕の環境では、M1 Macでアプリ開発ができる状態が整いました。

しかしすべてネイティブで動作しているわけではなく、それなりに痛みを伴っています。

### 基本的にターミナルはRosettaで起動して使っている

**ターミナルをRosettaを使用して開くことで、多くのツールはM1 Macで動作します。**
BundlerやFastlane, CocoaPodsについてはRosettaを噛ませることで問題なく動作しました。
（一応オーバーヘッドが発生するはずですが、ほぼ体感できないレベルです）

### Homebrewは基本的にRosettaを使用したほうがよさそう

実はHomebrewはM1対応のものがすでにbetaですがリリースされており、利用できる状態になっています。
しかし**HomebrewがM1に対応していたとしても、Homebrew経由でインストールするツールにはM1に対応していないものがまだ多く**、M1対応のHomebrewをメインで使うのはまだ厳しい印象です。

基本的には、これからしばらくの間は、HomebrewはRosettaを使用して使用することをおすすめします。

### Firebase関連はSwiftPackageManagerに移した

FirebaseはこれまでCocoaPodsで管理していたのですが、M1対応は専用のブランチでbeta対応中らしく、**Apple SiliconとIntel両方でビルドできるようにするために、FirebaseをSwift Package Managerに移行しました。**

SwiftPM版はすでにApple Siliconへの対応が行われていますが、まだいくつか問題があります。

- Archive時（fastlane含む）、フレームワークが重複することでエラーが発生する
    - 参考: [Xcode12 + SwiftPM + Firebase iOS SDKの注意点 - Qiita](https://qiita.com/temoki/items/da91bffe5a347103b0ca)
- SwiftPMでCrashlyticsを使用する場合、dSYMアップロード用のスクリプトの場所がうまく取れなくなるため、何らかのワークアラウンドを適用する必要がある
    - 参考: [Firebase iOS SDKをSwift Package Managerでいれてみた - Qiita](https://qiita.com/yuki-o/items/0fe6c4b2af602f4058c2#%E3%81%8A%E3%81%BE%E3%81%91)

### NimbleのアサーションマッチャーはApple Siliconでは動作しない

マッチャーライブラリの[Quick/Nimble](https://github.com/Quick/Nimble#swift-assertions)の機能である**Assertion Matcherは、x64-86アーキテクチャでしか動作しない**ため、arm64アーキテクチャを採用するApple Siliconでは動作しないようです。
今後解消される可能性はありますが、fatalError()の検証ができないのは少し不便ですね。

### Carthageについては多分うまく動かない

今回のプロジェクトではCarthageを使用していないため検証できていないのですが、**CarthageではまだApple Siliconへの対応が不十分なようなので、うまく動作しないと思われます。**

具体的には、Xcode12でCarthageを使用するには公式が提示している[ワークアラウンドスクリプト](https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md)を適用する必要があるのですが、これを使用するとApple Silicon Mac向けのバイナリが削除されるため、うまく動作しなくなるはずです。

### その他は特に問題なさそう

Mint, CocoaPods, Swift Package Managerを使用しているプロジェクトでは、概ね正常にビルドができる環境が整いました。（おそらく同様の構成であれば、同じように動作させることは可能かと思います）

参考までに、僕の環境で正常に動作したツールの一覧を記載しておきます。

### Rosetta2で動作

- Homebrew
    - vim
    - ggrep
    - Mint
        - SwiftLint
        - LicensePlist
        - periphery
- Bundler
    - Fastlane
    - CocoaPods
        - Quick/Nimble


### ネイティブで動作

- Xcode12, SwiftPM
    - Alamofire
    - SDWebImage
    - SwiftyJSON
    - RxSwift
    - Firebase
    - RSKImageCropper

## 総括

iOSアプリ開発において、現行のすべてのMacの中でもかなり上位のパフォーマンスを誇るApple Silicon搭載Macですが、しばらく使ってみて、やはりまだ手放しにおすすめはできないと感じました。

iOSアプリ開発をするとき、Xcodeから吐き出される意味不明なエラーに苦しめられることがよくあります。多くの場合、先人が同様の問題にぶち当たり、何らかのワークアラウンドが提供されていることが多いのですが、Apple Silicon搭載Macで表示されるエラーはその限りではありません。

**問題の解決そのものを楽しめる人（もしくはその問題を誰かが解消するまで待てる人）でなければ、メインの開発機としてApple Silicon Macを購入するのはやめたほうが無難かもしれません。**
（特にアプリ開発初心者の方にはハードルが高い可能性がありますので、もう少し様子を見ることをおすすめします。）

ただし、よくわからないエラーに多く見舞われる分、問題の調査や原因の切り分け能力はつくかと思います。
たびたび発生する意味不明なエラーを、自力で解決する気概がある方にはおすすめしますので、是非購入を検討してみてはいかがでしょうか。