官方参考文档:
http://facebook.github.io/react-native/docs/integration-with-existing-apps.html
既然是踩坑记,那么即使很好的follow官方文档也是会有一些问题存在的;但它仍然是我们最权威的参考。
step1: 对于一个从xcode模版新建的工程来说,集成rn不是一件很难的事(我本来以为cocoapods安装的依赖会和react native link的插件冲突,后来发现是我多虑了);主要的问题集中在pod文件上(这里附上我们的pod文件,可以看到,这个和文档推荐的不一样):
platform :ios, '8.0'
target 'DHCloud' do
# Your 'node_modules' directory is probably in the root of your project,
# but if not, adjust the `:path` accordingly
pod 'React', :path => '../node_modules/react-native', :subspecs => [
'Core',
'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43
'RCTText',
'RCTImage',
'RCTNetwork',
'BatchedBridge',
'CxxBridge',
'RCTWebSocket', # needed for debugging
# Add any other subspecs you want to use in your project
]
# Explicitly include Yoga if you are using RN >= 0.42.0
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
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'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'yoga'
target.build_configurations.each do |config|
config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'NO'
config.build_settings['GCC_WARN_64_TO_32_BIT_CONVERSION'] = 'NO'
end
end
end
end
我们使用的rn版本是0.52,所以我们需要cxxbridge,然后cxxbridge又依赖了一些别的东西,就是你们看到文件里写的那些(真的是一个都不能少)。而最下面那一行是为了解决编译yoga时候报错的问题,我理解这是一个facebook的瑕疵,实际上github上也有对应的issue存在。
step2:
我们通过一个新项目验证了一些东西以后,最终需要集成到现有的native项目中。首先遇到的困难来自于pod install:
[!] The `DHCloud [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods-DHCloud/Pods-DHCloud.debug.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
[!] The `DHCloud [Release]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods-DHCloud/Pods-DHCloud.release.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target
target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/
这些告警日志绝对不可以忽略,但是我错误的理解了它的意思,导致我浪费了很多时间在这上面。在执行命令并打印出这些日志以后,再在这个工程上操作是无法修复之前的错误的;它所提示的添加
$(inherited)
Print: Entry, ":CFBundleIdentifier", Does Not Exist
把它贴到搜索引擎以后得到的解决方案我认为对我这个问题来说明显是错误的(比如更新一些版本,重新运行命令,执行react-native upgrade之类);这里的提示信息很明显,应该是触发的脚本里面去找这个CFBundleIdentifier,但却找不到。那么我们就去工程文件里添加这个东西;但这个问题却并没有那么容易解决。经过很多次尝试之后我才发现,需要在项目的project的build setting里面去改这个东西,在target的build setting里面改还是会报错。在project里面改完了以后就ok了。
step4:
我们还希望集成realm,这是一个和native有关的库。运行install和link之后,有一个下载realm-sync-cocoa-xxx.tar.gz的过程,无论如何这一步是必须要完成的(很容易遇到网络方面的问题,需要自行解决了)。运行时又报告了一大堆i386下xxx link失败的问题;之前工程里面也有过这样的警告:
Target 'Pods-DHCloud' of project 'Pods' was rejected as an implicit dependency for 'libPods-DHCloud.a' because its architectures 'x86_64' didn't contain all required architectures 'i386 x86_64'
我们需要对i386这个东西引起特别注意:在现在的iOS项目中,这个architecture根本就是不需要的,模拟器是x86,真机是arm的。所以我们很可能是编译了不必要的架构引起了错误(因为realm不支持也不需要支持i386)。检查项目配置,把所有的架构的Build active architecture only 的debug配置都改成YES后,问题解决。
在集成的过程中,还有一些比较容易解决的小错误,这里就不一一列出了;集成是一个工程问题,需要快速有效的获取信息、设计出逻辑上完备、高效的步骤去验证想法,最终得到一个比较满意的结果,在这个过程中需要耐心、细心和缜密的逻辑思维,同时需要具备相关的背景知识,否则很可能不得其门而入。