ITMS-90809:不推荐使用的 API 使用——Apple 将停止接受使用 UIWebView API 的应用程序提交

Posted

技术标签:

【中文标题】ITMS-90809:不推荐使用的 API 使用——Apple 将停止接受使用 UIWebView API 的应用程序提交【英文标题】:ITMS-90809: Deprecated API Usage -- Apple will stop accepting submissions of apps that use UIWebView APIs 【发布时间】:2020-01-03 11:09:09 【问题描述】:

昨天,我将我的应用程序上传到了 TestFlight,过了一会儿,Apple 向我发送了这个警告:

ITMS-90809:已弃用的 API 使用 - Apple 将停止接受使用 UIWebView API 的应用提交。请参阅https://developer.apple.com/documentation/uikit/uiwebview 了解更多信息。

问题是我没有在我的应用程序中使用 UIWebView,所以我尝试更新我的 pod,但仍然是一样的东西。顺便说一下,这是我在 TestFlight 上的第三次构建,这是苹果第一次向我发送这个。有什么想法吗?

更新

这些是我的豆荚:

pod 'Firebase/Core'
pod 'Firebase/Firestore'
pod 'Firebase/MLVision'
pod 'Firebase/MLVisionTextModel'
pod 'SVProgressHUD'
pod 'SPPermission/Camera'
pod 'SPPermission/PhotoLibrary'
pod 'Mantis'
pod 'SwiftKeychainWrapper'
pod 'SwiftyOnboard'
pod 'Fabric'
pod 'Crashlytics'

更新 2

好像我找到了有问题的框架。

Binary file ./Pods/FirebaseMLCommon/Frameworks/FirebaseMLCommon.framework/FirebaseMLCommon matches
Binary file ./Pods/Crashlytics/ios/Crashlytics.framework/Crashlytics matches
Binary file ./Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision matches

那么现在我是否必须等待 google 修复它们并更新我的 pod?

【问题讨论】:

检查您正在使用的 Pod 以及它们是否使用 UIWebView。例如横幅 SDK,但您可能还想查看其他 SDK。 @Gerharbo 我只使用 Firebase pod,但在其中找不到 UIWebView。 对于那些使用cordova + reactjs(或angular)的人,请查看cordova-plugin-wkwebview-engine和cordova-plugin-wkwebviewxhrfix 【参考方案1】:

检查您是否在代码中使用 UIWebView 类;如果是,则用 WKWebView 替换您的实现,否则需要检查您的 Pod。

使用终端进入您的项目文件夹并执行命令: grep -r "UIWebView" .

必须更新所有匹配的 pod。 现在我被卡住了,因为我在 Google AdMob(版本 7.49.0)中找到了 UIWebView,我正在等待 Google 的新版本。

【讨论】:

当我在终端中输入命令时,我收到以下警告“grep: warning: recursive search of stdin”,并且即使在 30 分钟后也不返回任何响应。有什么想法吗? 完美运行。我用它来发现 UnityAds.framework 正在使用 UIWebView。他们需要更新到 WKWebView。 也许你会得到如下结果。二进制文件 /Users/xxx/xxxx/xxxx.xcworkspace/xcuserdata/xxx.xcuserdatad/UserInterfaceState.xcuserstate 匹配。我通过删除我的 xcworkspace 并再次安装 pod 解决了这个问题。 你还有这个@WilliamNardo 吗?即使我已经更新了预期的版本来修复它: "7.55.0 Removed all references to UIWebView. UIWebView is no longer supported.", Installing Google-Mobile-Ads-SDK 7.56.0 (was 7.53.1) ,我仍然得到Binary file Pods/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current/GoogleMobileAds.framework/GoogleMobileAds matches @DuraiAmuthan.H 检查您在 grep 命令末尾添加了句点/句号 (.)。我最初犯了同样的错误【参考方案2】:

您可以检查归档应用程序中的每个框架,以查看其中是否有任何引用 UIWebView。从命令行,cd 到存档的应用程序,例如:

cd ~/Library/Developer/Xcode/Archives/<date>/myapp.xcarchive/Products/Applications/myapp.app

在那里,使用nm 命令转储您的应用和每个应用框架的符号:

