用于 swift 库的 Xamarin.iOS 绑定

Posted

技术标签:

【中文标题】用于 swift 库的 Xamarin.iOS 绑定【英文标题】:Xamarin.iOS binding for a swift library 【发布时间】:2019-05-14 03:24:07 【问题描述】:

我正在为要在 xamarin 项目中使用的 swift 库创建绑定。当我在ios项目中使用绑定项目时,出现以下错误:

Dyld Error Message:
Library not loaded: @rpath/Alamofire.framework/Alamofire
Referenced from: 
/Users/USER/Library/Developer/CoreSimulator/Devices/73CDF7FB-D700-4F35- 
AB8B-DD7F7B134C1E/data/Containers/Bundle/Application/9FB74CDE-93C3- 
4EB7-9833- FA060281CE46/XXXXXXXX.iOS.app/Frameworks/MobiiiSDK.framework/MobiiiSDK
Reason: image not found

我已将 https://github.com/Flash3001/Xamarin.Swift 添加到我的项目中以引用 swift 库。

已将 SmartLink 和 ForceLink 都设置为 true

我已经删除了所有项目中的 obj 和 bind 文件夹。也进行了清理和重建。

对于修复此错误的任何帮助,我将不胜感激。

【问题讨论】:

您将 Swift 库添加到了哪个项目? Xamarin.iOS 绑定库项目还是应用程序项目? (即需要将它们添加到应用程序项目中) @SushiHangover :我添加到应用程序项目中。 @LibinJoseph /Users/USER/Library/Developer/CoreSimulator/Devices/73CDF7FB-D700-4F35- AB8B-DD7F7B134C1E/data/Containers/Bundle/Application/9FB74CDE-93C3- 4EB7-9833- FA060281CE46/XXXXXXXX.iOS.app/Frameworks/MobiiiSDK.framework/MobiiiSDK 文件真的存在吗?似乎缺少特定的框架 @dalexsoto:我刚刚确认了。它在那里 【参考方案1】:

这可能不是您问题的直接答案,但绝对可以带您走向正确的方向,这是您可以用作参考的Office UI Fabric Xamarin.iOS Swift 绑定项目,它不使用(不需要) Xamarin.Swift 但使用了一个使用 swift-stdlib-tool 的 msbuild 脚本,这是 Xcode 用来确定哪些 swift 库需要与您的应用程序捆绑在一起的工具。需要将脚本 [1] 添加到您的最终应用 .csproj,如 here 所示。

在您的特定情况下,您的捆绑包中似乎缺少MobiiiSDK.framework

[1]:将 Swift 库捆绑到 Xamarin iOS 应用程序中的 MSBuild 脚本

