【问题标题】:Getting 'ITMS-90338: Non-public API usage' and 'ITMS-90809: Deprecated API Usage' upon submitting Xamarin iOS to Apple AppStoreConnect TestFlight在将 Xamarin iOS 提交到 Apple AppStoreConnect TestFlight 时获取“ITMS-90338:非公共 API 使用”和“ITMS-90809:已弃用的 API 使用”
【发布时间】:2021-05-13 02:42:36
【问题描述】:

在将 Xamarin.Forms iOS 应用提交到 Apple 的 TestFlight 时,我们会收到以下消息。

消息:

尊敬的开发者,

我们发现您的应用最近交付的一个或多个问题, “[捆绑包名称]”[捆绑包版本]([捆绑包版本])。请更正以下内容 问题,然后重新上传。

ITMS-90338:非公开 API 使用 - 应用引用非公开 [项目名称]中的选择器: applicationWillTerminate, fontWeight, newSocketQueueForConnectionFromAddress:onSocket:, 设置方向:动画:,套接字:didConnectToHost:端口:, 套接字:didReadPartialDataOfLength:标签:, 套接字:didReceiveTrust:completionHandler:, 套接字:didWritePartialDataOfLength:标签:, socket:shouldTimeoutReadWithTag:elapsed:bytesDone:, socket:shouldTimeoutWriteWithTag:elapsed:bytesDone:, socketDidCloseReadStream:, socketDidSecure:, terminateWithSuccess。如果 源代码中的方法名称与列出的私有 Apple API 匹配 上面,更改您的方法名称将有助于防止此应用程序 在未来的提交中被标记。此外,请注意一个或 更多上述 API 可能位于一个静态库中 包含在您的应用程序中。如果是这样,它们必须被删除。为了更进一步的 信息,请访问技术支持信息,网址为 http://developer.apple.com/support/technical/

