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】:WKWebView
是UIWebView
的替代品。如果您的代码中没有使用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-engine
和 wkwebviewxhrfix
插件
在档案、ios 源代码和整个项目源代码上使用 grep -r
,我发现了很多注释,但没有任何帮助。
更新了所有npm
包
清理并更新了所有cocoapod
pod
最终尝试
在删除所有“额外的”cordova 插件、npm 包和 pod 后,我只剩下一个应用程序的外壳,但仍然面临苹果拒绝。再次使用grep -r
,仍然有对“facebook”的引用,这让我看到了FBSDK
的旧副本。
解决方案
FBSDK
已手动添加到 target > Build Phases > Link Binary With Libraries
。在target > Build Phases > 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 部分下添加 <preference name="WKWebViewOnly" value="true" />
。
然后增加版本重新上传。
【讨论】:
【参考方案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 使用警告