React NativeのiOS13対応
May 17, 2020
少し前ですがReact NativeのアプリでiOS13対応を行ったので、そのときやったことをメモしておきます。 ちなみにExpoではなく素のReact Native(v0.61)です。
主にやったことは以下の3点です。
- ダークモード対応
- Sign in with Appleの実装
- LaunchImageからLaunchScreenへの移行
それでは1つずつ見ていきます。
ダークモード対応
codemotionapps/react-native-dark-modeのライブラリを使用しました。 対応方針として大きく3つあると思うのですが、
- デバイスの外観モードを反映する
- アプリ内で独自にモードの設定を持つ
- 上2つの案をmixする(ex. ライト・ダーク・アプリのモードを反映の3択から選べるようにする)
今回は1番簡単な「1. デバイスの外観モードを反映する」で進めました。 ライブラリの使い方は簡単で、以下のようにアプリ起動時のモードを取得できるため
import { initialMode } from 'react-native-dark-mode'
console.log('App started in', initialMode, 'mode') // 'light' or 'dark'
こんな感じのカラー定義ファイルを作ってコンポーネントで使うようにすると良いです。
import { initialMode, Mode } from 'react-native-dark-mode'
type ColorSchema = {
background: string
}
type Colors = { [mode in Mode]: ColorSchema }
const colors: Colors = {
light: {
background: 'white'
},
dark: {
background: 'black'
}
}
export default colors[initialMode]
ちなみにここまでの話だとアプリ起動中にiOSの設定から外観モードを変えてもリアルタイムでモードが反映されないので(再起動が必要)、
即時反映が必要な場合はreact-native-dark-modeで提供されているuseDarkMode
などのAPIを利用すると良いです。
あと、そもそもダークモード対応する前にそれぞれのモードのカラースキーマを作成する必要がありますが、 これはデザイナーの方に頑張っていただきました(感謝..🙇♂️
Sign in with Appleの実装
invertase/react-native-apple-authenticationのライブラリを使用しました。 実装自体は特に難しいところはなく、ライブラリのREADMEにあるように実装して、credentialを取得したらAPIに送って認証など、その後の手続きを作れば良いです。
デフォルトの「Sign in with Apple」ボタンではなく、カスタムのボタンを使う場合は以下のようにOSが対応しているか判定すると良いです。
import React from 'react'
import appleAuth from '@invertase/react-native-apple-authentication'
type Props = {}
export default function SignInWithAppleButton(props: Props) {
// Sign in with Appleをサポートしていなければボタン非表示
if (!appleAuth.isSupported || !appleAuth.isSignUpButtonSupported) {
return null
}
// ...
}
LaunchImageからLaunchScreenへの移行
React Nativeで書いてると普段意識することはないのですが、スプラッシュ画面の実装をLaunchImageからLaunchScreenに移行する必要があります。 こちらの記事を参考に移行しました。
React Native iOS Splash Screen with Storyboard - Echobind
ちなみに今回移行したアプリでは、crazycodeboy/react-native-splash-screenを使って JS層でスプラッシュ画面の制御を行っていたのですが、LaunchScreenに移行しても問題なく使用できました。
おわりに
今年の5月以降からダークモード等対応されてないものは申請リジェクトするよーという噂だったので、先月対応しました(対応がギリギリ😅)。 何かしら参考になると幸いです。