ITMS-90809:不推荐使用的 API 使用 - 使用 UIWebView 的新应用不可用 较长时间接受。相反,使用 WKWebView 来提高安全性和 可靠性。了解更多 (https://developer.apple.com/documentation/uikit/uiwebview)。

最好的问候,

App Store 团队

我查了消息,做了太多尝试都无济于事。如果有人可以帮助让 Apple 接受我们的提交,我将不胜感激。

让我分享更多细节

环境:

这是一个 Xamarin.Forms 应用,我们使用 Azure DevOps 的构建管道(特别是 Xamarin.iOS task 版本 2.*)构建并使用 Azure DevOps 的发布管道发布。我们将其发布到 Microsoft AppCenter,然后从那里下载 *.ipa。我们使用来自 Apple AppStore 的 Mac 上的 Transporter 应用程序将其提交到 Apple 的 AppStoreConnect TestFlight。

XCode version used: 12.2
.Net Core SDK version used: 3.1.x
Mono Version used: 6.12.0
Xamarin iOS SDK version used: 14.6.0.15
NuGet tool version used: 5.8.0

已安装的 NuGet 包/第 3 方库:

<PackageReference Include="Abp">
  <Version>5.14.0</Version>
</PackageReference>
<PackageReference Include="Abp.AutoMapper">
  <Version>5.14.0</Version>
</PackageReference>
<PackageReference Include="Abp.Web.Common">
  <Version>5.14.0</Version>
</PackageReference>
<PackageReference Include="Acr.Support">
  <Version>2.1.0</Version>
</PackageReference>
<PackageReference Include="Acr.UserDialogs">
  <Version>7.1.0.475</Version>
</PackageReference>
<PackageReference Include="Castle.Core">
  <Version>4.4.1</Version>
</PackageReference>
<PackageReference Include="Castle.LoggingFacility">
  <Version>5.1.1</Version>
</PackageReference>
<PackageReference Include="Castle.Windsor">
  <Version>5.1.1</Version>
</PackageReference>
<PackageReference Include="Flurl">
  <Version>2.8.2</Version>
</PackageReference>
<PackageReference Include="Flurl.Http">
  <Version>2.4.2</Version>
</PackageReference>
<PackageReference Include="JetBrains.Annotations">
  <Version>2020.3.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter.Analytics">
  <Version>4.1.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter.Crashes">
  <Version>4.1.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.CSharp">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Win32.Primitives">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="NETStandard.Library">
  <Version>2.0.3</Version>
</PackageReference>
<PackageReference Include="Newtonsoft.Json">
  <Version>12.0.3</Version>
</PackageReference>
<PackageReference Include="NUglify">
  <Version>1.13.2</Version>
</PackageReference>
<PackageReference Include="Plugin.Permissions">
  <Version>6.0.1</Version>
</PackageReference>
<PackageReference Include="Refractored.MvvmHelpers">
  <Version>1.6.2</Version>
</PackageReference>
<PackageReference Include="Rg.Plugins.Popup">
  <Version>2.0.0.10</Version>
</PackageReference>
<PackageReference Include="Splat">
  <Version>10.0.1</Version>
</PackageReference>
<PackageReference Include="System.AppContext">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Collections">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Collections.Concurrent">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Collections.Specialized">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.ComponentModel">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.ComponentModel.Annotations">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.ComponentModel.TypeConverter">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Configuration.ConfigurationManager">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Console">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Data.Common">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Diagnostics.Debug">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Diagnostics.Tools">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Diagnostics.TraceSource">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Diagnostics.Tracing">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Dynamic.Runtime">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Globalization">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Globalization.Calendars">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.IO">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.IO.Compression">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.IO.Compression.ZipFile">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.IO.FileSystem">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.IO.FileSystem.Primitives">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Linq">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Linq.Expressions">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Linq.Queryable">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Memory">
  <Version>4.5.3</Version>
</PackageReference>
<PackageReference Include="System.Net.Http">
  <Version>4.3.4</Version>
</PackageReference>
<PackageReference Include="System.Net.Primitives">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Net.Sockets">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.ObjectModel">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.Emit">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.Emit.ILGeneration">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.Emit.Lightweight">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.Extensions">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.Primitives">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.TypeExtensions">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Resources.ResourceManager">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Runtime.CompilerServices.Unsafe">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Extensions">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Handles">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.InteropServices">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.InteropServices.RuntimeInformation">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Loader">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Numerics">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Serialization.Formatters">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Serialization.Primitives">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Security.AccessControl">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Claims">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Cryptography.Algorithms">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Security.Cryptography.Encoding">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Cryptography.Primitives">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Cryptography.X509Certificates">
  <Version>4.3.2</Version>
</PackageReference>
<PackageReference Include="System.Security.Permissions">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Security.Principal.Windows">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Encoding">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Encoding.CodePages">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Encoding.Extensions">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Encodings.Web">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Json">
  <Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Text.RegularExpressions">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Threading">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Threading.Tasks">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Threading.Thread">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Threading.Timer">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.ValueTuple">
  <Version>4.5.0</Version>
</PackageReference>
<PackageReference Include="System.Xml.ReaderWriter">
  <Version>4.3.1</Version>
</PackageReference>
<PackageReference Include="System.Xml.XDocument">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Xml.XmlDocument">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Xml.XmlSerializer">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Xml.XPath.XmlDocument">
  <Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="TimeZoneConverter">
  <Version>3.3.0</Version>
</PackageReference>
<PackageReference Include="Xam.Plugin.Connectivity">
  <Version>3.2.0</Version>
</PackageReference>
<PackageReference Include="Xam.Plugin.Geolocator">
  <Version>4.5.0.6</Version>
</PackageReference>
<PackageReference Include="Xam.Plugin.Iconize.FontAwesome">
  <Version>3.5.0.123</Version>
</PackageReference>
<PackageReference Include="Xam.Plugin.Iconize.Material">
  <Version>3.5.0.123</Version>
</PackageReference>
<PackageReference Include="Xam.Plugin.Media">
  <Version>5.0.1</Version>
</PackageReference>
<PackageReference Include="Xam.Plugins.Forms.ImageCircle">
  <Version>3.0.0.5</Version>
</PackageReference>
<PackageReference Include="Xam.Plugins.ImageCropper">
  <Version>1.2.0</Version>
</PackageReference>
<PackageReference Include="Xam.Plugins.Settings">
  <Version>3.1.1</Version>
</PackageReference>
<PackageReference Include="Xamarin.Azure.NotificationHubs.iOS">
  <Version>3.1.1</Version>
</PackageReference>
<PackageReference Include="Xamarin.Build.Download">
  <Version>0.10.0</Version>
</PackageReference>
<PackageReference Include="Xamarin.CommunityToolkit">
  <Version>1.0.2</Version>
</PackageReference>
<PackageReference Include="Xamarin.Essentials">
  <Version>1.6.1</Version>
</PackageReference>
<PackageReference Include="Xamarin.FFImageLoading">
  <Version>2.4.11.982</Version>
</PackageReference>
<PackageReference Include="Xamarin.FFImageLoading.Forms">
  <Version>2.4.11.982</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms">
  <Version>5.0.0.1931</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms.Maps">
  <Version>5.0.0.1931</Version>
</PackageReference>
<PackageReference Include="Xamarin.Google.iOS.Maps">
  <Version>3.9.0</Version>
</PackageReference>
<PackageReference Include="Xamarin.TestCloud.Agent">
  <Version>0.22.1</Version>
</PackageReference>
<PackageReference Include="XamarinFastEntry.Behaviors">
  <Version>1.1.1</Version>
</PackageReference>

显然,该应用正在使用 Xamarin.Forms 5,其中引用了 UIWebView has been removed

在我们的项目中,我们仅在一个页面中使用 Web 视图,即使 Xamarin 的默认渲染器已更改为 WkWebView,我们也为其制作了自定义渲染器以使用 WkWebView 以防万一(当然,我们确保使用新控件)。

跨平台控制:

public class CustomWebView : Xamarin.Forms.WebView
{
}

iOS 特定渲染器:

[assembly: Xamarin.Forms.ExportRenderer(typeof(Our.CrossPlatform.Project.CustomWebView), typeof(Our.Project.Renderer.CustomWebViewRenderer))]

namespace Our.Project.Renderer
{
    public class CustomWebViewRenderer : Xamarin.Forms.Platform.iOS.WkWebViewRenderer
    {
    }
}

Azure 构建管道上使用的构建代理macos-10.15(可以在 link 上找到代理的完整规范)。

我们尝试了什么:

关于第一条消息(ITMS-90338:非公共 API 使用),在处理 Stackoverflow 和 Xamarin 论坛上的大量帖子后,我们发现人们建议我们应该将链接行为设置为 Link SDK Only(我们已经为每个构建配置执行此操作),但是为了确定,我们决定告诉 MSBuild 和 MTouch 以确保这是使用的链接行为。

我们开始在the pipeline task 的参数部分将/p:MtouchLink="SdkOnly" 发送到MSBuild;对于 MTouch,我们发送了/p:MtouchExtraArgs="--linksdkonly"

这些都不起作用,所以我们开始查看已安装的软件包,并尝试尽可能多地卸载它们,但仍然没有成功。

关于后一条消息(ITMS-90809:已弃用的 API 使用),我们知道 as of Xamarin Forms 4.5, a new flag was introduced 以确保未引用 UIWebView。此外,我们知道,从Xamarin.iOS 13.16 开始,为了相关目的引入了更多标志:warn-on-type-ref=UIKit.UIWebView 在构建日志中警告我们是否有任何对UIWebView 的引用,optimize=force-rejected-types-removal 强制删除所有如果找到任何被拒绝的类型(包括UIWebView)的引用。

所以,这就是我们最终在 MTouch 参数中使用的内容:/p:MtouchExtraArgs="--warn-on-type-ref=UIKit.UIWebView --optimize=experimental-xforms-product-type --optimize=force-rejected-types-removal --linksdkonly",但这仍然不起作用,我们甚至没有收到构建日志中任何 UIWebView 引用的警告。

具有讽刺意味的是,相同的配置确实适用于我们提交的早期应用程序(早期 Xamarin.Forms 版本),并且警告标志确实向我们显示了一个警告,即在不再存在的链接之前存在对 UIWebView 的引用链接后。

如果有人告诉我们如何解决此问题或在哪里查找此问题,甚至我们应该在哪里开票,我们将不胜感激。

【问题讨论】:

    标签: ios azure xamarin xamarin.forms xamarin.ios


    【解决方案1】:

    Apple 拒绝这个提交的版本有两个原因。

    ITMS-90338:非公共 API 使用 - 应用程序引用 [项目名称] 中的非公共选择器:applicationWillTerminate、fontWeight、newSocketQueueForConnectionFromAddress:onSocket:、setOrientation:animated:、socket:didConnectToHost:port:、socket:didReadPartialDataOfLength :tag:, socket:didReceiveTrust:completionHandler:, socket:didWritePartialDataOfLength:tag:, socket:shouldTimeoutReadWithTag:elapsed:bytesDone:, socket:shouldTimeoutWriteWithTag:elapsed:bytesDone:, socketDidCloseReadStream:, socketDidSecure:, terminateWithSuccess。

    这意味着你需要将方法的列表名称修改为另一个名称,因为这些名称会与苹果系统的私有方法名称冲突。您需要找到它们并将它们替换为其他名称。

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

    从 2020 年 4 月开始,Apple will reject apps 仍使用已弃用的 UIWebView API。虽然 Xamarin.Forms 已切换到 WKWebView 作为默认值,但在 Xamarin.Forms 二进制文件中仍然存在对旧 SDK 的引用。当前的 iOS 链接器行为并未消除此问题,因此当您提交到 App Store 时,您的应用仍会引用已弃用的 UIWebView API。

    链接器的预览版可用于解决此问题。要启用预览,您需要向链接器提供额外的参数 --optimize=experimental-xforms-product-type

    详细步骤可以参考UIWebView Deprecation and Xamarin.Forms

    【讨论】:

    • 感谢您的回复。问题出在 AppCenter 库中对 Calabash 框架的调用中。
    • @AlyElhaddad 太好了,很高兴你解决了它。
    【解决方案2】:

    我们想通了。毕竟,问题是在生产构建中无意中引用了应用中心库。我们在AppDelegate.cs 中有这个:

    #if ENABLE_TEST_CLOUD
                    Xamarin.Calabash.Start();
    #endif
    

    结果我们不小心用ENABLE_TEST_CLOUD 和其他标志编译了生产版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2020-11-12
      • 2020-02-12
      • 1970-01-01
      • 2022-11-11
      • 2022-08-18
      相关资源
      最近更新 更多