前言:近期在苹果上架遇到问题,有一个老项目需要上架,提交App Store后,苹果对含有UIWebView API的App ,已经无法上传到App connect的后台。并会向您的开发者邮件发送以下错误信息:
Dear Developer,We identified one or more issues with a recent delivery for your app, “xxx” x.x.x (x).
Please correct the following issues, then upload again.ITMS-90809:
Deprecated API Usage - New apps that use UIWebView are no longer accepted.
Instead, use WKWebView for improved security and reliability.
Learn more (https://developer.apple.com/documentation/uikit/uiwebview).
Though you are not required to fix the following issues
但react-native是在RN 0.60中才把WebView彻底删除的,也就是说0.60以前的RN版本中,依旧包含UIWebView的API,导致上架被邮件驳回。
或者还有其他RN的组件使用了UIWebView。
经过查阅相关文档发现:
react-native 0.60+ (移除了webview,也就是移除了UIWebView)
react-native-webview 7.0.1+ (移除了UIWebView)
在RN 0.60以上和 react-native-webview 7.+以上的版本都已经移除了UIWebView,使用高于这个的版本就可以解决这种上架问题。如果使用了高于这些的版本,还被邮件驳回,说明是其他组件包含了UIWebView,该怎么办呢 ?
但如果你使用了 RN 0.60以下的版本,比如RN 0.55,你又不想升级RN版本,该怎么办?(主要怕一升级项目炸了,各种三方组件兼容问题爆炸)
解决办法:
首先根据在社区中大牛的方法可以进行全局搜索:
在项目根目录下运行 (注意最后有个点,别漏了)
grep -r UIWebView .
在RN 0.60以上搜索出来的基本上都是被*号注释的UIWebView的提示,这里不用管。或者是Android端存在UIWebView,UIWebView只针对于iOS,Android的不用管,注意区分。在RN 0.60以上和 react-native-webview 7.+以上的版本,如果还被邮件驳回,在这里就会搜出来包含UIWebView的组件,.a文件中的也会被搜出来。
我们可以在GitHub搜索解决办法,或者升级sdk,根据路径修改源码等方式,解决问题。
在RN 0.60以下的版本会搜索出来如下内容:
./node_modules/react-native/React/Views/RCTWebView.m:@interface RCTWebView () <UIWebViewDelegate, RCTAutoInsetsProtocol>
./node_modules/react-native/React/Views/RCTWebView.m: UIWebView *_webView;
./node_modules/react-native/React/Views/RCTWebView.m: _webView = [[UIWebView alloc] initWithFrame:self.bounds];
./node_modules/react-native/React/Views/RCTWebView.m:#pragma mark - UIWebViewDelegate methods
./node_modules/react-native/React/Views/RCTWebView.m:- (BOOL)webView:(__unused UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
./node_modules/react-native/React/Views/RCTWebView.m: navigationType:(UIWebViewNavigationType)navigationType
./node_modules/react-native/React/Views/RCTWebView.m: @(UIWebViewNavigationTypeLinkClicked): @"click",
./node_modules/react-native/React/Views/RCTWebView.m: @(UIWebViewNavigationTypeFormSubmitted): @"formsubmit",
./node_modules/react-native/React/Views/RCTWebView.m: @(UIWebViewNavigationTypeBackForward): @"backforward",
./node_modules/react-native/React/Views/RCTWebView.m: @(UIWebViewNavigationTypeReload): @"reload",
./node_modules/react-native/React/Views/RCTWebView.m: @(UIWebViewNavigationTypeFormResubmitted): @"formresubmit",
./node_modules/react-native/React/Views/RCTWebView.m: @(UIWebViewNavigationTypeOther): @"other",
./node_modules/react-native/React/Views/RCTWebView.m:- (void)webView:(__unused UIWebView *)webView didFailLoadWithError:(NSError *)error
./node_modules/react-native/React/Views/RCTWebView.m: // Error code 102 "Frame load interrupted" is raised by the UIWebView if
./node_modules/react-native/React/Views/RCTWebView.m:- (void)webViewDidFinishLoad:(UIWebView *)webView
在./node_modules/react-native/React/Views/RCTWebView.m中,使用到了UIWebView。
我们使用XCode打开这个文件 Libraries->React.xcodeproj->React->Views 中 打开RCTWebView.m文件
会看到这个文件里包含UIWebView的API,然后我们把这个文件内容删除到只剩一个类名,删除完毕后如下图所示:
删除后就可以了,RN源码中就不包含UIWebView了。(因为js代码调用原生代码,你不使用那个方法他是不会报错的,所以这里是无需担心的)
如果项目中使用了WebView,请引入react-native-webview 7.0.1+的版本,并替换。
import WebView from 'react-native-webview';
这样就完成了修改。可与愉快的上架了。
如果修改完成后,还被邮件驳回提示有UIWebView的话,那么就重复grep -r UIWebView .搜索的步骤,找出来哪里的问题,在进行修改就可以了。