问题标签 [objective-sharpie]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
446 浏览

c# - 在 Sharpie 绑定命令中包含依赖项

如何在Sharpie绑定命令中包含依赖项?我需要将 swift 4 中制作的框架与 sdk iphoneos11.4 绑定,其中包含对另一个框架的引用,以通过本机引用移动到 Xamarin 中的 C# 应用程序(示例:https ://docs.microsoft.com/en-us /xamarin/ios/platform/embedded-frameworks?tabs=vsmac |||| https://medium.com/@Flash3001/binding-swift-libraries-xamarin-ios-ff32adbc7c76)。现在有一个错误,比如找不到模块(另一个框架),所以它创建了错误或不完整的 ApiDefinition 和 Structs 类。

我正在尝试使用此命令:Sharpie bind -sdk iphoneos11.4 NAME-Swift.h

还会收到此错误:“Unsupported clang availability platform 'bridgeos'”

感谢您的回答。

0 投票
1 回答
218 浏览

xamarin - Objective-sharpie ApiDefinition 包含重载方法?

经过一番摸索后,我终于得到了.framework成功绑定文件的 Objective-sharpie,但是ApiDefinition.cs它生成的文件包含一些不规则性。

所以这实际上不会编译,因为 Visual Studio 恰当地指出,尽管方法具有不同的[Export]属性,但它们具有完全相同的定义。我尝试更改它,因此只有一个具有多个[Export]属性的方法,但这也是不允许的。不知道在这里做什么。

using顶部还有一个声明,我认为试图指出Native Reference我已经在 Visual Studio for Mac 的 Xamarin 项目中进行了设置,但它不起作用(type or namespace could not be found are you missing an assembly reference, etc.

非常感谢任何帮助!

0 投票
0 回答
535 浏览

c# - 不支持的字段类型(枚举)

我正在尝试为 Xamarin 的 iOS 框架(由 Objective Sharpie 生成)创建绑定,但它在字段类型上遇到了问题:

结构体.cs:

ApiDefinition.cs:

它正在生成错误:

错误 BI1014:bgen:字段类型不受支持:'Namespace.Constants Foo' 的 FooType。

字段中不允许使用枚举吗?我该如何解决这个错误?

编辑:我找到了这个设置,但它没有修复错误: 设置截图

编辑2:显然可以是字段的类型列表非常有限,也许我应该将枚举类型转换为Int32?

编辑 3:将枚举类型转换为 Int32 有效,但这有效吗?代码会正确运行并返回有效值吗?

0 投票
1 回答
156 浏览

ios - 当我调用发布/订阅方法时,为什么我的 NearbyMessages Objective-C 到 C# 绑定会抛出 NSInvalidArgumentException?

我使用 Objective Sharpie 为Google 的 Nearby Messages API从 libGNSMessages.a 二进制文件和 NearbyMessages cocoapod 中的标头生成了一个半功能的 iOS C# 绑定。将该绑定库添加到 Xamarin.iOS 项目,我可以创建和访问 GMSMessage 和 GMSMessageManager 对象。但是,当我尝试使用 GMSMessageManager.publishWithMessage() 时,我得到了这个异常,即使我使用了正确的参数类型:

这是我在 AppDelegate.cs 的 FinishedLaunching 方法中使用的测试代码(我检查过,管理器和消息都是它们类型的有效实例):

这是它所引用的 Visual Studio 绑定项目中 ApiDefinitions.cs 的绑定(注释是原始 Objective-C 头文件中的方法签名):

这是引发异常的 GNSMessageManager.g.cs (由该 Visual Studio 项目生成)中的代码:

调试模式显示所有这三个参数至少是非空的。

这里有同样的例外:'NSConcreteMutableAttributedString initWithString:: nil value' when using Google Nearby Messages。但是,据称该错误已修复,当我在 XCode 中构建测试 swift 项目时,我用作 Sharpie 绑定基础的最新 CocoaPods 工作得很好,所以我的绑定可能是罪魁祸首。我尝试使用的NearbyMonkey中还包含一个较旧的二进制 C# NearbyMessages 库,但它在当前 iOS 版本中崩溃。

感谢您抽出宝贵时间阅读本文。您可以提供的任何帮助或建议将不胜感激。

0 投票
0 回答
83 浏览

objective-c - 无法将本机 Obj-C 库绑定到 Xamarin.iOS 项目

我在尝试将我在 XCode 中创建的本机 Obj-C 静态库绑定到我的 Xamarin.iOS 项目时遇到了困难。我完成了创建胖二进制文件的必要步骤。它创建了 x86 和 ARM 架构,但它抛出一个错误,说它在包装类中找不到本机 Obj-C 类。当我使用以下命令“nm -arch”检查手臂符号表时,符号表为空

链接到我尝试过的示例:https ://docs.microsoft.com/en-us/xamarin/ios/platform/binding-objective-c/walkthrough?tabs=windows#Creating_A_Static_Library

0 投票
0 回答
1493 浏览

objective-c - 使用 Objective Sharpie 绑定 MasterCard iOS 框架

我正在尝试为 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\):

  1. 我尝试使用 -framework 参数,但这导致没有生成任何文件。

    命令:

    输出:

    解析 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 退出。


  1. 然后我尝试使用显式框架选项(范围指定到框架头文件夹)。这导致了一个非常小的 ApiDefinition.cs 文件,其中只定义了一些全局常量,而没有实际的 Objective-c 类定义。

    命令:

    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 个警告。

    完毕。


  1. 我尝试使用类似于以前的显式框架命令,但是我省略了 -scope 参数。这导致了大量的 ApiDefinition.cs 和 StructsAndEnums.cs 文件,其中包含我认为主要是引用的框架定义(由于未限定到目标框架头文件夹)。这还包含许多用于核心框架的验证语句,这些语句将非常耗时。

    命令:

    输出:

    解析 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 文件:

