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吃飯的程序員。