用于 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)