React-native 项目升级Xcode 11全记录
react-native 版本
$ react-native --version
react-native-cli: 2.0.1
react-native: 0.57.7
版本比较早的项目,最近提交App store 出现warning
1.升级ios sdk 到13
2.包含UIWebview
不改掉的话4月以后可能就会被拒了。没办法,作为一个android出身的转行RN的苦逼码农,只能投身ios开发的行列,去对抗xcode。
第一步:直接App store 升级Xcode11
升级过程不表,其实早就可以升级,但是之前一直卡者一个编译问题,所以迟迟不肯升级,现在没办法了,只能先解决这个编译问题:duplicate symbols。
万能的google果然有类似的问题,虽然看起来这更像一个workaround。
个人理解这个应该是一个symbol 重复定义的问题,问题应该处在.a文件,但是.a文件来自第三方,所以目前能用这种workaround解决就先这样退而求其次吧。
react-native run-ios
试着run一下吧,发现立马就出新问题了
Can’t find iPhone X simulator
找不到可以启动的模拟器,之前在xcode 10上就遇到过类似的问题。当时还是修改的findMatchingSimulator.js 后搞定的。这次不出意外,google还是告诉我这样改:
依样画葫芦,果然run起来了。第一个问题搞定。
新版Xcode新版sdk,这是Apple的规矩?!
但是有出现红屏问题,找不到__attribute__ bulabula…
还是靠google:
UIWebview
RN代码里没有显式的使用iOS的UIWebview,但是rn的文档说的很清楚,
- 在 上添加 useWebKit={true}
- 删除 Libraries/React.xcodeproj/React/Views/
RCTWebView.h、
RCTWebView.m、
RCTWebViewManager.h、R
CTWebViewManager.m
在代码中设置
useWebKit={true}
就会用WKWebview替代UIWebview。所以把js代码中把webview都加上这个设置。
同时还得把RN源码包里的对应文件删除。
打包上传,不OK,warning还在。
莫非原生代码里也有在使用UIWebview,grep 一把,果然有一处代码在使用UIWebview获取User Agent。不用UIWebview如何能拿到UA,找到替换方案即可:
WKWebView *emptyWebview = [[WKWebView alloc] init];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"www.baidu.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
[emptyWebview loadRequest:request];
[emptyWebview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
NSString *userAgent = result;
......
}];
OC语法生疏,看个大概意思:通过一个request才能拿到UA ?
改完这个再提交一次,还是不OK,还能有什么地方再用UIWebview?
在build目录中找
ios/build/Build/Products/Debug-iphonesimulator$ grep -rn UIWebview .
app 在build中的产物都会放到这个目录里去,所以在这个目录中应该可以找到线索。
果然*.app目录里match到了,除此之外还在其他的.a binary中匹配到了。可以理解第三方库的问题,去官网上查看,果然有对应问题的方案:升级版本。
升级之后再打包,终于OK!
结论得出:我是一个靠google吃饭的程序员。