2

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

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

BBDeviceController.h

@interface BBDeviceController : NSObject {
    NSObject <BBDeviceControllerDelegate>* delegate;

    BOOL debugLogEnabled;
    BOOL detectAudioDevicePlugged;
}

@property (nonatomic, weak) NSObject <BBDeviceControllerDelegate>* delegate;
@property (nonatomic, getter=isDebugLogEnabled, setter=setDebugLogEnabled:) BOOL debugLogEnabled;
@property (nonatomic, getter=isDetectAudioDevicePlugged, setter=setDetectAudioDevicePlugged:) BOOL detectAudioDevicePlugged;

+ (BBDeviceController *)sharedController;

生成的 API 定义 ( APIDefinition.cs)

[BaseType(typeof(NSObject))]
[Protocol]
interface BBDeviceController
{
    ...
    // +(BBDeviceController *)sharedController;
    [Static]
    [Export("sharedController")]
    BBDeviceController SharedController { get; }
    ...
}

从项目的视图控制器调用

public BBDeviceController bbDeviceController;
public override void ViewDidLoad()
{
    base.ViewDidLoad();
    bbDeviceController = BBDeviceController.SharedController;
    ConnectDevice();
}

private void ConnectDevice()
{
    bbDeviceController.StartBTScan(new string[] { DEVICE_NAME }, 60);
}

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

[[BBDeviceController sharedController] setDelegate:self];

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

4

2 回答 2

1

我不确定您的确切问题是什么(可能是链接不正确,可能是 plist 设置不正确等),但我已经使用最新的 SDK 成功完成了此操作(截至写作时为 v3.7.2) . 以下是步骤:

1. 使用以下sharpie命令进行绑定:

sharpie bind --output=. --namespace=WisePad2Binding --sdk=iphoneos13.2 --scope=<path-to-sdk>/BBDevice-iOS-SDK-3.7.2/Library <path-to-sdk>/BBDevice-iOS-SDK-3.7.2/Library/BBDeviceController.h

2.删除[Verify]标签

我继续将所有更改为属性的方法都改回了标记为的属性,[Verify]以减少机会。

3. 将库添加到您的绑定项目

在绑定产品中,我没有使用“Native References”文件夹(好吧,我最初尝试过,但没有成功)。显然,制作绑定项目的“旧”方法是将库拖到项目根目录上。执行此操作时,每个库都会.linkwith.cs附加一个(稍后会详细介绍)。我添加的库是:

  • libBBDevice-iOS-AudioAndBT-3.7.2.a
  • libBBDevice-iOS-AudioAndBT-3.7.2-simulator.a
  • libBBDeviceOTA-iOS-1.5.4.a
  • libBBDeviceOTA-iOS-1.5.4-simulator.a

然后在每个.linkwith.cs文件中将程序集属性更改为...

[assembly: LinkWith ("<library-name>.a", SmartLink = true, ForceLoad = true, Frameworks = "AudioToolbox AVFoundation CoreAudio CoreBluetooth CoreGraphics CoreFoundation CoreLocation ExternalAccessory Foundation MediaPlayer MessageUI QuartzCore SystemConfiguration UIKit", LinkerFlags = "-lc++ -lz -ObjC")]

4. 更新你的 plist

确保将他们在此处列出的所有内容都添加到您的 plist 中,否则内容将无法正常工作。

5. 小贴士

如果我没有在主线程上做一些(全部?)事情,我就无法让事情正常工作,所以我只是在主线程上执行所有操作。此外,不要在没有调用的情况下在共享控制器上设置委托BBDeviceController.SharedController.ReleaseBBDeviceController()(如果您之前在那里设置了委托)。我的想法和祈祷向其他任何尝试将此 SDK 与 Xamarin 一起使用的人。

于 2019-11-25T00:06:53.343 回答
0

当我做这样的事情时,它是针对单例类的。 https://www.galloway.me.uk/tutorials/singleton-classes/

因此,您的 sharedController 方法应该分配您的 BBDeviceController 或将其获取到某个地方。另外,如果您可以共享库链接,那么我们就在同一页面上。

于 2019-08-21T09:01:24.963 回答