react-native 手动移除 iOS UIWebView 解决苹果上架问题

前言:近期在苹果上架遇到问题,有一个老项目需要上架,提交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 .搜索的步骤,找出来哪里的问题,在进行修改就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值