iOS调用FrameWork报错

本文探讨了在Objective-C开发中遇到的“selectornotrecognized”错误,详细解释了该问题的原因在于Category与原类之间的链接缺失,并提供了解决方案,包括在buildsettings中添加-Objc选项以及在特定情况下使用-all_load或-force_load选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发过程中,添加framework后,调用framework方法出现 “selector not recognized” ,查看了日志,是framework里面使用category,原因是ObjectiveC不会为每一个objc函数生成链接符号,而是会为每一个类生成链接符号。通过category对一个已有的类进行扩展,那么链接器就不知道如何把原代码与category的代码实现关联起来,导致生成的对象无法响应属于category的消息。
解决方法: build settings中的Other Linker Flags添加-Objc选项。这个选项会促使链接器加载库中所有定义了Class和Category的文件。但这些额外的代码会使目标文件变大。但在64位和iOS应用程序中,linker有一个bug,这个bug会导致objc选项无效,无法从静态库中加载只定义了Category的文件 ,这就需要添加-all_load或-force_load选项

在 UniApp 中使用自定义基座进行真机调试时,调用 `uni.chooseLocation` 出现报错的问题较为常见,尤其是在离线打包或自定义基座运行时。以下是可能的原因及对应的解决方案: ### 1. 权限配置问题 在 Android 平台上,`uni.chooseLocation` 依赖于系统定位权限。如果在 `manifest.json` 的打包配置中未正确声明相关权限,可能导致定位功能无法调用。 ```json "distribute": { "android": { "permissions": [ "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>" ] } } ``` 确保上述权限配置已正确添加,否则可能在自定义基座运行时出现定位失败或地图无法加载的问题[^4]。 ### 2. 地图服务依赖问题 `uni.chooseLocation` 在 iOS 和 Android 上分别依赖高德地图和系统地图服务。若自定义基座未正确集成地图 SDK,可能导致地图页面无法加载。 - **Android**:确认是否集成了高德地图 SDK,并在 `manifest.json` 中启用了地图模块。 - **iOS**:检查是否在 `manifest.json` 的源码配置中正确引入了高德地图的 Framework,并配置了相应的 API Key。 若使用的是 HBuilder-ExampleDemo 项目进行离线打包,建议参考 DCloud 官方文档,确保地图插件已正确导入并配置。 ### 3. 自定义基座调试配置问题 自定义基座在构建过程中若未启用调试模式或未正确注入 UniApp 运行时插件,也可能导致部分 API 无法正常调用。 - 在 HBuilderX 中构建自定义基座时,确保勾选了“调试模式”。 - 检查是否启用了“uni模块”中的 `Location` 和 `Map` 模块。 - 确保真机调试时使用的基座版本与项目使用的 UniApp 版本兼容。 ### 4. 代码调用方式问题 确保调用 `uni.chooseLocation` 的方式正确,并对失败情况进行捕获和日志输出,便于排查问题。 ```javascript uni.chooseLocation({ success: (res) => { if (res.errMsg === 'chooseLocation:ok') { console.log('位置名称:' + res.name); console.log('详细地址:' + res.address); console.log('纬度:' + res.latitude); console.log('经度:' + res.longitude); } }, fail: (err) => { console.error('调用uni.chooseLocation失败:', err); } }); ``` 在真机调试过程中,建议在 `fail` 回调中打印错误信息,结合日志分析具体失败原因[^2]。 ### 5. 网络与定位服务问题 部分设备在未开启 GPS 或未连接网络的情况下,可能导致定位服务不可用。建议在调用 `uni.chooseLocation` 前检查设备的定位服务状态和网络连接情况。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值