uniapp混合oc
uniapp 混合 Objective-C 的方法
uniapp 支持通过原生插件机制与 Objective-C 代码交互,适用于需要在 iOS 平台调用原生功能或扩展能力的场景。以下是关键实现步骤:
原生插件开发
- 在 Xcode 中创建
uniplugin_OC类,继承DCUniModule。 - 使用
UNI_EXPORT_METHOD宏导出方法供 JavaScript 调用:// 示例:导出同步方法 UNI_EXPORT_METHOD(@selector(getDeviceInfo:))
- (NSString )getDeviceInfo:(NSDictionary )params {
UIDevice *device = [UIDevice currentDevice];
return [NSString stringWithFormat:@"%@-%@", device.name, device.systemVersion];
}
模块注册
- 创建
DCUniModule的子类并实现必要方法。 - 在
info.plist中添加配置:<key>dcloud_uniplugins</key> <array> <dict> <key>name</key> <string>YourOCModule</string> <key>class</key> <string>YourModuleClass</string> </dict> </array>
JavaScript 调用
在 uniapp 的 Vue 文件中通过 uni.requireNativePlugin 调用:
const ocModule = uni.requireNativePlugin('YourOCModule')
ocModule.getDeviceInfo({}, (res) => {
console.log('设备信息:', res)
})
异步通信处理 Objective-C 端可通过回调或 Promise 返回数据:
// 回调方式
UNI_EXPORT_METHOD(@selector(fetchData:callback:))
- (void)fetchData:(NSDictionary *)params callback:(UniModuleKeepAliveCallback)callback {
if (callback) {
callback(@{@"data": @"value"}, NO);
}
}
// Promise 方式
UNI_EXPORT_METHOD_SYNC(@selector(asyncTask:))
- (void)asyncTask:(NSDictionary *)params resolver:(UniModulePromiseResolveBlock)resolve rejecter:(UniModulePromiseRejectBlock)reject {
if (success) {
resolve(@"成功");
} else {
reject(@"0", @"失败", nil);
}
}
数据类型映射
- NSString ↔ String
- NSNumber ↔ Number
- NSArray ↔ Array
- NSDictionary ↔ Object
- nil ↔ null
调试技巧
- 使用
NSLog输出日志到 Xcode 控制台。 - 通过 Safari 开发者工具调试 WebView 部分。
- 真机调试时需开启开发者模式。
常见问题解决方案
内存管理 Objective-C 对象需遵循 ARC 规则,避免循环引用。JavaScript 与原生通信时,大对象建议分次传输。
线程安全 UI 操作必须在主线程执行:
dispatch_async(dispatch_get_main_queue(), ^{
// 更新UI代码
});
版本兼容
检查 DCUniModule 的 API 可用性:
if ([self.methodSelectors containsObject:@selector(yourMethod)]) {
// 执行方法
}
性能优化
高频调用的方法建议使用同步接口(UNI_EXPORT_METHOD_SYNC),减少异步通信开销。







