【Unity】Xcode11でiOSシミュレータ用のビルドをすると"Duplicate interface definition for class 'CAMetalLayer'"エラーになる

# はじめに
いつの間にかiOSシミュレータ用のビルドができなくなって困り、いろいろ調べたメモ。

# 経緯と症状
1. いつの間にかXcodeが起動できなくなった（勝手にXcodeがアップデートされた？）
<img width="456" alt="スクリーンショット 2019-09-24 16.08.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27863/744b6a1a-e8bd-16a7-ae26-0e46b1815027.png">

2. OSをアップデート、Xcode11が使えるように
3. シミュレータ用ビルドが以下のエラーで通らなくなった

>
Unity-iPhone > Classes > Unity > UnityMetalSupport.h > CAMetalLayer
Duplicate interface definition for class 'CAMetalLayer'
Property has a previous declaration
Property has a previous declaration
Property has a previous declaration
..
>

<img width="739" alt="スクリーンショット 2019-09-28 14.54.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27863/53b09dc8-7133-2d3c-05cd-b0ce08ee5c7c.png">

`Player Settings`の`Graphics APIs`の設定をガチャガチャいじってみても解決せず。

## 再現環境
* Unity
  * 2018.2.21f1
  * 2017.3.1f1
* Xcode11
* Target SDK：Sumulator SDK

# 原因
* [Apple’s iOS 13.1 Developer Beta 1 for iPhone Now Available — Before iOS 13's Stable Release](https://ios.gadgethacks.com/news/apples-ios-13-1-developer-beta-1-for-iphone-now-available-before-ios-13s-stable-release-0204325/)

>Xcode - New Features
>・CAMetalLayer is now available in Simulator. (45101325)

新しいXcodeではシミュレータでも `CAMetalLayer` というのが使えるようになったらしく、これまでUnityがシミュレータ用ビルド向けにゴニョゴニョしていた部分とコンフリクトを起こしているみたいです。

この問題は以下のIssue Trackerにも登録されていました。

* [[IOS] THE MULTI-DEFINITION ERRORS ARE THROWN WHEN BUILDING FOR SIMULATOR ON XCODE 11 BETA](https://issuetracker.unity3d.com/issues/ios-the-multi-definition-errors-are-thrown-when-building-for-simulator-on-xcode-11-beta?_ga=2.46208103.1359901718.1569816601-1015859591.1549007925)

Unityのリリースノートをたどったところ、以下のバージョンで対応済みのようです。

* [2019.2.3f1](https://unity3d.com/jp/unity/whats-new/2019.2.3)（2019/8/28リリース）
* [2018.4.9f1](https://unity3d.com/jp/unity/whats-new/2018.4.9)（2019/9/13リリース）

>iOS: Fixed simulator build on xcode11 beta (metal headers were added) - now we use headers if available instead of forcibly declaring symbols (1163876, 1170516)

2017.x系については最近のリリースノートを探しても見当たらなかったので未対応だと思われます（LTSのサポート切れ？）。

# 対処方法

## 使用するUnityのバージョンを上げる
先に述べたとおり2019.2.3f1,2018.4.9f1以降では対応済みなので、素直にUnityのバージョンを上げましょう。

ただし、2018.4.9-10は不具合があるとかでアップデートするかどうかは悩みどころ。

<font color="red"><b>2019/10/25(金)追記</b></font>

不具合が直ったみたいなので2018.4.11を使いましょう。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">引数付きのUnityEventsが使えなくなるUnity2018.4.9～.4.10の不具合は、Unity2018.4.11で修正されているのを確認しました。<a href="https://twitter.com/hashtag/Unity%E5%AE%B4?src=hash&amp;ref_src=twsrc%5Etfw">#Unity宴</a>　<a href="https://t.co/8x7ir8a2c2">https://t.co/8x7ir8a2c2</a></p>&mdash; 時村良平 (@rodostw) <a href="https://twitter.com/rodostw/status/1183551482181763073?ref_src=twsrc%5Etfw">October 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<font color="red"><b>追記ここまで</b></font>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unity2018.4.9はUnityに不具合があるため使用しないでください。<br>引数つきのUnityEventの挙動が不安定になるため、Unity公式のEventTriggerやSliderのほか、宴のイベント設定などが正常に動作しません。　<a href="https://twitter.com/hashtag/Unity%E5%AE%B4?src=hash&amp;ref_src=twsrc%5Etfw">#Unity宴</a><a href="https://t.co/B9HaQ99Sa1">https://t.co/B9HaQ99Sa1</a> <a href="https://t.co/EoQgn1ilxv">pic.twitter.com/EoQgn1ilxv</a></p>&mdash; 時村良平 (@rodostw) <a href="https://twitter.com/rodostw/status/1175406974109986816?ref_src=twsrc%5Etfw">September 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">引数つきのUnityEventsが使えなくなるUnity2018.4.9の不具合ですが、Unity2018.4.10でも解消されていませんでした。<br>Unity2018.4.9、Unity2018.4.10は使用しないようにしてください。 <a href="https://twitter.com/hashtag/Unity%E5%AE%B4?src=hash&amp;ref_src=twsrc%5Etfw">#Unity宴</a> <a href="https://t.co/8x7ir8a2c2">https://t.co/8x7ir8a2c2</a></p>&mdash; 時村良平 (@rodostw) <a href="https://twitter.com/rodostw/status/1179185499564437504?ref_src=twsrc%5Etfw">October 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 古いXcodeを使う
とりあえずXcode10.3なら問題なくビルドできたので、Unityをアップデートできない人は古いXcodeを使うしかないでしょう。iOS13の対応や今後のこともあるのであまりおすすめはしません。

* [Xcodeの旧バージョンをインストールする方法](https://qiita.com/TsukasaHasegawa/items/0d7d5c2cf3a2b8ce8993)

Xcodeが複数インストールしてあると`Build Settings`からビルドに使用するXcodeのバージョンを選択できます。
![Oct-02-2019 10-17-42.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27863/4d17c8f8-8dbe-5796-3910-f3c1a78b0509.gif)


# ちなみに
Xcode11ではApplication Loaderが同梱されなくなったそうです。

* [Application Loader亡き後の私たちはどうやってipaをアップロードするのか](https://blog.nkzn.info/entry/2019/09/22/181836)

ビルドをApplication LoaderでApp Store ConnectにアップロードするJenkinsおじさんとかがいたら死ぬので対応しましょう。