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。
在這裏插入圖片描述

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章