Slide 1

Slide 1 text

React Native 製アプリで Android 版をリリースする際 にハマったポイント 2 選 Ichiki Sato (@ichiki1023)

Slide 2

Slide 2 text

自己紹介 Ichiki Sato (@ichiki1023) 株式会社マイベスト (2024 年 4 月から! ) 現在育休中の 2 児の父 React Native は 3 年のブランクを経て 4 月から 奮闘中 経験としては iOS/Web のみで Android は未経験

Slide 3

Slide 3 text

マイベスト - 商品比較サービス

Slide 4

Slide 4 text

今日のおはなし iOS Only だった React Native 製 のアプリで Android 版をリリースするまでに特にハマ ったポイントが 2 つあったのでそのお話をさせてください!

Slide 5

Slide 5 text

ハマったポイント 1. テキストの高さがズレる問題 2. 画像周りのパーミッション問題

Slide 6

Slide 6 text

はじめに ビルドを通すために色々設定した やったことの例 環境変数の設定 モジュールのアップデート React Native Firebase の Android 対応

Slide 7

Slide 7 text

思っていたよりもすぐに起動できた

Slide 8

Slide 8 text

ただよく見ると。 。

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

なんかズレてる。 。

Slide 11

Slide 11 text

ハマったポイント 1. テキストの高さがズレる問題

Slide 12

Slide 12 text

分かったこと Android のデフォルトのフォントは日本語だと NotoSansCJKJP 上記だと lineHeight が大きめに勝手に設定されている (っぽい ) 調査した感じだとおおよそ 10~15% フォントそのものに includeFontPadding も効いてなさそう フォント上部の方が余白が大きいので下にズレて見える デフォルトではなくフォントをダウンロードして NotoSansJP にしても変わらなか った 参考 : Android アプリで Line Height を 
 設定するときに注意したいこと 1. テキストの高さがズレる問題

Slide 13

Slide 13 text

対策 Android のみ lineHeight を 1.1 で割り縮小することでデフォルトで加わっている余 分差をなくす (1.1 ~ 1.15 を比較 & 計算した結果最適な値を設定 ) マイベストでは基本的に lineHeight まで細かくデザインシステムで管理しているため、 縮小することで本来の期待するデザインに力技で合わせにいく 1. テキストの高さがズレる問題

Slide 14

Slide 14 text

改善後 1. テキストの高さがズレる問題

Slide 15

Slide 15 text

ハマったポイント 2. 画像周りのパーミッション問題

Slide 16

Slide 16 text

(iOS での経験上 ) パーミッションをしっかりと定義しておかないと ストアの審査で Reject を受ける可能性が高いので、追加しておく 2. 画像周りのパーミッション問題

Slide 17

Slide 17 text

画像周りの権限追加 マイベストのアプリで取得していた主な権限 写真 (プロフィール写真用 ) カメラ (プロフィール写真用 ) android/app/src/main/AndroidManifest.xml に画像周りで必要な権限を追加しておく 2. 画像周りのパーミッション問題

Slide 18

Slide 18 text

ただ、使用しているライブラリにこんな一文が ref: https://github.com/react-native-image-picker/react-native-image-picker? tab=readme-ov-file#android-1

Slide 19

Slide 19 text

権限不要。 。 。? プロフィール画像の写真選択 & 撮影をするのに権限不要 ? react-native-image-picker を使用していたが、 Android の場合権限は不要なことが 判明。 ref: https://github.com/react-native-image-picker/react-native-image-picker? tab=readme-ov-file#android-1 2. 画像周りのパーミッション問題

Slide 20

Slide 20 text

なぜ? 2. 画像周りのパーミッション問題

Slide 21

Slide 21 text

権限が不要な理由の深堀り ① react-native-image-picker の内部実装を見てみる if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (isSingleSelect && (isPhoto || isVideo)) { libraryIntent = new Intent(Intent.ACTION_PICK); } else { libraryIntent = new Intent(Intent.ACTION_GET_CONTENT); libraryIntent.addCategory(Intent.CATEGORY_OPENABLE); } } else { libraryIntent = new Intent(MediaStore.ACTION_PICK_IMAGES); } https://github.com/react-native-image-picker/react-native-image- picker/.../ImagePickerModuleImpl.java#L128C1-L137C10 2. 画像周りのパーミッション問題

Slide 22

Slide 22 text

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (isSingleSelect && (isPhoto || isVideo)) { libraryIntent = new Intent(Intent.ACTION_PICK); } else { libraryIntent = new Intent(Intent.ACTION_GET_CONTENT); libraryIntent.addCategory(Intent.CATEGORY_OPENABLE); } } else { libraryIntent = new Intent(MediaStore.ACTION_PICK_IMAGES); } Intent というものが使われていて、バージョンと画像の選択数によって使用するアクシ ョンを分けているみたい。

Slide 23

Slide 23 text

権限が不要な理由の深堀り ② 先ほどのコードを訳すとこんな感じ 13 未満かつ単一の選択 : Intent.ACTION_PICK を使用する 13 未満かつ複数の選択 : Intent.ACTION_GET_CONTENT を使用する 13 以降 : MediaStore.ACTION_PICK_IMAGES (PhotoPicker)を使用する 2. 画像周りのパーミッション問題

Slide 24

Slide 24 text

Intent とは? https://developer.android.com/guide/components/intents-filters?hl=ja Intent は、アクションのリクエストに使用できるメッセージ オブジェクト 別のア プリ コンポーネントから。 2. 画像周りのパーミッション問題

Slide 25

Slide 25 text

。 。 。 。 。 。 。 2. 画像周りのパーミッション問題

Slide 26

Slide 26 text

色々調べた結果 アクションを指定すると、それを実行できる端末上のアプリが起動されるものらし い。 2. 画像周りのパーミッション問題

Slide 27

Slide 27 text

つまり react-native-image-picker では Intent が使用されている Intent はアクション(動作)を指定して、それを実行できる端末上のアプリを起動 する仕組み Intent を使用して画像の選択を PhotoPicker 含めて外部アプリに任せると個別のア プリ側では権限取得は不要になる ということらしい 2. 画像周りのパーミッション問題

Slide 28

Slide 28 text

なるほど! 2. 画像周りのパーミッション問題

Slide 29

Slide 29 text

不必要なパーミッションは削除しておく 不要なことが判明したので追加していた権限を AndroidManifest.xml から削除する 2. 画像周りのパーミッション問題

Slide 30

Slide 30 text

その後無事 2024/09/25 に 1st リリース公開完了 権限周りも問題なかった!

Slide 31

Slide 31 text

まとめ iOS 版でアプリケーションとしての形はできていたので、コードを直接修正するの はごくわずかで済んだ (React Native 最高 ) ただし Android の前提知識はかなり必要なのでひたすらキャッチアップをしていく 必要があってそれが大変

Slide 32

Slide 32 text

ご清聴ありがとうございました