使用 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.plist 和 RTPrinterSDK.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等)