M1 Mac + Xcode 12.5.1でReact Native 0.65 アプリのビルド時に出たエラーと対応

この記事は[React Native Advent Calendar 2021](https://qiita.com/advent-calendar/2021/react-native)の24日目の記事です。

React Nativeでは0.66からM1やXcode 13サポートが入ったのですが、それ以前のバージョンである0.65.1とXcode 12.5.1でビルドを試みた時に出たエラーをまとめます。結果としては、Xcode 12.5.1でもシミュレーターを使用しない（Any iOS Device (arm64)）場合はビルドが成功しましたが、シミュレーター起動するとエラーになってしまう状況です。

# 環境

- MacBook Pro (14-inch, 2021), Apple M1 Pro
- macOS Monterey 12.0.1
- React Native 0.65.1
- Xcode 12.5.1
- node 14.17.0（エラーになるので後にアップデート）
- react-native-maps 0.25.0 （エラーになるので後にアップデート）

# React NativeのApple Silicon (M1)とXcode 13サポート

公式ブログで、React Native 0.66からApple Silicon (M1)がXcode 13、iOS 15と共にサポートされたことがアナウンスされました。0.66を使うことで、この記事にあるエラーのうちいくつかはなくなると期待されます。

https://reactnative.dev/blog/2021/10/01/version-066#better-support-for-apple-silicon-xcode-13-and-ios-15

# Xcode 12.5.1 が Monterey でサポートされていない対応

MontereyではXcode 12.5.1が起動できませんでした。Xcode 13はReact Native 0.66でサポートされたのですが、ビルドしたいアプリは0.65.1なので、Xcode 12.5.1でビルドする必要がありました。

## 対応策

Applicationsフォルダに Xcode 12.5.1 をインストール後、以下のコマンドで Monterey でも Xcode 12.5.1 が起動可能です。

```
/Applications/Xcode-12.5.1.app/Contents/MacOS/Xcode
```

https://stackoverflow.com/questions/69994916/how-can-i-run-xcode-12-5-1-on-monterey


# FATAL ERROR: wasm code commit Allocation failed - process out of memory

ビルド時に以下のエラーが出ました。

```
FATAL ERROR: wasm code commit Allocation failed - process out of memory
```

## 対応策

nodeのバージョンをv14.17.0以降にすることで、解決しました。

https://zenn.dev/catnose99/scraps/6c9e7ebabb6221

# xcrun: error: SDK "iphoneos" cannot be located

ビルド時に以下のエラーが出ました。

```
checking whether the C compiler works... no
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: unable to lookup item 'Path' in SDK 'iphoneos'
```

## 対応策

Xcodeのパスを設定することで、解決しました。

```
sudo xcode-select --switch /Applications/Xcode.app
```

# Xcodeでビルドすると node: No such file or directory

エラーログ

```
env: node: No such file or directory
```

## 対応策

以下の2つを実施しました。

### 1. Build Phasesの `Bundle React Native code and images` と `Upload Debug Symbols to Sentry` にnodeのパスを追加

例 : `export PATH="$HOME/.nodenv/shims:$PATH"`

https://qiita.com/miyomiyo344/items/458b675e50fc9140f76b

### 2. react-native-xcode.shを修正

issueを参考に、react-native-xcode.shを以下のように修正しました。

```diff
--- ./node_modules/react-native/scripts/react-native-xcode.sh	2021-10-09 02:10:24.000000000 +0200
+++ ./node_modules/react-native/scripts/react-native-xcode.sh	2021-10-09 02:32:09.000000000 +0200
@@ -81,7 +81,7 @@
 
 # Find path to Node
 # shellcheck source=/dev/null
-source "$RN_DIR/scripts/find-node.sh"
+source "$REACT_NATIVE_DIR/scripts/find-node.sh"
```

https://github.com/facebook/react-native/issues/32168


# GoogleMapsがコンパイルできない（未解決）

エラーログ

```
ld: building for iOS Simulator, but linking in object file built for iOS, file '/Users/shoken/Git/kitchhike_apps/ios/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps' for architecture arm64
```

## 対応策

react-native-mapsのバージョンをv0.30.0上げたらビルドができたという情報がissueに上がっていました。

https://github.com/react-native-maps/react-native-maps/issues/4029

package.jsonを修正し、react-native-mapsのバージョンをv0.30.0に上げると、CocoaPodsで依存エラーが起きます。

```
[!] CocoaPods could not find compatible versions for pod "Google-Maps-iOS-Utils":
  In snapshot (Podfile.lock):
    Google-Maps-iOS-Utils (= 2.1.0)

  In Podfile:
    react-native-google-maps (from `../node_modules/react-native-maps`) was resolved to 0.30.0, which depends on
      Google-Maps-iOS-Utils (= 3.10.3)


You have either:
 * changed the constraints of dependency `Google-Maps-iOS-Utils` inside your development pod `react-native-google-maps`.
   You should run `pod update Google-Maps-iOS-Utils` to apply changes you've made.
```


その後、Google-Maps-iOS-UtilsとGoogleMaps の2つを、pod updateする。

```
pod update Google-Maps-iOS-Utils GoogleMaps
```

Xcode 12.5.1でシミュレーターを使用しない（Any iOS Device (arm64)）場合はビルドが成功するようになりました。ただし、シミュレーター起動でのビルドだと、GoogleMapsがエラーになります。

12/1にアナウンスされた、M1対応のMaps SDK 6.0が使われているGoogleMaps 6.0.1にしたいのですが、 react-native-maps 0.30.0はGoogleMaps 5.1.0依存となっている状況です。

https://cloud.google.com/blog/ja/products/maps-platform/announcing-version-60-maps-and-places-sdks-ios

react-native-mapsに、GoogleMaps 5.x依存をなくし、バージョンを更新できないかというissueが上がっているので、こちらが対応されたらM1 Macでもビルドができるようになりそうです。

https://github.com/react-native-maps/react-native-maps/issues/4016