ReactNative 0.56.0でAndroidの予想変換時の絵文字入力でのクラッシュが治ってるとのことで、「さっそくアップデートだ!」と意気込んでいたのだが、泥沼だった。いろいろあったので、対応したことをメモしておく。アップデートはreact-native-git-upgrade
コマンドで行っている。
pod installが失敗する
まずは、pod install
が失敗した。何個かReactNativeのアプリでアップデートを試して、2つのケースがあった。
third partyを記載してなかった問題
あるアプリでは、PodfileにReactとyogaは記載していたが、third partyを記載してなかった。なぜ、これで以前まで動いていたのか謎だが、とりあえず0.56では動かなくなってしまった。
# Third party deps podspec link pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
を記載して、pod install
で動いた。
third partyを記載していたアプリで、Follyがエラーを出す
あるアプリでは、third partyを記載していたので、以下のようなエラーがでた。
[!] CocoaPods could not find compatible versions for pod "Folly": In Podfile: React/CxxBridge (from `../node_modules/react-native`) was resolved to 0.56.0, which depends on Folly (= 2016.10.31.00) None of your spec sources contain a spec satisfying the dependency: `Folly (= 2016.10.31.00)`. You have either: * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`. * mistyped the name or version. * not added the source repo that hosts the Podspec to your Podfile. Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.
pod repo update
しても、同じエラーが出て動いてくれない。しかし、pod update
したら動いた。よかった。
iOSビルドでglogがエラーを出す
pod install
もできたし、ビルドするぞー!って思ったら、エラー。悲しい。
glog-0.3.4/src/base/mutex.h:105:10: fatal error: 'config.h' file not found
調べていたら、解決策を見つけた。良かった。
cd node_modules/react-native/third-party/glog-0.3.4 ./configure make make install
これで、iOSは無事ビルドができた。
Androidのビルドができない
Androidをビルドしようとすると下記のようなエラーがでる
* What went wrong: A problem occurred configuring project ':app'. > Could not resolve all dependencies for configuration ':app:_debugApk'. > A problem occurred configuring project ':react-native-billing'. > The SDK Build Tools revision (23.0.1) is too low for project ':react-native-billing'. Minimum required is 25.0.0
react-native-billingというライブラリでのエラーだが、これだけではなく、ほぼすべてのライブラリで同様のエラーが出る。調べていたら、解決策を見つけた。見つけるの大変だった。Androidのネイティブ開発したことないので、こういうエラーはキツイ。
android/build.gradleに下記を追加
subprojects { afterEvaluate {project -> if (project.hasProperty("android")) { android { compileSdkVersion 26 buildToolsVersion '26.0.3' } } } }
ReactNative側のエラー
これで、iOSもAndroidもビルドができたぞー!と思ったら、ReactNative側のエラーに何個か遭遇した
babel-preset-react-nativeが古い
error: bundling failed: TypeError: Cannot read property 'bindings' of null
何だこのエラーはと思い調べてたら、issueがたっていた。babel-preset-react-nativeが古かったみたい。
npm i -U babel-preset-react-native@5.0.2 --save-dev
reactotronがエラーを出す
Unknown named module: 'NativeModules'
という、何がエラーを出してるのかわからない状態になった。どうも調べていくと、reactotronの問題みたいだ。最近、reactotronのv2が出るリリースされるタイミングで治ってる?みたい。
ただ、僕が修正したときはv1系で、まだ対応がなされていなく、アップデートするのもめんどくさかった(そもそもreactotronを使ってなかった)ので、reactotronを使っているところをコメントアウトした。気が向いたら、v2にアップデートしてみようと思う。
allowFontScalingが設定できない?
Cannot set property 'allowFontScaling' of undefined
というエラーが出た。なんだこれは、と思っていたら、下記のコードがまずかったようだ。defaultProps
って使えなくなったのかな?とりあえず、コメントアウトした。
Text.defaultProps.allowFontScaling = true
ReactNative 0.56にアップデートしたぞ
僕のアプリでは、上記の対応で、ReactNative 0.56へアップデートできた。Androidのクラッシュバグが減ったので、対応してよかった。