iOS OpenSDK
iOS OpenSDK 对接文档
iOS LCOpenSDK 是接入 Imou 云的一整套客户端框架,便于开发者在 iOS 应用中快速集成 Imou 云视频能力。本 OpenSDK 仅支持真机调试,不支持模拟器,需 Xcode 9.0 及以上。
1. 安装 OpenSDK
安装 OpenSDK 有两种方式:CocoaPods 安装,或从官网下载压缩包手动安装。
1.1 CocoaPods 安装
1.1.1 引入 CocoaPods
在 Podfile 中添加
pod 'LCOpenSDK'执行
pod install
说明:若无法导入,可能需要更新本地仓库,请执行
pod repo update。
安装成功后如下图所示:

1.1.2 路径配置
- Framework 路径:Build Setting -> Search Paths -> Framework Search Paths 添加:
$(PROJECT_DIR)/Pods/LCOpenSDK/Framework
- 头文件路径:Build Setting -> Search Paths -> Header Search Paths 添加:
$(PROJECT_DIR)/Pods/LCOpenSDK/Framework/LCOpenSDKDynamic.framework/Headers/LCOpenSDK
$(PROJECT_DIR)/Pods/LCOpenSDK/Framework/LCOpenSDKDynamic.framework/Headers/LCOpenNetSDK
- Build Settings -> Build Options -> Enable Bitcode 设为 NO
1.2 压缩包安装
从 Imou 云开放平台官网下载 iOS 版 OpenSDK 压缩包并手动导入本地。导入时注意 SDK 路径;以 Demo 为例,OpenSDK 位于工程目录下 Depend 文件夹。

1.2.1 路径配置
- Framework 路径:Build Setting -> Search Paths -> Framework Search Paths 添加:
$(PROJECT_DIR)/Depend
- 头文件路径:Build Setting -> Search Paths -> Framework Search Paths 添加:
$(PROJECT_DIR)/Depend/LCOpenSDKDynamic.framework/Headers
$(PROJECT_DIR)/Depend/LCOpenSDKDynamic.framework/Headers/LCOpenSDK
$(PROJECT_DIR)/Depend/LCOpenSDKDynamic.framework/Headers/LCOpenNetSDK
- Build Phases -> Embed Frameworks 添加:
LCOpenSDKDynamic.framework,Destinations 选择 Frameworks。
说明: $(PROJECT_DIR) 为 Demo 工程所在目录,按需添加 LCOpenSDKDemo 与 Depend 文件夹(对应 iOS_demo 与 iOS_sdk);若不存在 Build Phases -> Embed Frameworks,可点击左上角加号,选择 New Copy Files Phase 添加,再双击改名为 Embed Frameworks。
1.2.2 系统库配置
在工程 TARGETS -> Build Phases -> Link Binary With Libraries 中添加以下系统库:
CoreAudio.framework
MediaPlayer.framework
AudioToolbox.framework
VideoToolbox.framework
OpenGLES.framework
MediaAccessibility.framework
CoreVideo.framework
AVFoundation.framework
CoreMedia .framework
libz.tbd (libz.dylib)
配置完成后如下图所示:

