【发布时间】: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