react-nativeを引き継いだときに苦労したこと(iOS)

はじめに

外注に投げていたreact-nativeアプリを引き継ぐことになった。 push通知はonesignalを使っていたのだが、appleの証明書がちょうど切れちゃったので、証明書を更新して頑張ってリリース申請するところまで頑張った。

今回はiOSのみだが、Androidもいずれ対応したい。

できたこと

iOSアプリをlocalでアプリをbuildしてarchiveし、AppStoreに申請を出した。 push通知が届くところまで確認が取れた。

環境構築

大前提、言語や環境のバージョンを 必ず 揃える。nodejsなんてそんな変わらんやろってノリで最新バージョンでbuildをしたら泣きをみた。

npm --version
6.4.1

node --version
v10.14.1

yarn --version
1.9.4

java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

pod --version 1.5.3

xCode Version 11.0 (11A420a)

Android Studio 3.1.2

macOS Mojave Version 10.14.6

react-native -v
react-native-cli: 2.0.1
react-native: 0.59.8

普通にyarn installすると node_modules/react-native/React/Base/RCTModuleMethod.mm がバグったままなので以下のように修正する。

static BOOL RCTParseUnused(const char **input)
{
   return RCTReadString(input, "__unused") ||
          RCTReadString(input, "__attribute__((__unused__))") ||
          RCTReadString(input, "__attribute__((unused))");
}

シミュレータを動かす

ネットの記事が当てにならなかったので verbose みて console.log で調べていった。

$ react-native run-ios --simulator="iPhone 11" --verbose

node_modules/@react-native-community/cli/build/commands/runIOS/findMatchingSimulator.js の68行目がバグなので以下のように変える必要がある。

if (!simulator.isAvailable) {
    continue;
}

そして以下のように simulator を指定して実行すれば動くはず

$ react-native run-ios --simulator="iPhone 11"

xcodeの証明書周り

appleの証明書の仕組みは詳しく理解できていない。ゲームチームの人に泣きついて解決した。

Automatically manage signing を使わず手動で設定。

実機buildするまで

僕は nodebrew を使っているため、 build phase は以下のように設定した。

export NODE_BINARY=$HOME/.nodebrew/current/bin/node
../node_modules/react-native/scripts/react-native-xcode.sh

リリースまで

envの扱いがわからなかったため、一旦以下のようにした

$ cp .env.prod .env.dev

versionbuild 番号でArchiveを走らせた。

あとは道なりに Upload や Next を押していった。

特に問題なさそうだったので、Appleにアプリ申請をした。

今わからないこと

  • react-native のenvの扱い方
  • Archive Buildにも何種類かある?
    • AppNameAppNameRelease がある
  • appleやxcodeの証明書周り(わからん。。。

終わりに

react-native厳しいのでは。。。みたいな気持ちになったけど、上のバグはだいたい治ってるみたいなのでちゃんとしたプロジェクトに入ってwebの技術の明るい未来を見たい。