0 投票
1 回答
997 浏览

ios - Xamarin 窗体 iOS WebRTC

我是论坛的新手,我非常感谢你们所有人用来解决问题的热情。

所以我在这里是因为我正在努力将 GoogleWebRTC 集成到我的 iOS 部分的 Xamarin Form 项目中(我能够制作一个原生 objC 测试应用程序),我尝试通过 CocoaPods 将它与 Sharpie Pod 集成并绑定它,但我无法解决在 ApiDefinitions.cs 上的绑定中创建的所有错误。

一段时间后,我发现这个项目https://github.com/valentingrigorean/apprtc-ios-xamarin已成功绑定库并修复了一些错误(编辑 WebRTCBinding.csproj 并删除 -lstdc++.6 链接器并删除了一些错误在代码中)但是当我尝试将该绑定库添加到我的项目中并尝试运行时返回我:

我究竟做错了什么?

提前致谢。

0 投票
0 回答
75 浏览

objective-c - 使用 Objective Sharpie 创建 IOS Binding 项目时缺少 CFNetwork 参考

我想使用 TriPos IOS 移动支付网关,我已经从官方网站下载了 IOS sdk " https://developer.vantiv.com/servlet/JiveServlet/download/1915-27-5158/iOS+Release+v1.4.0 +triPOS+Mobile+SDK.zip "。因为这是一个客观的 C 库,我不能直接在我的 Xamarion.IOS 项目中使用它。我在 Objective Sharpie 工具的帮助下使用命令 "sharpie bind /Users/" 创建了绑定项目kmit/Desktop/tripossdk/triPOSMobileSDK.framework/Headers/ triPOSMobileSDK.h -sdk iphoneos12.1”,它生成 Apidefinition.cs 和 StructAndEnum.cs 文件,错误很大。我已经根据参考“ https: //docs.microsoft.com/en-us/xamarin/ios/platform/binding-objective-c/walkthrough?tabs=windows#create-a-xamarinios-binding-project“。但似乎客观的Sharpie错过了添加CFNetwork参考所以我得到参考错误,所以我错过了什么吗?

我还尝试将 CFNetwork 包含为 dll 参考,但无法找到任何可参考的 dll。

错误参考

0 投票
1 回答
252 浏览

objective-c - 无法注册成员的选择器,因为选择器已在其他成员上注册

目前,我正在尝试为 Xamarin.iOS 项目绑定 Qualtrics 库,我做到了,但是当我运行项目时,应用程序崩溃了,它说

错误:“无法注册成员 'QualtricsIos.QualtricsSurveyViewController.UserContentController' 的选择器 'userContentController:didReceiveScriptMessage:',因为选择器已在成员 'DidReceiveScriptMessage' 上注册。

无法注册成员“QualtricsIos.QualtricsSurveyViewController..ctor”的选择器“initWithCoder:”,因为选择器已在成员“ConstructorCoder”上注册。

我已经尝试过类似于它的解决方案,但到目前为止还没有运气。我也检查了ApiDefinitionsStructsAndEnums我没有找到根本原因。谁能告诉我出了什么问题?

ApiDefinitions 文件:

StructsAndEnums 文件:

0 投票
2 回答
252 浏览

c# - 静态属性未通过绑定在类中实例化

当我访问 static propertySharedController时,值为 null,但 Objective Sharpie 生成的 API 定义只提供了一个 getter。

BBDeviceController已实例化,但其SharedController上的属性为空。因为它只有一个 getter,所以我不相信我能够在代码中实例化该属性。据我所知,SharedController没有在BBDeviceController的构造函数中初始化。我不确定BBDeviceController是静态类还是仅遵循单例设计模式,但无论哪种方式,更新该类都不是解决方案。

BBDeviceController.h

生成的 API 定义 ( APIDefinition.cs)

从项目的视图控制器调用

从目标 C 库的文档中,您可以sharedController这样使用:

[[BBDeviceController sharedController] setDelegate:self];

尝试执行 C# 等效项时,我收到一个错误,因为SharedController它为 null。其他可能感兴趣的是SharedController生成的 API 定义文件中的定义被标记为[Verify(MethodToProperty)],我必须手动添加[Static]才能从代码中访问它。