我正在尝试为 MasterCard 提供的 iOS 框架库(此处提供 zip )创建一个 Xamarin iOS 绑定项目,以允许应用内付款。请注意,我目前正在尝试绑定为 iPhoneOS 平台 ( MasterpassKit_v1_32_build_11\iPhoneOS\MasterPassKit.framework
) 提供的框架。
我已经尝试按照“绑定 iOS Objective-C 库”演练进行操作,目前我坚持使用 Objective Sharpie 生成 ApiDefinition 文件。
首先,为了确认 iOS 框架是有效的,我创建了两个原生 iOS 测试应用程序(Objective-C + Swift)并且能够成功嵌入和使用该框架。
然后我尝试使用以下命令运行Objective Sharpie(在包含MasterPassKit.framework
目录 ie的目录中\MasterpassKit_v1_32_build_11\iPhoneOS\
):
我尝试使用 -framework 参数,但这导致没有生成任何文件。
命令:
sharpie bind -framework MasterPassKit.framework -sdk iphoneos12.1
输出:
解析 1 个头文件...在构建从 /private/var/folders/hq/z29y24gs1_g_5qvp02vr07dh0000gq/T/com.xamarin.ObjectiveSharpie/c3f67365a4014cc0a4618aa6e0caaa87.h:1 导入的模块“MasterPassKit”时:包含在文件中:1:包含在文件中来自 ./MasterPassKit.framework/Headers/MasterPassKit.h:21: ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: 警告:未指定“分配”、“保留”或“复制”属性 - 'assign' 假定为 [-Wobjc-property-no-attribute] @property UIView *dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1:警告:默认属性“分配”不适用于非 GC 对象 [-Wobjc-property-no-attribute]
正在绑定... 生成 2 个警告。没有解析出可以绑定的类型
完毕。以错误代码 1 退出。
然后我尝试使用显式框架选项(范围指定到框架头文件夹)。这导致了一个非常小的 ApiDefinition.cs 文件,其中只定义了一些全局常量,而没有实际的 Objective-c 类定义。
命令:
sharpie bind -output bindingscoped -sdk iphoneos12.1 -scope MasterPassKit.framework/Headers
MasterPassKit.framework/Headers/MasterPassKit.h -c -F 。
输出:
解析 1 个头文件...在 /Users/development/Desktop/iOS/MasterpassKit_v1_32_build_11/iPhoneOS/MasterPassKit.framework/Headers/MasterPassKit.h:21: ./MasterPassKit.framework/Headers/MPPresentationController.h:13 中包含的文件中: 1:警告:未指定“分配”、“保留”或“复制”属性 - 假定“分配” [-Wobjc-property-no-attribute] @property UIView *dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1:警告:默认属性“分配”不适用于非 GC 对象 [-Wobjc-property-no-attribute]
绑定... [写] ApiDefinitions.cs
绑定分析:自动绑定已完成,但有一些 API 已被标记为 [Verify] 属性。虽然应该审核整个绑定以获得最佳 API 设计实践,但更仔细地查看具有以下验证属性提示的 API:
ConstantsInterfaceAssociation(1 个实例):没有万无一失的方法来确定外部变量声明可能与哪个 Objective-C 接口相关联。这些实例作为部分接口中的 [Field] 属性绑定到附近的具体接口中,以生成更直观的 API,可能完全消除“常量”接口。
一旦您验证了一个验证属性,您应该将它从绑定源代码中删除。验证属性的存在会故意导致构建失败。有关上述验证属性提示的更多信息,请通过运行“sharpie docs”或访问以下 URL 查阅 Objective Sharpie 文档:http: //xmn.io/sharpie-docs
生成 2 个警告。
完毕。
我尝试使用类似于以前的显式框架命令,但是我省略了 -scope 参数。这导致了大量的 ApiDefinition.cs 和 StructsAndEnums.cs 文件,其中包含我认为主要是引用的框架定义(由于未限定到目标框架头文件夹)。这还包含许多用于核心框架的验证语句,这些语句将非常耗时。
命令:
sharpie bind -output bindingnoscoped -sdk iphoneos12.1 MasterPassKit.framework/Headers/MasterPassKit.h -c -F .
输出:
解析 1 个头文件...在 /Users/development/Desktop/iOS/MasterpassKit_v1_32_build_11/iPhoneOS/MasterPassKit.framework/Headers/MasterPassKit.h:21: ./MasterPassKit.framework/Headers/MPPresentationController.h:13 中包含的文件中: 1:警告:未指定“分配”、“保留”或“复制”属性 - 假定“分配” [-Wobjc-property-no-attribute] @property UIView *dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1:警告:默认属性“分配”不适用于非 GC 对象 [-Wobjc-property-no-attribute]
绑定... [写] ApiDefinitions.cs [写] StructsAndEnums.cs
绑定分析:自动绑定已完成,但有一些 API 已被标记为 [Verify] 属性。虽然应该审核整个绑定以获得最佳 API 设计实践,但更仔细地查看具有以下验证属性提示的 API:
ConstantsInterfaceAssociation(201 个实例):没有万无一失的方法来确定外部变量声明可能与哪个 Objective-C 接口相关联。这些实例作为部分接口中的 [Field] 属性绑定到附近的具体接口中,以生成更直观的 API,可能完全消除“常量”接口。
MethodToProperty(192 个实例):Objective-C 方法由于诸如不带参数和返回值(非 void 返回)之类的约定而被绑定为 C# 属性。通常,像这样的方法应该绑定为属性以呈现更好的 API,但有时可能会出现误报,并且绑定实际上应该是一种方法。
StronglyTypedNSArray(42 个实例):本机 NSArray* 被绑定为 NSObject[]。根据通过 API 文档设置的期望(例如头文件中的注释)或通过测试检查数组内容,可能会在绑定中更强烈地键入数组。例如,一个仅包含 NSNumber* 实例的 NSArray* 可以绑定为 NSNumber[] 而不是 NSObject[]。
PlatformInvoke(3251 个实例):通常 P/Invoke 绑定不如 Objective-C 绑定正确或完整(至少目前如此)。您可能需要手动修复库名称(默认为“__Internal”)和返回/参数类型以符合目标平台的 C 调用约定。您可能会发现您甚至不想在绑定中公开 C API,但如果这样做,您可能还希望将定义重新定位到更合适的类并公开更强大的类型安全包装器。有关 P/Invoke 指南,请参阅http://www.mono-project.com/docs/advanced/pinvoke/。
InferredFromMemberPrefix(29 个实例):这个最初匿名声明的名称取自其成员的公共前缀。
一旦您验证了一个验证属性,您应该将它从绑定源代码中删除。验证属性的存在会故意导致构建失败。有关上述验证属性提示的更多信息,请通过运行“sharpie docs”或访问以下 URL 查阅 Objective Sharpie 文档:http: //xmn.io/sharpie-docs
生成 2 个警告。
完毕。
如果我做错了什么,请告诉我。
任何帮助将不胜感激!
更新
所以我最终让它工作了。我首先必须展平伞形标头的导入引用,然后运行以下命令来生成有效的 ApiDefinition 和 Struct 文件:
sharpie bind Headers/MasterPassKit.h -output MasterPassBindings -namespace MasterPassBindings -sdk iphoneos12.1 -scope Headers Headers/MasterPassKit.h -c -IHeaders -arch arm64