1.3 权限配置
OpenSDK 须配置相关系统权限,主要包括:
相册:NSPhotoLibraryUsageDescription
照片存储:NSPhotoLibraryAddUsageDescription
麦克风:NSMicrophoneUsageDescription
相机:NSCameraUsageDescription
本地网络:NSLocalNetworkUsageDescription
定位:NSLocationUsageDescription
说明:设备配网还需组播权限,须在 Apple Developer Center 申请。
2. 初始化
2.1 初始化 OpenSDK
使用 OpenSDK 前须先初始化,主要依赖 LCOpenSDK_Api 类。
示例代码如下:
/** 初始化 */
LCOpenSDK_ApiParam * apiParam = [[LCOpenSDK_ApiParam alloc] init];
/** 1. 使用 HTTPS */
apiParam.procotol = PROCOTOL_TYPE_HTTPS;
/** 2. 设置 Imou 云开放平台域名 */
apiParam.addr = @"openapi-[Data Center].easy4ip.com";
/** 3. 设置端口 */
apiParam.port = 443;
/** 4. 设置开发者 accessToken */
apiParam.token = @"********";
/** 5. 初始化 OpenSDK */
LCOpenSDK_Api* m_hc = [[LCOpenSDK_Api shareMyInstance] initOpenApi:apiParam];
说明:获取 accessToken:管理员 accessToken 或 子账号 accessToken。
addr中的[Data Center]须替换为实际数据中心标识。
2.2 配置 OpenSDK 日志级别
OpenSDK 提供日志类 LCOpenSDK_Log,开发者可按需配置日志级别,默认为 LogLevelTypeFatal。
// 创建 LCOpenSDK_LogInfo 实例
LCOpenSDK_LogInfo *info = [LCOpenSDK_LogInfo new];
// 设置日志级别
info.levelType = LogLevelTypeDebug;
[[LCOpenSDK_Log shareInstance] setLogInfo:info];
LogLevelType:
LogLevelTypeFatal = 1,// 严重错误
LogLevelTypeError,// 错误
LogLevelTypeWarning,// 警告
LogLevelTypeInfo,// 信息
LogLevelTypeDebug// 调试
说明:可调整 SDK 日志级别以便复现问题并抓取日志,便于后续定位与分析。
3. 添加设备
无线配网是 OpenSDK 的基础能力之一,可与设备搜索、设备初始化配合使用。当前 OpenSDK 支持 SmartConfig 与 Soft AP 配网;不同设备支持的配网方式不同,须根据设备型号确定。
3.1 SmartConfig 配网添加
扫描设备底部标签或手动输入,获取设备 S/N 等信息。
调用 unBindDeviceInfo(或能力等价接口),查询设备支持的配网模式与绑定状态。
判断设备是否已绑定。
判断当前设备是否支持 SmartConfig。
启动无线配网,在局域网内搜索设备初始化信息。
搜到设备后停止配网并停止搜索。
初始化设备。
调用 deviceOnline 或等价接口检查设备是否在线。
确认设备在线后,调用 bindDevice 完成绑定。
相关代码实现如下:
/** 1. 初始化 LCOpenSDK_ConfigWIfi 对象 */
LCOpenSDK_ConfigWIfi *m_configWifi = [[LCOpenSDK_ConfigWIfi alloc] init];
/**
2. 开始配网
devId:设备序列号
ssid:Wi-Fi 名称
password:Wi-Fi 密码
security:安全码(SC 码设备必填,非 SC 设备传 @"")
*/
NSInteger iRet = [m_configWifi configWifiStart:@"********"
ssid:@"********"
password:@"********"
secure:@"********"
voiceFreq:11000];
if (iRet <0) {
NSLog(@"smartconfig failed\n");
}
__block NSString *theMac = nil; /** 设备 MAC */
__block NSString *theIp = nil; /** 设备 IP */
__block int thePort = 0; /** 设备端口 */
__block int theInitStatus = 0; /** 初始化状态:0 无需初始化;1 需初始化且未初始化;2 需初始化且已初始化 */
/** 3. 初始化设备初始化对象 */
LCOpenSDK_DeviceInit *deviceInit = [[LCOpenSDK_DeviceInit alloc] init];
/** 4. 搜索设备初始化信息 */
[deviceInit searchDeviceInitInfo:@"********" timeOut:60000*2 success:^(LCOPENSDK_DEVICE_INIT_INFO info) {
theMac = [NSString stringWithUTF8String:info.mac];
theIp = [NSString stringWithUTF8String:info.ip];
thePort = info.port;
theInitStatus = info.status;
}];
if (!theMac || !theIp) {
NSLog(@"Search device init info failed!\n");
}
/** 5. 停止配网 */
[m_configWifi configWifiStop];
/** 6. 初始化状态为 1 且非 SC 码设备时执行初始化,初始化密码可自定义 */
int ret = [deviceInit initDevice:theMac password:@"********" ip:theIp];
if (-2 == ret) {
NSLog(@"Init device failed!\n");
}
3.2 SoftAP 配网添加
扫描设备底部标签或手动输入,获取设备 S/N 等信息。
调用 unBindDeviceInfo(或能力等价接口),查询设备支持的配网模式与绑定状态。
判断设备是否已绑定。
判断当前设备是否支持 SoftAP。
连接设备热点。
在局域网搜索设备初始化信息:若搜到设备信息,启动配网流程。
启动 SoftAP 配网。
调用 deviceOnline 检查设备是否在线。
确认在线后,调用 bindDevice 完成绑定。
代码实现如下:
/** 1. 初始化设备搜索对象 */
LCOpenSDK_SearchDevices *m_deviceInit = [[LCOpenSDK_SearchDevices alloc] init];
/** 2. 搜索设备初始化信息 */
__block int m_initDevStatus = 0;
[m_deviceInit startSearchDevices:@"********" timeOut:10*1000 success:^(LCOPENSDK_DEVICE_INIT_INFO info) {
m_initDevStatus = info.status;
}];
/** 3. 初始化 SoftAP 配网对象 */
LCOpenSDK_SoftAPConfig *m_softAP = [[LCOpenSDK_SoftAPConfig alloc] init];
/** 4. m_initDevStatus 为 0 或为 SC 码设备时可直接 SoftAP 配网,设备密码传 @"admin";为 1 时使用自定义密码;SC 码设备须带安全码,isSC 设为 YES */
NSInteger softAPResult = [m_softAP
startSoftAPConfig:@"********" wifiPwd:@"********" wifiEncry:0 netcardName:@"********" deviceIp:@"********" devicePwd:@"********" isSC:True timeout:0 handler:^(NSInteger result) {
handler(result);
}];
if (softAPResult <0) {
NSLog(@"SoftAP failed!\n");
}
4. 实时预览
实时预览主要步骤:
通过 Imou 云开放平台 设备查询 接口获取设备信息。
调用 OpenSDK 接口初始化播放窗口与监听。
示例代码:
/** 1. 初始化播放窗口(位置、大小、索引) */
LCOpenSDK_PlayRealWindow *m_play = [[LCOpenSDK_PlayRealWindow alloc] initPlayWindow:CGRectMake(0, 0, 400, 300) Index:0];
/** 2. 设置播放窗口背景色 */
[m_play setSurfaceBGColor:[UIColor blackColor]];
/** 3. 将播放窗口添加到父视图 */
[self.view addSubview:[m_play getWindowView]];
/** 4. 设置监听对象,接收播放结果回调 */
[m_play setPlayRealListener:(id<LCOpenSDK_PlayRealListener>)listener];
- 设置播放参数并启动播放。
示例代码:
/** 1. 初始化实时预览参数对象 */
LCOpenSDK_ParamReal *paramReal = [[LCOpenSDK_ParamReal alloc] init];
/** 2. 设置 accessToken(由 AppId、AppSecret 向 Imou 云开放平台换取) */
paramReal.accessToken = @"********";
/** 3. 设置设备序列号 */
paramReal.deviceID = @"********";
/** 4. 设置通道号:单通道设备填 0,NVR 等多通道设备填具体通道号 */
paramReal.channel = 0;
/** 5. 设置码流类型(主码流/子码流) */
paramReal.defiMode = DEFINITION_MODE_HG;
/** 6. 设置密钥:自定义密钥传具体值,否则可用设备序列号 */
paramReal.psk = @"********";
/** 7. 设置 playToken(可选,传入可提升出流速度) */
paramReal.playToken = @"********";
/** 是否开启拉流优化(建议传 YES,可提升出流速度) */
paramReal.isOpt = YES;
/** 8. 开始播放 */
[m_play playRtspReal:paramReal];
- 实现监听回调。
伪代码:下列回调方法体已省略,请按业务实现。
示例代码:
/** 1. 播放结果回调,可按错误码分别处理 */
-(void)onPlayerResult:(NSString*)code Type:(NSInteger)type Index:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
/** 2. 播放开始回调 */
-(void)onPlayBegan:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
5. 录像回放
录像回放用于播放设备 SD 卡/硬盘或云存储中的录像。设备录像与云录像使用不同 OpenSDK 接口,使用时请注意区分。
设备本地录像回放提供按文件名与按时间两种接口,可按场景选择,建议优先使用按文件名回放。
主要步骤:
示例代码:
/** 1. 初始化播放窗口(位置、大小、索引) */
LCOpenSDK_PlayWindow *m_play = [[LCOpenSDK_PlayWindow alloc] initPlayWindow:CGRectMake(0, 0, 400, 300) Index:0];
/** 2. 设置播放窗口背景色 */
[m_play setSurfaceBGColor:[UIColor blackColor]];
/** 3. 将播放窗口添加到父视图 */
[self.view addSubview:[m_play getWindowView]];
/** 4. 设置监听对象,接收播放结果回调 */
[m_play setWindowListener:(id<LCOpenSDK_EventListener>)self];
- 设置播放参数并启动播放。
示例代码:
- 按文件名播放设备录像:
/** 1. 初始化按文件名回放参数对象 */
LCOpenSDK_ParamDeviceRecordFileName * paramDeviceRecord = [[LCOpenSDK_ParamDeviceRecordFileName alloc] init];
/** 2. 设置 accessToken(由 AppId、AppSecret 向 Imou 云开放平台换取) */
paramDeviceRecord.accessToken = @"********";
/** 3. 设置设备序列号 */
paramDeviceRecord.deviceID = @"********";
/** 4. 设置通道号:单通道设备填 0,NVR 等多通道设备填具体通道号 */
paramDeviceRecord.channel = 0;
/** 5. 设置密钥:自定义密钥传具体值,否则可用设备序列号 */
paramDeviceRecord.psk = @"********";
/** 6. 设置录像文件名(即 recordId) */
paramDeviceRecord.fileName = @"********";
/** 7. 设置回放偏移时间(秒),从文件开头播放填 0 */
paramDeviceRecord.offsetTime = 0 ;
/** 8. 设置 productId */
paramDeviceRecord.productId= @"********";
/** 9. 按文件回放时的拉流类型 */
paramDeviceRecord.playMode = @"********";
/** 10. 是否回放(建议传 YES) */
paramDeviceRecord.isPlayBack = YES;
/** 是否开启拉流优化(建议传 YES) */
paramDeviceRecord.isOpt = YES;
/** 12. 开始播放 */
[m_play playRecordStream:paramDeviceRecord];
- 按时间播放设备录像:
/** 1. 初始化按时间回放参数对象 */
LCOpenSDK_ParamDeviceRecordUTCTime *paramDeviceRecordUTCTime = [[LCOpenSDK_ParamDeviceRecordUTCTime alloc] init];
/** 2. 设置 accessToken(由 AppId、AppSecret 向 Imou 云开放平台换取) */
paramDeviceRecordUTCTime.accessToken = @"********";
/** 3. 设置设备序列号 */
paramDeviceRecordUTCTime.deviceID = @"********";
/** 4. 设置通道号:单通道设备填 0,NVR 等多通道设备填具体通道号 */
paramDeviceRecordUTCTime.channel = 0;
/** 5. 设置码流类型(主码流/子码流) */
paramDeviceRecordUTCTime.defiMode = DEFINITION_MODE_HG;
/** 6. 设置密钥:自定义密钥传具体值,否则可用设备序列号 */
paramDeviceRecordUTCTime.psk = @"********";
/** 7. 录像开始时间(不可为 0) */
paramDeviceRecordUTCTime.beginTime = 0;
/** 8. 录像结束时间(不可为 0) */
paramDeviceRecordUTCTime.endTime = 0;
/** 是否开启拉流优化(建议传 YES) */
paramDeviceRecordUTCTime.isOpt = YES;
/** 10. 是否回放(建议传 YES) */
paramDeviceRecordUTCTime.isPlayBack = YES;
/** 11. 按时间回放时的拉流类型 */
paramDeviceRecordUTCTime.PlayMode = @"********";
/** 12. 开始播放 */
[m_play playRecordStream: paramDeviceRecordUTCTime];
- 云录像回放:
/** 1. 初始化云录像回放参数对象 */
LCOpenSDK_ParamCloudRecord *paramCloudRecord = [[LCOpenSDK_ParamCloudRecord alloc] init];
/** 2. 设置 accessToken(由 AppId、AppSecret 向 Imou 云开放平台换取) */
paramCloudRecord.accessToken = @"********";
/** 3. 设置设备序列号 */
paramCloudRecord.deviceID = @"********";
/** 4. 设置通道号:单通道设备填 0,NVR 等多通道设备填具体通道号 */
paramCloudRecord.channel = 0;
/** 5. 设置密钥:自定义密钥传具体值,否则可用设备序列号 */
paramCloudRecord.psk = @"********";
/** 6. 设置录像区域 ID(recordRegionID) */
paramCloudRecord.recordRegionID = @"********";
/** 7. 设置回放偏移时间(秒),从文件开头播放填 0 */
paramCloudRecord.offsetTime = 0;
/** 8. 设置录像类型,填 RECORD_TYPE_ALL */
paramCloudRecord.recordType = RECORD_TYPE_ALL;
/** 9. 设置回放超时时间(秒) */
paramCloudRecord.timeOut = 60;
/** 是否开启拉流优化(建议传 YES) */
paramCloudRecord.isOpt = @"********";
/** 11. TCM 校验密码后是否重新播放 */
paramCloudRecord.isReplay = @"********";
/** 12. 设置 productId */
paramCloudRecord.productID = @"********";
/** 13. 设置拉流模式 */
paramCloudRecord.streamType = @"********";
/** 14. 设置录像区域 ID */
paramCloudRecord.recordregionID = @"********";
/** 15. 开始播放 */
[m_play playRecordStream:paramCloudRecord]
- 实现监听回调。
示例代码:
/** 1. 播放结果回调,可按错误码分别处理 */
-(void)onPlayerResult:(NSString*)code Type:(NSInteger)type Index:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
/** 2. 播放开始回调 */
-(void)onPlayBegan:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
/** 3. 播放结束回调 */
-(void)onPlayFinished:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
/** 4. 文件起止时间回调 */
-(void)onFileTime:(long)beginTime EndTime:(long)endTime Index:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
/** 5. 当前播放进度回调 */
-(void)onPlayerTime:(long)time Index:(NSInteger)index {
// 伪代码:在此实现回调逻辑
}
6. 语音对讲
语音对讲是设备与客户端之间的语音通话能力,须在实时预览过程中使用。
开发步骤:
先实现实时预览。
调用 OpenSDK 初始化对讲对象与对讲参数,启动对讲。
示例代码:
/** 1. 初始化语音对讲对象 */
LCOpenSDK_AudioTalk *m_talker = [[LCOpenSDK_AudioTalk alloc] init];
/** 2. 设置监听对象 */
[m_talker setListener:(id<LCOpenSDK_TalkerListener>)self];
/** 3. 初始化对讲参数对象 */
LCOpenSDK_ParamTalk *paramTalk = [[LCOpenSDK_ParamTalk alloc] init];
/** 4. 设置 accessToken(由 AppId、AppSecret 向 Imou 云开放平台换取) */
paramTalk.accessToken = @"********";
/** 5. 设置设备序列号 */
paramTalk.deviceID = @"********";
/** 6. 设置通道号:-1 为设备对讲,通道对讲填具体通道号 */
paramTalk.channel = -1;
/** 7. 设置密钥:自定义密钥传具体值,否则可用设备序列号 */
paramTalk.psk = @"********";
/** 8. 设置 playToken(可选,传入可提升出流速度) */
paramTalk.playToken = @"********";
/** 是否开启拉流优化(建议传 YES) */
paramTalk.isOpt = YES;
/** 10. 开始对讲 */
[m_talker playTalk:paramTalk];
- 实现对讲结果回调。
示例代码:
/** 对讲结果回调 */
-(void) onTalkResult:(NSString *) error TYPE:(NSInteger) type {
// 伪代码:在此实现回调逻辑
}
7. 录像下载
OpenSDK 提供设备录像与云录像下载接口。当前仅支持 MP4 格式文件下载,暂不支持其他格式。
开发步骤:
示例代码:
/** 1. 拼装本地保存路径 */
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString* libraryDirectory = [paths objectAtIndex:0];
NSString* myDirectory = [libraryDirectory stringByAppendingPathComponent:@"lechange"];
NSString* downloadDirectory = [myDirectory stringByAppendingPathComponent:@"download"];
/** 勿与其它下载任务使用相同文件名,否则会覆盖 */
NSString* infoPath = [downloadDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"record_download"]];
NSString* m_downloadPath = [infoPath stringByAppendingString:@".mp4"];
/** 2. 按路径创建目录 */
NSFileManager* fileManage = [NSFileManager defaultManager];
NSError* pErr;
BOOL isDir;
if (NO == [fileManage fileExistsAtPath:myDirectory isDirectory:&isDir]) {
[fileManage createDirectoryAtPath:myDirectory withIntermediateDirectories:YES attributes:nil error:&pErr];
}
if (NO == [fileManage fileExistsAtPath:downloadDirectory isDirectory:&isDir]) {
[fileManage createDirectoryAtPath:downloadDirectory withIntermediateDirectories:YES attributes:nil error:&pErr];
}
/** 3. 创建下载对象 */
LCOpenSDK_Download* m_download = [LCOpenSDK_Download shareMyInstance];
/** 4. 设置下载监听 */
[m_download setListener:(id<LCOpenSDK_DownloadListener>)self];
/** 5. 开始云录像下载 */
[m_download startDownload:0 filepath:m_downloadPath token:@"********" devID:@"********" channelID:0 psk:@"********" recordRegionId:@"********" Type:1000 Timeout:10];
/** 6. 开始设备录像下载(speed 为倍速,如 16 倍速;fileID 为 recordId) */
[m_download startDownload:0 filepath:m_downloadPath token:@"********" devID:@"********" decryptKey:@"********" fileID:@"********" speed:16];
- 实现下载回调。
示例代码:
/** 1. 下载数据回调 */
-(void) onDownloadReceiveData:(NSInteger)index datalen:(NSInteger)datalen {
// 伪代码:在此实现回调逻辑
}
/** 2. 下载状态回调 */
-(void) onDownloadState:(NSInteger)index code:(NSString *)code type:(NSInteger)type {
// 伪代码:在此实现回调逻辑
}
8. 数据解密
目前设备告警缩略图与录像封面图默认加密存储,须解密后方可正常显示:使用 LCOpenSDK_Utils 解密图片数据。
示例代码:
NSData* dataOut = [[NSData alloc] init];
NSInteger iret = [[LCOpenSDK_Utils new] decryptPic:picData deviceID:deviceId key:key bufOut:&dataOut];
NSLog(@"decrypt iret[%ld]", (long)iret);
if (0 == iret) {
UIImage* img = [UIImage imageWithData:[NSData dataWithBytes:[dataOut bytes] length:[dataOut length]]];
[cache storeImage:img forKey:key_temp toDisk:YES completion:^{
}];
[self setImage:img];
}