nm myapp | grep UIWeb
for framework in Frameworks/*.framework; do
  fname=$(basename $framework .framework)
  echo $fname
  nm $framework/$fname | grep UIWeb
done

这至少会告诉你哪个框架是罪魁祸首。

【讨论】:

感谢您的回答,这对您有很大帮助。我会用更多信息更新我的问题。 所以现在我唯一能做的就是等待谷歌解决问题? 是的,您需要等待(或自己修复它们并提交拉取请求)。我不确定删除所有使用 UIWebView 的确切截止日期是什么时候,但我非常怀疑它会在今年秋天发布 iOS 13 之前。 @Rudedog 我怎样才能修复我自己的框架?首先感谢您的回答......在按照您的回答之后,我似乎有 4 个框架正在使用 UIWebView>>>>>> Alamofire Cosmos NMSSH Stripe @johnny,您必须克隆每个存储库并找出它们在哪里使用 UIWebView,删除或替换使用它的代码,如果您希望您的更改返回到主库,则可能提交拉取请求存储库。或者,您可以等待维护人员自己修复它。正如我之前提到的,现在 Apple 只是警告开发人员,并没有真正拒绝二进制文件,所以你有一些时间等待上游维护者修复问题。【参考方案3】:

我将回答我自己的问题,因为我有关于这封电子邮件的消息。谷歌告诉我,有几张关于这个问题的票,他们会尽快解决这个问题。 同样,今天我的应用已获得 AppStore 的批准,因此暂时似乎只是一个警告。

【讨论】:

嗨,你能直接找到一些解决方案吗,我也面临同样的问题。应用程序即使在可能会受到冲击和试验之后也没有获得批准..【参考方案4】:

对于带有 cocoapods 的项目:

grep -r UIWebView Pods/ 

【讨论】:

【参考方案5】:

WKWebViewUIWebView 的替代品。如果您的代码中没有使用UIWebView,那么通过执行以下终端命令,您可以轻松了解哪个库仍在使用UIWebView 参考(不要错过.(点))。

从命令行,cd 到存档的应用程序,例如

cd ~/Library/Developer/Xcode/Archives/<date>/myapp.xcarchive/Products/Applications/myapp.app

然后运行

grep -r UIWebView

调用

 grep -r UIWebView /Path/To/Project/*

这将为您提供框架匹配的输出

./<ANY>.framework/Headers/ANY.h:#define ANYUseUIWebView ANY_NAME_PASTE(ANY_PREFIX_NAME, ANYUseUIWebView)

库匹配的输出

Binary file ./<FRAMEWORK-NAME>.framework/<LIB-FILE>.a matches

更新这些库

pod update

也可以查看Medium Article

【讨论】:

使用 "grep -r -F "UIWebView" 。而不是“grep -r UIWebView” 在 Mac 中使用“grep -r UIWebView”。在项目路径中(末尾有空格和点) 已经升级了所有使用 UIWebView 的 pod(例如 AFNetworking、ZDCChat)并且还检查了更新的 pod,因为它们已经针对 WKWebView 进行了升级,但 grep -r UIWebView . 仍然为我提供了与 @987654334 相同的 pod 列表@matches 和苹果在 iTunesconnect 上提交应用程序时也会发出警告 ./Pods/Target Support Files/AFNetworking/AFNetworking-umbrella.h:#import "UIWebView+AFNetworking.h" Binary file ./Pods/ZDCChat/ZDCChatAPI.framework/ZDCChatAPI matches Binary file ./Pods/ZDCChat/ZDCChat.framework/ZDCChat matches Binary file ./Pods/.git/index matches ZDCChatAPI 此 pod 使用 uiwebview【参考方案6】:
brew install ripgrep 
cd Pods
rg UIWebView
YoutubePlayer-in-WKWebView/README.md
10:- using WKWebView instead of UIWebView.

TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h
166: to emulate the link detection behaviour of UIWebView.

TwitterKit/iOS/TwitterKit.framework/Headers/Twitter.h
28:     * either UIWebView or SFSafariViewController depending on iOS

TwitterKit/iOS/TwitterKit.framework/Headers/TWTRTweet.h
84: *  Suitable for loading in a `UIWebView`, `WKWebView` or passing to Safari:

【讨论】:

这里的解决方案是什么?刚刚在 cmets 中打印出来,是否应该删除 cmets 以解决问题?【参考方案7】:

为了找到您在哪里使用UIWebView,请在终端中转到您的项目根目录 并使用此命令

grep -r -F "UIWebView" .

'.'很重要。

它告诉系统在当前文件夹和子文件夹中搜索字符串“UIWebView”。 这也将搜索 cocoapods

【讨论】:

【参考方案8】:

我通过更新 ionic webview 插件并在配置中添加首选项解决了这个问题。

我遵循以下步骤:

1.cordova 插件 rm cordova-plugin-ionic-webview

2.cordova插件添加cordova-plugin-ionic-webview@latest

3.在ios平台下的配置文件中添加了首选项:

<preference name="WKWebViewOnly" value="true" />
    <feature name="CDVWKWebViewEngine">
        <param name="ios-package" value="CDVWKWebViewEngine" />
    </feature>
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />

按照这些步骤完成后,我的应用已提交并随后通过审核。

【讨论】:

我也试过了,但是不行。【参考方案9】:

使用最新的 firebase 版本

https://firebase.google.com/support/release-notes/ios

6.8.1 版:删除了对 UIWebViewDelegate 的引用以符合 App Store 提交警告 (#3722)。

【讨论】:

【参考方案10】:

如果您使用 Unity 3D 进行构建,这是一个已知问题(已在变更日志中确认),目前已在 2019.3 版中修复(正在测试和向后移植)。

在这里查票https://unity3d.com/unity/whats-new/2019.2.4

【讨论】:

【参考方案11】:

这是一个漫长的过程,但我设法解决了上述问题。让我带您完成整个过程并分享我的发现。 首先,对我有用的不一定对你有用。您需要尝试所有可能的解决方案。 我遵循了在各个线程中发布的一些解决方案。 (链接如下)。

    当我在 RN 0.59 上时,我发现这些文件评论 mentioned here。 没用 我升级到 RN 0.61,我没有找到这些文件。我尝试上传应用程序,但仍然收到警告。 没用 我将以下库更新为最新版本。 没用 反应本机设备信息 反应原生视图

    我试过这个 grep 命令mentioned here。出现了某些库,即 react-native-fbsdk、react-native-google-sign、react-native-gesture-handler。所以我升级了所有这些并上传了构建,但仍然收到警告。 没用

    更新所有库的最后手段,我知道这将花费大量时间。所以我的第一个猜测是将“react-native-firebase”更新为最新的 v6 版本issue。但是它有一些通知没有打开的问题,所以我不能使用它。他们还提到他们的 v.5.5.6 是干净的,并且没有任何 UIWebViewIssues,因为您将 iOS sdk 更新到 6.12。+ 更多信息 here。 所以这让我想到了我的第二个猜测,在我的例子中是“react-native-ux-cam”。幸运的是,他们更新了库以删除 UIWebView 的所有引用。我更新到最新版本,BOOM,问题解决了。我向 Apple 提交了我的应用程序,到目前为止没有任何警告。更多信息here工作?

希望这对某人有所帮助。

【讨论】:

【参考方案12】:

背景故事

在我的 ReactJS + Cordova 项目中,我将一个应用程序上传到了应用商店,并且成功了。在我收到一封引用 ITMS-90809: Deprecated API Usage 的电子邮件后不久。经过数小时(数天)的研究和多次失败的上传后,我使用付费开发者令牌(50 美元)与 Apple 建立了联系;他们基本上回答说“检查你的节点模块文件夹”并退还我的令牌,因为他们不会帮助我解决这个极其模棱两可的错误。

以前的尝试

更新了 cordova 以使用 wkwebview-enginewkwebviewxhrfix 插件 在档案、ios 源代码和整个项目源代码上使用 grep -r,我发现了很多注释,但没有任何帮助。 更新了所有npm 包 清理并更新了所有cocoapod pod

最终尝试

在删除所有“额外的”cordova 插件、npm 包和 pod 后,我只剩下一个应用程序的外壳,但仍然面临苹果拒绝。再次使用grep -r,仍然有对“facebook”的引用,这让我看到了FBSDK 的旧副本。

解决方案

FBSDK 已手动添加到 target &gt; Build Phases &gt; Link Binary With Libraries。在target &gt; Build Phases &gt; Compile Sources 中还有一个关联的cordovaFacebook.m。删除这些旧的、未维护的文件后,我可以毫无问题地上传到 iTunes Connect。

【讨论】:

【参考方案13】:

就我而言,Firebase/Auth 使用的是已弃用的 UIWebView API,而我使用的版本是旧版本。所以我只是使用命令更新了Firebase/Auth pod,

pod update 'Firebase/Auth'

注意:要找出使用这个api的框架,只需搜索“UIWebView”(cmd+shift+F

【讨论】:

这就是我所做的,显然它说安装 FirebaseInstanceID 4.2.5(原为 4.2.2)并没有解决我的问题【参考方案14】:

7.16.1 以上版本的 FB Sdk 有这个问题。实际上它在框架文件夹中没有文件。

当您使用 FBSDK v7.16.1 构建它时,此错误已消除,但 Appstore 因 api 使用率(UIWebView) 折旧而被拒绝。

我使用 FBSDK v7.19.2 解决。

1) 当您为 xcode 构建项目时,它显示提及错误,未找到 shareKit。我通过将 facebookSDK 文件夹从我之前构建的框架文件夹(使用 fbsdk v7.16.1)复制到当前 xcode 文件夹(框架/FacebookSDK ....)的相同位置来解决它

2) 然后,打开您的 xcode 项目,从以下位置添加文件:Frameworks/FacebookSDK/Plugins/IOS/(sharekit、corekit、loginkit)到 Xcode 中的 Frameworks 中。

3) 在 Xcode 的构建设置中将“$(PROJECT_DIR)/Frameworks/FacebookSDK/Plugins/iOS”添加到框架搜索路径中。

4) 在终端中打开项目:输入 "grep -r "UIWebView" 。" , 如果这显示任何与 UIWebView 匹配的内容,请打开文件将其删除。

5) 如果在 FBSDKCoreKit 的二进制文件中显示匹配。在 MAC 的 TextEdit 中打开文件,找到所有“UIWebView”并将其替换为“WKWebView”

6) 保存并再次将其添加到 Xcode 的框架中。构建并推送到应用商店。

【讨论】:

【参考方案15】:

100% 可行的解决方案#ionic #wkwebview #webview

此处的 Webview 已被 Apple 弃用,因此请替换为 WKWebview。

按照几个简单的步骤来解决这个问题:-

1.Open Terminal and go to project path 
2.cordova plugin rm cordova-plugin-ionic-webview
3.cordova plugin add cordova-plugin-ionic-webview@latest
4.open config.xml file and put below code inside <platform name="ios"> section.
 
   <preference name="WKWebViewOnly" value="true" />
   <feature name="CDVWKWebViewEngine">
      <param name="ios-package" value="CDVWKWebViewEngine" />
   </feature>
   <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />

在完成所有这些步骤后,使用“ionic cordova build ios”命令再次构建并在应用商店中再次提交

【讨论】:

我试过了,但没有用。【参考方案16】:

当您构建 Ionic 应用程序时,您可以选择 Cordova 或 Capacitor 来部署原生移动版本。虽然更新的版本自动使用 WKWebView,但 Cordova 仍然直接使用 UIWebView API 或包含对它们的引用(Capacitor 已更新以删除这些引用 - 见下文)。

应用提交后,Apple 会在应用代码中搜索“UIWebView”字符串,如果找到,则会生成提交警告。因此,未来版本的 cordova-ios(Cordova iOS 库)将需要确保删除所有对 UIWebView API 的引用。

另一个想法。我不知道这是否有意义或技术上可行。

将 UIWebView 也移动到插件中,并使 cordova-ios 使用这个或一些 WKWebView 插件。 cordova-ios 只包含加载 webview 的代码。默认情况下,下一个版本应该加载 Apache WKWebViewEngine(新应用默认安装插件,旧应用迁移说明)。需要 UIWebView、Ionic、fork 或其他的用户可以像现在一样指定自己的。

这样,cordova-ios 中就没有 UIWebView 了,它仍然像今天一样足够灵活。

【讨论】:

【参考方案17】:

对于 React 本机应用程序,我也遇到了同样的问题。检查以下内容:

1) 您正在使用 react-native-webview 模块,而不是直接从 react-native 导入它(社区 webview 在 v0.60 中作为精简核心删除已被弃用,并将在下一个稳定版本中删除)。 (check here)

2) 还请验证您使用的任何使用 webview 的第三方库是否是最新的,如果不是,请要求库维护人员升级 react-native-webview。

3) 可以继续上传了,如果大家还有什么困难请加cmet。

Check here the breaking changes in v0.60

消除此警告的另一种方法是: 开始传递 useWebKit=true,也就是说,你使用的是 WKWebView 而不是 UIWebView。然后您可以执行以下操作来解决问题 - 已弃用的 API 使用情况。

    删除库/RNCWebView.xcodeproj/RNCUIWebView.h、RNCUIWebView.m、RNCUIWebViewManager.h、RNCUIWebViewManager.m 删除库/React.xcodeproj/React/Views/RCTWebView.h、RCTWebView.m、RCTWebViewManager.h、RCTWebViewManager.m

现在我已经成功将 app.ipa 上传到 AppStore,没有任何权限警告。

<WebView
 style=flex: 1, backgroundColor: Colors.white
 useWebKit=true
 startInLoadingState=true
 source=uri: 'my http url'
/>```

【讨论】:

【参考方案18】:

如果有人帮助我在终端上运行pod update,然后再次存档。这对我有用。

【讨论】:

这涵盖了 ios 应用,但对 android 或其他移动应用没有帮助。 这是 iOS 特有的问题,Android 没有同样的问题【参考方案19】:

对我来说,脚本没有帮助。我必须手动浏览每个框架并查看发行说明并更新它们。

【讨论】:

【参考方案20】:

我可以按照以下步骤摆脱这种情况-

第 1 步:

在xcode项目目录中搜索“UIWebView”

第 2 步:

右键单击(在 RCTWebView.m 上)并选择“Reveal In Project Navigator”

第 3 步:

向下滚动并仅删除以下四个文件:

 1. RCTWebView.h
 2. RCTWebView.m
 3. RCTWebViewManager.h
 4. RCTWebViewManager.m

然后清理项目和存档。

注意:如果您使用 'react-native-community/react-native-webview' 库,则更新为最新版本,否则完成。

【讨论】:

【参考方案21】:

你应该安装这个 Cordova 插件:

https://github.com/apache/cordova-plugin-wkwebview-engine

然后在 config.xml 的 iOS 部分下添加 &lt;preference name="WKWebViewOnly" value="true" /&gt;

然后增加版本重新上传。

【讨论】:

【参考方案22】:

更新 ios 中不推荐使用的 WebView

这成功解决了我的问题

cd 平台/ios grep -r UIWebView Pods/

打开 Podfile 并将 AFNetworking pod 添加/替换为

pod 'AFNetworking', '~> 4.0'

终于在终端 pod 更新中

【讨论】:

【参考方案23】:

根据新的 Apple 政策,不再接受使用 UIWebView 的新/旧应用。最好的解决方案是使用 WKWebView 来提高安全性。问题的存在是因为一些已弃用的旧插件,如 GoogleAd 或 GoogleVR SDK。如果您想要快速解决方案,请将 UIWebView 替换为 WKWebView 框架。

在终端中,在您的 iOS 项目文件夹中运行此命令:

grep -r "UIWebView"

然后你会发现所有使用 UIWebview 的文件的列表。更新任何文件以使用 WKWebView(或使用 gVim 将它们替换为 WKWebView)。如果您的 pod 库显示它具有 UIWebView。同时更新 pods 文件。

在我的例子中,不支持的插件是 GVR SDK,解决的步骤是:

第一步:移除 UIWebView:

    获取vim for mac。 列表项在 Vim 中打开 Path to your build folder \Pods\GVRSDK\Libraries\libGVRSDK.a 点击ESC 键入“:” 粘贴“%s/UIWebView/WKWebView/g” 点击进入

第 2 步:将框架添加到您的 Xcode 项目

    从项目窗口左侧的项目导航器中选择项目文件。 在项目设置编辑器中选择要添加框架的目标。 选择“Build Phases”选项卡,然后单击“Link Binary With Libraries”旁边的小三角形以查看应用程序中的所有框架。 要添加框架,请单击框架列表下方的“+”。 选择 WebKit.framework

【讨论】:

以上是关于ITMS-90809:不推荐使用的 API 使用——Apple 将停止接受使用 UIWebView API 的应用程序提交的主要内容,如果未能解决你的问题,请参考以下文章

ITMS-90809:不推荐使用的 API 使用 - Apple 将停止接受使用 UIWebView API 的应用程序的提交

ITMS-90809:不推荐使用的 API - 不再接受使用 UIWebView 的新应用程序。相反,使用 WKWebView 来提高安全性和可靠性

ITMS-90809:框架上的 UIWebView API 弃用

ITMS-90809:使用 react-native-html-to-pdf 时已弃用 API 使用警告

Apple 警告 ITMS-90809:收到已弃用的 API 使用情况

离子框架:ITMS-90809:UIWebView API 弃用(遵循所有说明,但我收到弃用消息)