使用 iOS SDK 创建 NativeScript 插件会导致“架构的未定义符号”错误

Posted

技术标签:

【中文标题】使用 iOS SDK 创建 NativeScript 插件会导致“架构的未定义符号”错误【英文标题】:Creating NativeScript Plugin using iOS SDK results in 'Undefined symbols for architecture' errors 【发布时间】:2019-11-03 15:22:21 【问题描述】:

我正在尝试创建一个 NativeScript 插件,以便将蓝牙打印机的 ios SDK 集成到 NativeScript 应用程序中。

这是SDK as Static Framework的链接

我不断收到以下错误,army7 部分在全新安装插件后显示不同的值。

Undefined symbols for architecture armv7:
  "_CBCentralManagerScanOptionAllowDuplicatesKey", referenced from:
      -[RTBleService startScan:serviceArray:clear:] in RTPrinterSDK(RTBleService.o)
  "_OBJC_CLASS_$_CBCentralManager", referenced from:
      objc-class-ref in RTPrinterSDK(RTBleService.o)
  "_OBJC_CLASS_$_CBUUID", referenced from:
      objc-class-ref in RTPrinterSDK(RTBleService.o)
ld: symbol(s) not found for architecture armv7
note: Using new build systemnote: Planning buildnote: Constructing build description

除了尝试使用官方的插件种子插件之外,我最终做了以下根据我的研究应该已经足够了:

安装:

1) 在 /app 目录中为插件文件创建了一个文件夹(该插件目前仅适用于该项目)。该文件夹的结构如下:

/app/plugin/src/package.json   
/app/plugin/src/platforms/ios/RTPrinterSDK.framework  

RTPrinterSDK.framework 有两个文件夹,Headers(有 .h 文件)和 Modules(有 module.modulemap 文件)以及 Info.plistRTPrinterSDK.a 这两个文件。

2) 我已经通过运行tns plugin add app/plugin/src将插件添加到项目中

3) 我相信现在tns run ios --bundle 应该使用插件在连接的设备上运行项目 - 尽管我还没有在应用程序上使用插件做任何事情。

健全性检查:

1) lipo -info app/plugin/src/platforms/ios/RTPrinterSDK.framework/RTPrinterSDK 显示Architectures in the fat file: /path-to-RTPrinterSDK are: army7 i386 x64_64 arm64

2) tns run ios --bundle 没有自定义插件在模拟器和真实设备上都可以工作

3) 以防万一,我也在一个全新的 --ts 项目中尝试过这个

4) SDK 附带一个演示应用程序。虽然它不是 NativeScript 应用程序,但它是一个 Xcode 项目文件,我能够在同一个连接的设备上成功运行它。

SDK 中有一条注释引用了ble_serial.plist 文件。根据说明,我确信我需要将其集成到插件文件夹中的某个位置以访问蓝牙连接,但我不确定在哪里。鉴于错误指的是名称中带有 "Ble" 的模块,我担心可能存在关联。

请注意,我没有编写/准备 SDK。打印机的供应商提供了它。我只能在提供时访问它。

我非常感谢有关此问题的任何提示或反馈。

【问题讨论】:

我猜你使用的是自定义框架,你编译成通用的了吗? @Manoj 听起来 OP 没有原始源代码;供应商按原样提供了此 SDK,这就是我们必须与之合作的全部内容。 恐怕@JamieBirch 是对的,因为它也在问题中突出显示。 请注意,我没有编写/准备 SDK。打印机的供应商提供了它。我只能在提供时访问它。 【参考方案1】:

根据 NativeScript 社区的宝贵建议,我发现错误中的 CB 前缀指的是 CoreBluetooth

为了确保它被加载,我最终在/app/plugin/src/platforms/ios/build.xcconfig 创建了一个新文件,并在其中添加了以下行:

OTHER_LDFLAGS = $(inherited) -framework "CoreBluetooth"

它现在可以在设备上编译和运行了。

【讨论】:

以上是关于使用 iOS SDK 创建 NativeScript 插件会导致“架构的未定义符号”错误的主要内容,如果未能解决你的问题,请参考以下文章

IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)

如何在 Swift 中为 iOS 创建 SDK?

iOS 开发之如何生成SDK

无法在 iOS 中使用 FB SDK 创建自定义开放图故事

使用 iOS SDK 创建 NativeScript 插件会导致“架构的未定义符号”错误

iOS 封装SDK