<PropertyGroup>
    <_SwiftySwiftMasterAfterTargets>_CodesignNativeLibraries</_SwiftySwiftMasterAfterTargets>
    <_SwiftySwiftMasterDependsOnTargets>_SwiftySwiftCopySwiftDependencies</_SwiftySwiftMasterDependsOnTargets>
    <_XcodeToolChainRelativeToSdkRoot>/../../../../../Toolchains/XcodeDefault.xctoolchain/</_XcodeToolChainRelativeToSdkRoot>
    <_TargetPlatform Condition=" '$(Platform)' == 'iPhoneSimulator' ">iphonesimulator</_TargetPlatform>
    <_TargetPlatform Condition=" '$(Platform)' == 'iPhone' ">iphoneos</_TargetPlatform>
    <_SwiftySwiftRemoteMirror Condition=" '$(Configuration)' != 'Debug' "></_SwiftySwiftRemoteMirror>
    <_SwiftySwiftRemoteMirror Condition=" '$(Configuration)' == 'Debug' ">--resource-library libswiftRemoteMirror.dylib</_SwiftySwiftRemoteMirror>
  </PropertyGroup>
  <Target Name="_SwiftySwiftMasterTarget" Condition="'$(_SwiftySwiftMasterDependsOnTargets)'!=''" AfterTargets="$(_SwiftySwiftMasterAfterTargets)" DependsOnTargets="$(_SwiftySwiftMasterDependsOnTargets);_DetectSigningIdentity" />
  <Target Name="_SwiftySwiftCopySwiftDependencies" Condition="!Exists('$(_AppBundlePath)Frameworks/libswiftCore.dylib')">
    <Message Text="Copying Swift Frameworks dependencies for $(_NativeExecutable) to the $(_AppBundlePath)Frameworks folder." />
    <Exec Condition="'$(_CodeSigningKey)' != ''" SessionId="$(BuildSessionId)" Command="$(_SdkRoot)$(_XcodeToolChainRelativeToSdkRoot)usr/bin/swift-stdlib-tool --copy --verbose --sign '$(_CodeSigningKey)' --scan-executable '$(_NativeExecutable)' --scan-folder '$(_AppBundlePath)Frameworks/' --scan-folder '$(_AppBundlePath)PlugIns/' --platform '$(_TargetPlatform)' --toolchain '$(_SdkRoot)$(_XcodeToolChainRelativeToSdkRoot)' --destination '$(_AppBundlePath)Frameworks/' $(_SwiftySwiftRemoteMirror) --unsigned-destination '$(DeviceSpecificIntermediateOutputPath)/SwiftSupport' --strip-bitcode --strip-bitcode-tool '$(_SdkRoot)$(_XcodeToolChainRelativeToSdkRoot)usr/bin/bitcode_strip' --emit-dependency-info '$(DeviceSpecificIntermediateOutputPath)/SwiftStdLibToolInputDependencies.dep'" />
    <Exec Condition="'$(_CodeSigningKey)' == ''" SessionId="$(BuildSessionId)" Command="$(_SdkRoot)$(_XcodeToolChainRelativeToSdkRoot)usr/bin/swift-stdlib-tool --copy --verbose                             --scan-executable '$(_NativeExecutable)' --scan-folder '$(_AppBundlePath)Frameworks/' --scan-folder '$(_AppBundlePath)PlugIns/' --platform '$(_TargetPlatform)' --toolchain '$(_SdkRoot)$(_XcodeToolChainRelativeToSdkRoot)' --destination '$(_AppBundlePath)Frameworks/' $(_SwiftySwiftRemoteMirror) --unsigned-destination '$(DeviceSpecificIntermediateOutputPath)/SwiftSupport' --strip-bitcode --strip-bitcode-tool '$(_SdkRoot)$(_XcodeToolChainRelativeToSdkRoot)usr/bin/bitcode_strip' --emit-dependency-info '$(DeviceSpecificIntermediateOutputPath)/SwiftStdLibToolInputDependencies.dep'" />
  </Target>
  <Target Name="_SwiftySwiftCopySwiftSupport" Condition="'$(ArchiveOnBuild)'=='true'" AfterTargets="Archive">
    <Message Text="Copying SwiftSupport folder from $(DeviceSpecificIntermediateOutputPath)/SwiftSupport to $(ArchiveDir)/SwiftSupport folder." />
    <Ditto
        SessionId="$(BuildSessionId)"
        Condition="'$(IsMacEnabled)' == 'true'"
        ToolExe="$(DittoExe)"
        ToolPath="$(DittoPath)"
        Source="$(DeviceSpecificIntermediateOutputPath)/SwiftSupport"
        Destination="$(ArchiveDir)/SwiftSupport" />
  </Target>

希望这会有所帮助。

【讨论】:

我试过了,但我仍然得到同样的错误。还有什么我可以调查的,以获得一些可能导致它的提示吗? 我很抱歉。错误是因为我使用的框架没有为模拟器配置(不是胖库)。 @LibinJoseph 是否需要为模拟器生成胖库,甚至不需要支持?

以上是关于用于 swift 库的 Xamarin.iOS 绑定的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.iOS - 发布应用程序 - 无效的 Swift 支持 - 文件......不匹配

Xamarin.iOS - 发布应用程序 - 无效的Swift支持

如何覆盖 Xamarin.IOS UIButton 的 LayoutSublayersOfLayer 行为?

如何让 UIView / Menu 滑入和滑出? (使用 C# 而不是 Swift 的 Xamarin IOS)

是否可以在 Xamarin iOS/Android 中使用定义 PCL 的 RESX 文件来支持多语言?

Xamarin.iOS 与第三方框架的绑定