项目是根据Cocoapods初始化创建的,开发阶段和xcode调试阶段都是正常的,但将打包后的插件放到uni-app项目的nativeplugins处,引用本地插件报错,报错信息如下:
ld: warning: -ld64 is deprecated, use -ld_classic instead
ld: warning: arm64 function not 4-byte aligned: _dc_ffi_call_SYSV from [SourcePath]/libs/UniSDK/liblibPGInvocation.a(sysv_arm64.o)
ld: warning: arm64 function not 4-byte aligned: _ffi_closure_SYSV from [SourcePath]/libs/UniSDK/liblibPGInvocation.a(sysv_arm64.o)
ld: warning: Could not find or use auto-linked framework 'FirebaseCore'
ld: warning: Could not find or use auto-linked framework 'CoreAudioTypes'
ld: warning: Could not find or use auto-linked framework 'FirebaseMessaging'
Undefined symbols for architecture arm64:
\"_OBJC_CLASS_$_FIRApp\", referenced from:
objc-class-ref in sunways_mnmodule(SwUniPluginProxy.o)
\"_OBJC_CLASS_$_FIRMessaging\", referenced from:
objc-class-ref in sunways_mnmodule(SwUniPluginProxy.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
从官网和网上找了很多方法,如下解决办法:
1. iOS Undefined ..Arm64问题解决-优快云博客
2. iOS Undefined symbols for architecture armv7 _OBJC_CLASS_$_**", referenced from:
上面提到的问题中,能调试的都调试后,发现都不能解决我的问题
后来查看官网原生插件案例,发现插件的package.json配置有问题。
列举下package.json的配置项说明
{
"name": "插件名称",
"id": "插件标识,需要保证唯一性",
"version": "插件版本号",
"description": "插件描述信息",
"_dp_type":"nativeplugin",
"_dp_nativeplugin":{
"android": {
"plugins": [
{
"type": "module|component, 必填, 根据插件类型选择",
"name": "必填, 注册插件的名称, 注意:module 的 name 必须以插件id为前缀或和插件id相同,比如 `DCTestUniPlugin-TestModule`,其中 DCTestUniPlugin 为插件的id,避免与其他插件冲突,component 的 name 没有强制要求,但是也要保证唯一比如 `dc-map`",
"class": "必填, 注册插件的类名"
}
],
"hooksClass": "可选, 事件钩子注册类名",
"integrateType": "必填, 可取值aar|jar",
"dependencies": [
"可选, 依赖的库名称"
],
"excludeDependencies": [
"可选,需要排除的HX内置模块依赖库名称" //HBuilderX3.1.18+支持:仅在插件与HX内置模块依赖库存在冲突时可能需要,使用前请在官方QQ交流群“DCloud原生开发者群”中联系管理员确认
],
"compileOptions": { //可选,Java编译参数配置
"sourceCompatibility": "1.8",
"targetCompatibility": "1.8"
},
"abis": [
"可选, 支持的abi类型, 可取值armeabi-v7a|arm64-v8a|x86"
],
"minSdkVersion": "可选,支持的Android最低版本,如21",
"useAndroidX": false, //可选,是否兼容使用AndroidX 3.2.5+版本后废弃该属性
"permissions": [
"可选, 要使用的Android权限列表"
],
"parameters": {
"插件需要配置的参数名称, 如appid": {
"des": "参数描述",
"key": "AndroidManifest.xml中添加meta-data节点!对应android:name属性值, 如GETUI_APPID",
"placeholder": "build.gradle中添加到manifestPlaceholders中的字段名"
}
}
},
"ios": {
"plugins": [
{
"type": "必填, module|component, 根据插件类型选择",
"name": "必填, 注册插件的名称, 通常与插件标识一致",
"class": "必填, 注册插件的类名"
}
],
"integrateType": "必填, 可取值framework|library",
"hooksClass": "可选, 事件钩子注册类名",
"frameworks": [
"依赖的系统库(系统库有.framework和.tbd和.dylib类型),和第三方.framework动态库;(.a 库或 .framework**静态库**直接放到ios根目录即可,不需要配置)"
],
"embedFrameworks": [
"依赖的.framework动态库(注意.framework动态库也需要在上面的 frameworks 节点添加配置,同样将动态库.framework文件放到 ios 目录)"
],
"capabilities": { // 配置应用的capabilities数据(根据XCode规范分别配置到entitlements和plist文件中)
"entitlements": { // 合并到工程entitlements文件的数据(json格式)
},
"plists": { // 合并到工程Info.plist文件的数据(json格式)
}
},
"plists": { // 自定义配置工程Info.plist文件的数据(json格式),优先级高于capabilities->plists
},
"assets": [ //HBuilderX2.3.4及以上版本支持
"可选,插件要使用的xcassets文件列表,相对于ios目录的路径"
],
"privacies": [
"可选, 插件使用到的隐私列表,如NSPhotoLibraryUsageDescription"
],
"embedSwift": false, // 开启 swift 编译支持,如果插件使用了 swift 需要配置此项
"deploymentTarget": "8.0, 可选,注意:使用 Xcode14 需配置为 "11.0"
"validArchitectures": [ // 可选,支持的CPU架构类型
"arm64" // 支持多个值,可取值:"arm64", "armv7",注意:使用 Xcode14 需要配置为 “arm64”
],
"parameters": {
"插件需要配置的参数名称, 如appid": {
"des": "参数描述信息",
"key": "参数需要配置到info.plist中的键名, 嵌套时使用:分割,如getui:appid"
}
},
"resources": [
"可选, 插件要使用的资源文件列表,相对于ios目录的路径 ,HX 3.2.0+ 版本不在推荐使用,请参考文档下面的 “依赖资源文件” 说明"
]
}
}
}
如果插件本身的framework是动态库或者第三方依赖库是动态库(framework中有Headers和Modules等就属于动态库),那么就需要手动在ios文件夹中添加,并在package.json中的embedFrameworks中配置上;资源文件(添加在插件工程项目中的资源文件,这里就是GoogleService-Info.plist文件)需要再添加在resources 中。
故而修改我的package.json文件如下
{
"name": "message",
"id": "sunways-mnmodule",
"version": "0.1.0",
"description": "message",
"_dp_type":"nativeplugin",
"_dp_nativeplugin":{
"ios": {
"plugins": [
{
"type": "module",
"name": "sunways-mnmodule",
"class": "SwUniTestModule"
}
],
"integrateType": "library",
"hooksClass": "SwUniPluginProxy",
"deploymentTarget": "12.0",
"embedFrameworks": [
"FirebaseAuth.framework",
"FirebaseCore.framework",
"FirebaseCoreInternal.framework",
"FirebaseInstallations.framework",
"FirebaseMessaging.framework",
"GTMSessionFetcher.framework",
"GoogleDataTransport.framework",
"GoogleUtilities.framework",
"FBLPromises.framework",
"RecaptchaInterop.framework",
"nanopb.framework",
"AlipaySDK.framework",
"GTSDK.framework",
"FirebaseAppCheckInterop.framework",
"sunways_mnmodule.framework"
],
"resources": [
"GoogleService-Info.plist"
]
}
}
}
本地插件文件结构如下: