“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库

Posted

技术标签:

【中文标题】“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库【英文标题】:"Invalid Swift Support" Using Native Swift Library in Xamarin.iOS 【发布时间】:2016-06-14 19:11:41 【问题描述】:

我刚刚实现了一个原生库Charts (original native library),它可以在我的手机和模拟器上运行。不幸的是,当我将它提交到 iTunes connect 时,它在处理后将其踢回来并说:

无效的 Swift 支持 - 缺少 SwiftSupport 文件夹。重建 您的应用程序使用 Xcode 的当前公共 (GM) 版本并重新提交 它。

我正在使用 XCode 将存档发布到 iTunes 连接,但不知道该怎么做this *** solution is saying。由于我不使用 XCode 来启动构建过程,因此我使用的是 Xamarin Studio 6,不知道如何设置该设置。

所以理想情况下,我需要“在目标设置中将标志 EMBEDDED_CONTENT_CONTAINS_SWIFT 设置为 YES”。

有人对如何做到这一点有任何想法吗?在发布测试版之前遇到了障碍,直到我可以上传它。

感谢您的帮助!

【问题讨论】:

Xamarin.ios 扩展的开发者确实写过这个错误,并且可以通过使用 IPA 打包程序 (github.com/bq/ipa-packager) 来解决。但是,我无法通过它导出可用的应用程序。 你在 GitHub 上打开过问题吗?如果您(安全地)提供示例,我可以为此打开有关 Xamarin Bugzilla 的报告,但似乎问题出在包本身。需要注意的是,目前官方还不支持绑定 Swift。我确实意识到这不是直接绑定,但不得不提一下。谢谢! 嘿@clb 我确实在 Github 上打开了一个问题。我可以安全地提供代码;但是,不确定这会带来多大的好处。这是线程:github.com/Flash3001/iOSCharts.Xamarin/issues/5 谢谢! 谢谢!我也会看那个线程。如果事实证明它开始看起来特别像 Xamarin 问题,请在回复此线程时让我知道,我会在这方面看到我能做些什么。再次感谢! @clb,我不确定它是否被认为是 Xamarin 问题,显然 XCode 有办法强制它工作。但是,如果我不得不猜测问题可能源于“发布存档”选项。如果我没记错的话,这实际上是组装由 XCode 或 Application Loader 签名和构建的 *.xcarchive 文件。 【参考方案1】:

您的 Xcode 版本是多少?确保使用最新的和通用的,我相信它是 7.3。 Readme 上描述的脚本从 Xcode 文件夹中复制文件。

如果您解压脚本运行后创建的 IPA,您可以检查该文件夹是否存在。

重建和绑定库时,选项“在目标设置中将标志 EMBEDDED_CONTENT_CONTAINS_SWIFT 设置为 YES”对我也不起作用。

Apple 在尝试发布时声明:“无效的框架文件夹”。 Xcode 将嵌入文件,如:'Payload/YOURAPP.app/Frameworks/Charts.framework/Frameworks/libswiftCore.dylib',但在最终应用程序中,它应该是:'Payload/YOURAPP.app/Frameworks/libswiftCore.dylib ' 和 'SwiftSupport/libswiftCore.dylib'。

为了解决这个问题,库在构建过程中做了它。而且您需要脚本来修复“SwiftSupport”文件夹。我没有找到篡改 Xamarin Studio 'Archive for Publish' 功能的方法。

【讨论】:

【参考方案2】:

更新:您可以使用我整理的这个脚本来修复您的 IPA,使其格式正确,在 Github 上下载 Auto IPA Packager。它是我在下面引用的 IPA Packager 的简化版,并且也处理了下面的所有步骤。

所以,我终于把它正确地提交到了 App Store,只是比我预期的要多跳几个步骤。我的很多困惑是因为我不想遗漏其他工件。我决定在这里列出该过程,以便将来部署需要使用此工具的 iOS 应用程序的任何人都非常清楚。

    从 GitHub 下载 IPA Packager。 然后转到 Xamarin Studio,并选择 Build > Archive for Publishing。 我一直在使用 XCode 导出我的档案。打开 XCode,窗口 > 管理器。找到您的应用存档,然后点击“导出”并按照相应的步骤进行操作,然后保存。 找到 .ipa 文件并将其更改为 .zip,然后解压缩。 接下来,在提取的文件中,找到“AppNameFolder > Payload > AppName.app”。

    加载终端并执行以下操作:

    sh package_ipa.sh /AppNameFolder/Payload/AppName.app /AppNameFolder/AppName.ipa

    现在应该创建 AppName.ipa。该文件应该可以上传到 App Store。但是,如果您的 AppNameFolder 有一个“符号”目录,您应该按照以下附加步骤...

    可选:如果您有符号文件,则应将 AppName.ipa 更改为 AppName.zip 并解压缩文件。

    将“AppNameFolder > Symbols”目录拖到解压后的 AppName 文件夹中,然后压缩文件夹内容并将扩展名改回 .ipa。

【讨论】:

感谢@lucas-teixeira 的帮助【参考方案3】:

我在让@jamesbar2 solution 工作时遇到了一些问题。这是我使用 Swift 包上传 Xamarin 构建的手动步骤。

    存档您的应用以供发布。 当档案窗口弹出时,在 Finder 中转到它(右键单击它并选择“在 Finder 中显示”)。 当 Finder 出现时,我们需要访问存档的内容(右键单击并选择“显示包内容”)。 在存档包中,创建一个名为“SwiftSupport”的文件夹。 在包内导航到“Product/Applications/YourAppName.app/Frameworks”(您需要右键单击 .app 并选择“显示包内容”)。 复制所有 swift ".dylib" 文件到 Frameworks 目录中。 导航回“SwiftSupport”并粘贴复制的库。 现在启动 Xcode 并加载 Organizer(窗口 -> Organizer)。 在存档中找到您的应用并“上传到 App Store...”。

我只能使用 Xcode Organizer 让它工作,使用 Xamarin 总是失败。

注意:我正在使用 Visual Studio for Mac Community 7.3.2(内部版本 12)。

更新:

我最近在上传时遇到了问题,TestFlight 拒绝电子邮件说:

 The file libswiftCore.dylib doesn’t have the correct code signature. blah, blah, blah. 

要解决此问题,而不是从您的应用程序框架文件夹中复制框架,请从 Xcode 中获取它们。您可以在以下位置找到它们:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos

注意,如果我将所有框架添加到 SwiftSupport 文件夹,TestFlight 将拒绝我的构建。仅包含您的应用正在使用的框架。

【讨论】:

啊,是的,自从 Xcode 更新以来,我还没有更新我的解决方案。实际上,我最终只是废弃了它并使用 Swift 重新编写了应用程序。当时我在 Github 上发布了一个快速修复程序以使其正常工作,但它已经过时了。 github.com/jamesbar2/auto-ipa-packager 。不过有人已经分叉了,希望这对你也有用。

以上是关于“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库的主要内容,如果未能解决你的问题,请参考以下文章

无效的 Swift 支持 - 文件不匹配

无效的二进制或无效的 Swift 支持

无效的 Swift 支持 xcode 8 itunesconnect 问题

无效的 Swift 支持 xcode 版本 11.6 (11E708)

无效的 Swift 支持

提交应用程序时无效的 Swift 支持