ITMS-90809:弃用 API 用法 -- Apple 将停止接受使用 UIWebView APIs 的应用提交

ITMS-90809: Deprecated API Usage -- Apple will stop accepting submissions of apps that use UIWebView APIs

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

ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.

问题是我没有在我的应用程序中使用 UIWebView 所以我尝试更新我的 pods 但仍然是相同的 thing.By 这是我在 TestFlight 上的第三次构建,这是苹果第一次给我发这个。有什么想法吗?

更新

这些是我的 pods:

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 修复它们并更新我的 pods?

检查您是否在代码中使用了 UIWebView class;如果是,请用 WKWebView 替换您的实现,否则需要检查您的 Pods.

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

必须更新所有匹配的广告连播。 现在我卡住了,因为我在 Google AdMob(7.49.0 版)中发现了 UIWebView,我正在等待 Google.

的新版本

您可以检查存档应用程序中的每个框架,看看是否有任何框架引用了 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

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

我会回答我自己的问题,因为我有关于这封电子邮件的消息。 Google 告诉我有几张关于这个问题的工单,他们会尽快解决这个问题。 同样在今天,我的应用程序已获准在 AppStore 上架,所以它似乎暂时只是一个警告。

在我的例子中,Firebase/Auth 使用的是已弃用的 UIWebView API,而我使用的是旧版本。所以我刚刚使用命令

更新了 Firebase/Auth pod

pod update 'Firebase/Auth'

注意:要找出正在使用此 api 的框架,只需搜索 "UIWebView" (cmd+shift+F)

构建 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 或其他的用户可以像现在这样指定自己的一个。

这样 UIWebView 就不会出现在 cordova-ios 中,而且它仍然像今天一样灵活。

使用最新的 firebase 版本

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

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

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

在此处查票https://unity3d.com/unity/whats-new/2019.2.4

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

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

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

3) 已经可以上传了,如果还有什么问题欢迎补充。

Check here the breaking changes in v0.60

消除此警告的另一种方法是: 开始传useWebKit={true},也就是说你用的是WKWebView,根本不是UIWebView。那么你可以通过以下方式解决问题 -- Deprecated API Usage.

  1. 去掉Libraries/RNCWebView.xcodeproj/RNCUIWebView.h、RNCUIWebView.m、RNCUIWebViewManager.h、RNCUIWebViewManager.m
  2. 去掉Libraries/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'}}
/>```

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

  1. 当我在 RN 0.59 时,我发现这些文件评论 mentioned here没用
  2. 我升级到 RN 0.61,我没有找到这些文件。我尝试上传应用程序,但仍然收到警告。 没用
  3. 我将以下库更新到最新版本。 没用 反应本机设备信息 反应本机视图
  4. 我尝试了这个 grep 命令 mentioned here。出现了某些库,即 react-native-fbsdk、react-native-google-sign、react-native-gesture-handler。所以我升级了所有这些并上传了构建但仍然收到警告。 没成功

  5. 更新所有库的最后手段,我知道这会花费很多时间。所以我的第一个猜测是将 'react-native-firebase' 更新到最新的 v6 版本 issue. But it had some issues with Notification not being on so I couldn't use it. Also they mentioned that their v.5.5.6 is clean and doesn't have any UIWebViewIssues given you update your iOS sdk to 6.12.+ More info here。 所以这让我想到了我的第二个猜测,在我的例子中是 'react-native-ux-cam'。幸运的是,他们更新了他们的库以删除 UIWebView 的所有引用。我更新到最新版本和 BOOM,问题解决了。我将我的应用程序提交给了 Apple,到目前为止没有任何警告。更多信息 here 有效

希望这对某人有所帮助。

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

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

背景故事

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

之前的尝试

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

最后的尝试

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

的旧副本

解决方案

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

对于使用 cocoapods 的项目:

grep -r UIWebView Pods/ 

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

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

当您使用 FBSDK v7.16.1 构建它时,此错误已删除,但 Appstore 拒绝了该应用程序,因为折旧 api usage(UIWebView)。

我用FBSDK v7.19.2解决了。

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

2) 然后,打开您的 xcode 项目,将位于 Frameworks/FacebookSDK/Plugins/IOS/ (sharekit, corekit, loginkit) 的文件添加到 Xcode.

中的框架中

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

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

5) 如果在FBSDKCoreKit的二进制文件中显示匹配。在 TextEdit 中打开位于 MAC 的文件并查找并将所有 "UIWebView" 替换为 "WKWebView"

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

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

我遵循了以下步骤:

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

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

3.Added ios 平台下配置文件中的首选项:

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

完成这些步骤后,我的应用程序已提交并在审核中获得批准。

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:

我按照以下步骤摆脱了这个问题-

第 1 步:

Search “UIWebView” in xcode project directory

第 2 步:

Right click (on RCTWebView.m) and select “Reveal In Project Navigator”

第 3 步:

Scroll down and delete the following four files only:

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

然后清理项目和存档。

N.B:如果您使用 'react-native-community/react-native-webview' 库,则更新为最新版本,否则就完成了。

您应该安装此 Cordova 插件:

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

然后在 config.xml 中的 iOS 部分下添加 <preference name="WKWebViewOnly" value="true" />

然后增加版本re-upload它。

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

grep -r -F "UIWebView" .

The '.' is very important.

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

更新 ios

中弃用的 WebView

这成功解决了我的问题

CD platforms/ios grep -r UIWebView Pods/

打开 Podfile 和 add/replace AFNetworking pod 作为

pod 'AFNetworking', '~> 4.0'

终于在终端 pod 更新

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

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

grep -r "UIWebView"

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

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

第一步:删除 UIWebView:

  1. 得到vim for mac.
  2. List item In Vim 打开 {Path to your build folder} \Pods\GVRSDK\Libraries\libGVRSDK.a
  3. 单击 ESC
  4. 键入“:”
  5. 粘贴“%s/UIWebView/WKWebView/g”
  6. 点击进入

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

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

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”命令进行构建,并再次将其提交到应用商店