我正在尝试为万事达卡提供的iOS框架库(可提供here的zip)创建Xamarin iOS绑定项目,以允许进行应用内付款。请注意,我目前正在尝试绑定为iPhoneOS平台提供的框架(MasterpassKit_v1_32_build_11 \ iPhoneOS \ MasterPassKit.framework)。
我尝试遵循“绑定iOS Objective-C库” walkthrough的方法,目前只能使用Objective Sharpie来生成ApiDefinition文件。
首先,为了确认iOS框架是否有效,我创建了两个本地iOS测试应用程序(Objective-C + Swift),并且能够成功嵌入和使用该框架。
然后,我尝试使用以下命令(在包含MasterPassKit.framework目录的目录中,即\ MasterpassKit_v1_32_build_11 \ iPhoneOS)运行Objective Sharpie:
1)我尝试使用-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:警告:未指定“分配”,“保留”或“复制”属性-假定“分配” [-Wobjc-property-no-attribute] @property UIView * dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1:警告:默认属性属性“分配”不适用于非GC对象[-Wobjc-property-no-attribute]
绑定... 生成2条警告。 没有解析任何可以绑定的类型
完成。退出并显示错误代码1。
2)然后,我尝试使用显式框架选项(将范围指定给框架头文件夹)。这样产生的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]
绑定... [write] ApiDefinitions.cs
绑定分析: 自动绑定已完成,但是有一些API带有[Verify]属性标记。尽管应该对整个绑定进行审计以获得最佳的API设计实践,但是请通过以下验证属性提示更仔细地查看API:
ConstantsInterfaceAssociation(1个实例): 没有万无一失的方法来确定外部变量声明可以与哪个Objective-C接口关联。这些实例的实例在部分接口中作为[Field]属性绑定到附近的具体接口中,以产生更多 直观的API,可能会完全消除“常量”界面。
验证了Verify属性后,应将其从绑定源代码中删除。验证属性的存在是故意导致构建失败的原因。
有关上述“验证”属性提示的更多信息,请通过运行“ sharpie docs”或访问以下URL来查阅Objective Sharpie文档:http://xmn.io/sharpie-docs
产生了2条警告。
完成。
3)我尝试使用类似于以前的显式框架命令,但是省略了-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 [write] StructsAndEnums.cs
绑定分析: 自动绑定已完成,但是有一些API带有[Verify]属性标记。尽管应该对整个绑定进行审计以获得最佳的API设计实践,但是请通过以下验证属性提示更仔细地查看API:
ConstantsInterfaceAssociation(201个实例): 没有万无一失的方法来确定外部变量声明可以与哪个Objective-C接口关联。这些实例的实例在部分接口中作为[Field]属性绑定到附近的具体接口中,以产生更多 直观的API,可能会完全消除“常量”界面。
MethodToProperty(192个实例): 由于约定,例如不带参数并返回值(非无效返回),因此将Objective-C方法绑定为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个实例): 此最初匿名声明的名称取自其成员的通用前缀。
验证了Verify属性后,应将其从绑定源代码中删除。验证属性的存在是故意导致构建失败的原因。
有关上述“验证”属性提示的更多信息,请通过运行“ sharpie docs”或访问以下URL来查阅Objective Sharpie文档:http://xmn.io/sharpie-docs
产生了2条警告。
完成。
请让我知道我做错了什么。
任何帮助将不胜感激!
更新
所以我最终使它工作了。我首先必须将伞标头的导入引用展平,然后运行以下命令来生成有效的ApiDefinition和Struct文件:
sharpie bind -output MasterPassBindings -namespace MasterPassBindings -sdk iphoneos12.1 -scope Headers Headers/MasterPassKit.h -c -IHeaders -arch arm64