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

时间:2019-08-30 07:47:22

标签: ios swift xcode

昨天,我将我的应用程序上传到TestFlight,一段时间后,苹果向我发送了此警告:

  

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

23 个答案:

答案 0 :(得分:25)

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

这至少会告诉您罪魁祸首。

答案 1 :(得分:20)

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

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

所有匹配的广告连播必须更新。 现在,我被困住了,因为我在Google AdMob(版本7.49.0)中找到了UIWebView,并且正在等待Google的新版本。

答案 2 :(得分:8)

当我收到有关此电子邮件的新闻时,我将回答自己的问题。 Google告诉我,有几张有关此问题的票证,他们将尽快解决。 也是今天,我的应用已获得AppStore的批准,因此暂时只是警告。

答案 3 :(得分:6)

WKWebView替代UIWebView。如果您在代码中没有使用UIWebView,而通过执行以下终端命令,则可以轻松地知道哪个库仍在使用UIWebView引用(不要错过。(点)。 )。

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

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

然后运行

grep -r UIWebView

OR 呼叫

 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

答案 4 :(得分:5)

对于带有cocoapods的项目:

grep -r UIWebView Pods/ 

答案 5 :(得分:4)

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:

答案 6 :(得分:3)

我通过更新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" />

按照这些步骤操作后,我的应用程序已提交并随后获得审核批准。

答案 7 :(得分:2)

背景故事

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

以前的尝试

  • 更新了cordova以使用wkwebview-enginewkwebviewxhrfix插件
  • 在档案,ios源和整个项目源上使用grep -r,我发现了很多笔记,但没有任何真正的帮助。
  • 更新了所有npm个软件包
  • 清理并更新了所有cocoapod个吊舱

最终尝试

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

解决方案

FBSDK已手动添加到target > Build Phases > Link Binary With LibrariescordovaFacebook.m中还有一个关联的target > Build Phases > Compile Sources。在删除了这些旧的,未维护的文件后,我可以将其上传到iTunes,而不会出现问题。

答案 8 :(得分:2)

使用最新的Firebase版本

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

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

答案 9 :(得分:1)

这是一个漫长的过程,但是我设法解决了上述问题。让我向您介绍整个过程并分享我的发现。 首先,对我有用的对您有用的没必要。您可能需要尝试这里提出的所有可能的解决方案。 我遵循了张贴在各个主题中的一些解决方案。 (在下面链接)。

  1. 使用RN 0.59时,我发现这些文件注释mentioned here没用
  2. 我升级到RN 0.61,但没有找到这些文件。我尝试上传应用程序,但仍然收到警告。 没用
  3. 我将以下库更新为最新版本。 没用 react-native-device-info react-native-view
  4. 我尝试了这个grep命令mentioned here。有某些库显示出来,即react-native-fbsdk,react-native-google-sign,react-native-gesture-handler。因此,我升级了所有这些文件并上传了构建,但仍然收到警告。 没用

  5. 更新所有库的最后手段,我知道这将花费很多时间。因此,我的第一个猜测是将'react-native-firebase'更新为最新的v6版本issue。但是由于Not Notification处于启用状态,因此存在一些问题,因此我无法使用它。他们还提到他们的v.5.5.6是干净的,并且没有iOSUI sdk更新为6.12的UIWebViewIssues。+更多信息here。 因此,这使我想到了第二个猜测,在我的情况下是“ react-native-ux-cam”。幸运的是,他们更新了自己的库,以删除UIWebView的所有引用。我已更新到最新版本和BOOM,问题已解决。我已将应用程序提交给Apple,到目前为止没有任何警告。更多信息here 工作?

希望这对某人有帮助。

答案 10 :(得分:1)

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

https://unity3d.com/unity/whats-new/2019.2.4

处检票

答案 11 :(得分:1)

7.16.1版以上的

FB Sdk出现此问题。实际上,它在Framework文件夹中没有文件。

使用FBSDK v7.16.1进行构建时,此错误已消除,但由于api使用率下降(UIWebView),Appstore拒绝了该应用程序。

我使用FBSDK v7.19.2解决了该问题。

1)在为xcode构建项目时,它显示提及错误,找不到shareKit。我可以通过将我以前构建的framework文件夹(带有fbsdk v7.16.1)中的facebookSDK文件夹复制到当前xcode文件夹的相同位置(frameworks / FacebookSDK ....)中来解决该问题

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

3)将“ $(PROJECT_DIR)/ Frameworks / FacebookSDK / Plugins / iOS”添加到Framework Search Paths中的Xcode的构建设置中。

4)在终端中打开项目:键入“ grep -r“ UIWebView”。 ,如果显示与UIWebView匹配,请通过打开文件将其删除。

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

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

答案 12 :(得分:1)

构建Ionic应用程序时,可以在Cordova或Capacitor之间进行选择,以部署本机移动版本。虽然较新的版本会自动使用WKWebView,但Cordova仍将直接使用UIWebView API或包含对它们的引用(已对电容器进行了更新,以删除这些引用–参见下文)。

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

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

也将UIWebView移至插件,并使cordova-ios使用此插件或某些WKWebView插件。 cordova-ios仅包含加载Web视图的代码。默认情况下,下一版本应加载Apache WKWebViewEngine(默认情况下在新应用程序上安装插件,旧应用程序的迁移说明)。需要UIWebView,Ionic,叉子或其他工具的用户可以像现在这样指定自己的一个。

那样,没有UIWebView将出现在cordova-ios中,并且像今天一样仍然足够灵活。

答案 13 :(得分:1)

在我的情况下,Firebase/Auth使用的是不推荐使用的UIWebView API,而我使用的版本是较旧的版本。因此,我只是使用以下命令更新了Firebase/Auth吊舱,

pod update 'Firebase/Auth'

注意:要弄清楚正在使用此api的框架,只需搜索“ UIWebView”(cmd + shift + F

答案 14 :(得分:0)

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

答案 15 :(得分:0)

对于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。然后,您可以执行以下操作来解决问题-不推荐使用的API。

  1. 删除库/RNCWebView.xcodeproj/RNCUIWebView.h、RNCUIWebView.m、RNCUIWebViewManager.h、RNCUIWebViewManager.m
  2. 删除库/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'}}
/>```

答案 16 :(得分:0)

对我来说,脚本无济于事。我只需要手动浏览每个框架并查看发行说明,然后对其进行更新。

答案 17 :(得分:0)

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

第1步:

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

第2步:

右键单击(在RCTWebView.m上),然后选择“在Project Navigator中显示”

第3步:

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

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

然后清理项目和存档。

注意:如果您使用'react-native-community / react-native-webview'库,请使用最新版本进行更新。

答案 18 :(得分:0)

您应该安装此Cordova插件:

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

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

然后增加版本并重新上传。

答案 19 :(得分:0)

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

grep -r -F "UIWebView" .

'。非常重要。它告诉系统在当前文件夹和子文件夹中搜索字符串“ UIWebView” 。 这还将搜索 cocoapods

答案 20 :(得分:0)

更新 ios 中已弃用的 WebView

这成功解决了我的问题

cd 平台/ios grep -r UIWebView Pods/

打开 Podfile 并添加/替换 AFNetworking pod

pod 'AFNetworking', '~> 4.0'

最终在终端 pod 更新中

答案 21 :(得分:0)

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

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

grep -r "UIWebView"

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

就我而言,不受支持的插件是 GVR SDK,解决步骤是:

第一步:移除 UIWebView:

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

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

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

答案 22 :(得分:0)

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”命令再次构建并在appstore中再次提交