React-native 项目升级Xcode 11全记录

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。
React-native 项目升级Xcode 11全记录_第1张图片

万能的google果然有类似的问题,虽然看起来这更像一个workaround。

个人理解这个应该是一个symbol 重复定义的问题,问题应该处在.a文件,但是.a文件来自第三方,所以目前能用这种workaround解决就先这样退而求其次吧。

react-native run-ios

试着run一下吧,发现立马就出新问题了
Can’t find iPhone X simulator
找不到可以启动的模拟器,之前在xcode 10上就遇到过类似的问题。当时还是修改的findMatchingSimulator.js 后搞定的。这次不出意外,google还是告诉我这样改:
React-native 项目升级Xcode 11全记录_第2张图片

依样画葫芦,果然run起来了。第一个问题搞定。

新版Xcode新版sdk,这是Apple的规矩?!

但是有出现红屏问题,找不到__attribute__ bulabula…
还是靠google:
React-native 项目升级Xcode 11全记录_第3张图片

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吃饭的程序员。

你可能感兴趣的:(RN,xcode)