もふもふ技術部

IT技術系mofmofメディア

Expo + React NativeでBare WorkflowにejectしてAppleストアリリース出来る状態にする

Expo + React Nativeで個人アプリ開発をしていてストア公開までようやくいけた。

Ricetta(リチェッタ)というレシピ管理アプリで、WEB上のレシピのURLを登録していくことで、レシピを集約管理出来るっていうコンセプトです。開発期間はたしか1週間くらいなので、Expoは本当に便利だなあと感激しました。

https://apps.apple.com/jp/app/ricetta-%E3%83%AA%E3%83%81%E3%82%A7%E3%83%83%E3%82%BF-%E3%83%AC%E3%82%B7%E3%83%94%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E7%AE%A1%E7%90%86/id1529053735?l=en

Expoで普通に開発する場合、Managed workflowがデフォルトで、ストアアップロードまでコマンド一発でやってくれるんですが、ejectしてBare workflowにしてしまうとipaファイルのビルドからアップロードまでXCodeを通して自分でやらないといけなくなります。ちょっとハマってしまったのでブログに残しておきます。

iOSアプリをストア公開するためにはApple Developer Programに登録・設定する必要があるのですが、その辺はいろんなブログで解説されているので省略します。

とりあえずアプリを準備

プロジェクト生成時にテンプレート選択出来るが、最初からBare workflowで生成されるminimal (TypeScript) を選択する。

$ expo init ExpoBareSample

? Choose a template:
  ----- Managed workflow -----
  blank                 a minimal app as clean as an empty canvas
  blank (TypeScript)    same as blank but with TypeScript configuration
  tabs (TypeScript)     several example screens and tabs using react-navigation and TypeScript
  ----- Bare workflow -----
❯ minimal               bare and minimal, just the essentials to get you started
  minimal (TypeScript)  same as minimal but with TypeScript configuration

起動してみる。

$ cd ExpoBareSample
$ expo start

なんかエラー。

Error: ENOENT: no such file or directory, scandir '/Users/atsushiharada/source/ExpoBareSample/assets'

どうやらassetsディレクトリがない。自動的にデフォルトのアプリのアイコンとかが入ってくるディレクトリだったと思うけど生成されていない。

仕方ないので更にejectしてみる。

$ expo eject

うーんやっぱりダメか。一旦プロジェクトを削除してやり直す。

$ rm -rf ExpoBareSample

expoのバージョンが古いのでは?と思ったので確かめる。

$ expo --version
3.22.3

アップデートする。

$ npm install --global expo-cli
$ expo --version
3.28.1

再びプロジェクトを生成して起動してみる。

$ expo init ExpoBareSample
$ cd ExpoBareSample
$ expo start

同じエラーはまだでてるけど動くようになった!

ストア公開用にビルドする

公式チュートリアルによるとBare workflowのリリースについてはサポートされていない。それぞれでいい感じにやってよねっていうスタイルである。つまり、expo buildコマンドなどでipaファイルなどのアーカイブを作っても動かない。

Releasing to App Store and Play Store

This is entirely up to you! The Expo build service does not yet support builds for the bare workflow.

Bare Workflow Walkthrough - Expo Documentation

ググったりQiita見たりしたけども、Bare workflowでのリリースの事例は見つけられなかったので困った。

プロジェクト配下のiosディレクトリは以下のような構成になっている。分かる人にはすぐ分かると思うけど、CocoaPods使ったiOSプロジェクトの標準的構成である。つまりこのiOSプロジェクトをそのままXCodeでビルドすればいい。

$ cd ios                                                                     $ ls -l                                                             total 56
drwxr-xr-x  11 atsushiharada  staff    352 10 21 15:15 ExpoBareSample
drwxr-xr-x@  6 atsushiharada  staff    192 10 21 17:51 ExpoBareSample.xcodeproj
drwxr-xr-x@  5 atsushiharada  staff    160 10 21 15:17 ExpoBareSample.xcworkspace
-rw-r--r--   1 atsushiharada  staff    632 10 21 15:14 Podfile
-rw-r--r--   1 atsushiharada  staff  23842 10 21 15:15 Podfile.lock
drwxr-xr-x  22 atsushiharada  staff    704 10 21 18:01 Pods

XCodeでプロジェクトを開く。

$ open ExpoBareSample.xcworkspace

とりあえずシミュレーターで起動できるか確かめる。そのままXCodeで再生ボタンみたいのを押せば良い。

エラーになった。

error: Build input file cannot be found: '/Users/atsushiharada/Library/Developer/Xcode/DerivedData/ExpoBareSample-gotguwvydjciulazbvpdinjrwhci/Build/Products/Debug-iphonesimulator/ExpoBareSample.app/ExpoBareSample' (in target 'ExpoBareSample' from project 'ExpoBareSample')

うーん。cleanしてもなにしても出来ない。。

iosディレクトリを再生成してみる。ejectすれば何度でもiosフォルダとandroidフォルダを生成できる模様。

$ rm -rf ios
$ expo eject

がしかしエラーは解消しない。

ちょっとググってみたらドンピシャっぽいページ見つけた。

javascript - Bare expo app won't compile for Ios: Showing All Messages Build input file cannot be found - Stack Overflow

XCodeのアップデートしろと言ってるのでApp StoreからXCodeをアップデートした。

動くんかーい!

そういえば前回やったときも結局XCodeのアップデートで動くようになったことを思い出した。Expoの開発は勢いがあるのでガンガン進化しているのかも知れない。とりあえずXCodeでビルドできないってなった際はとりあえずXCodeのアップデートがないか確かめるのが良さそう。

(iOSアプリ開発の基本知識だけど)ストア用のビルドは、メニューの Product -> Archive から作成する。このとき、デバイスAny iOS Deviceを選択する必要がある。

またエラーが出た。証明書関係のエラーなので、Signing & CapabilitiesからTeamを設定すれば後は勝手にいい感じにやってくれる。

**Showing Recent Messages**
Signing for "ExpoBareSample" requires a development team. Select a development team in the Signing & Capabilities editor.

これでリリース用ビルドが出来上がる! あとは普通のiOSアプリの公開と同様に、バイナリをアップロードしたら、iTunes Connect(だっけ?)からアプリ情報を登録して申請に出せばOK。