# LenztechBusinessSDK **Repository Path**: ppz_bj/LenztechBusinessSDK ## Basic Information - **Project Name**: LenztechBusinessSDK - **Description**: 企业端拼接和普通拍照sdk - **Primary Language**: Objective-C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-08-12 - **Last Updated**: 2022-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LenzBusinessSDK ## 产品简介 朗镜通拍照iOS SDK 是一套基于iOS 10.0以上版本(建议11.0以上)设备的应用程序接口。您可以使用该套SDK开发适用于iOS系统移动设备的拍照,上传图片的执行门店类应用。通过调用朗镜通拍照接口,您可以调用普通拍照,拼接拍照和上传图片的功能。 ## Example 请运行demo.xcodeproj ## 版本更新 请参考 LenzBusinessSDK.framework/Headers/LenzBusinessSDK.h 文件 ## 特别说明 本framework中用到的第三方: AFNetworking(4.0.1) 必选安装 Masonry 必选安装 MBProgressHUD 必选安装 MJExtension 必选安装 AliyunOSSiOS 必选安装 CTMediator 必选安装 lottie-ios(2.5.3) 可选安装 用到的系统库:AdSupport.framework ,WebKit.framework,CoreGraphics.framework,Accelerate.framework ## 集成SDK方法 注意:1) 因为库里有c++,所以集成后请随意改一个文件后缀为.mm 例如: AppDelegate.m -> AppDelegate.mm 2) 集成翻拍功能后,运行报错:dyld: Symbol not found: __ZTVN6tflite17MutableOpResolvere.... Reference from .../LenzTensorFlow 类似的错误,可能是因为工程项目老旧swift版本问题导致,build settings搜索 swift 修改swift 版本为4.0以上应该可以解决. 两种方式选一即可: 1.手动集成 1)需要自行集成‘特别说明’中的三方库 2)拖入 opencv2.framework(在sdk目录找到),LenzBusinessSDK.framework, Resources文件夹 3)依次添加framework或lib:libresolv.9.tbd MediaPlayer CoreData SystemConfiguration CoreServices AssetsLibrary CoreTelephony CoreMotion Photos AVFoundation CoreMedia AudioToolBox AdSupport WebKit Accelerate AVKit 4)other linker flags 添加 -ObjC 5)framework search paths 添加 类似 $(SRCROOT)/ (能找到 opencv2 和 LenzBusinessSDK的实际目录) 注:如果需要翻拍功能,请自行加入TensorFlowLite(1.13.1)和 sdk/LenzTensorFlow.framework(动态库需要embed集成方式) //集成后在didfinishlanuch 方法加入 [LenzEngine downloadModelIfNeeded]; 2.pod 接入 ​ 1)podfile ```ruby pod 'AFNetworking','~>4.0.1' pod 'Masonry' pod 'MBProgressHUD' pod 'MJExtension' pod 'AliyunOSSiOS' pod 'CTMediator' pod 'lottie-ios','~>2.5.3' #(可以不接入该库,不接入则无对应的拍照动画,需要动画必须是当前版本) pod 'LenzBusinessSDK',:git=>'https://gitee.com/ppz_bj/LenztechBusinessSDK.git',:tag => '0.4.3.2' ``` ​ 2)不使用翻拍无需看此条 ```ruby pod 'LenzBusinessSDK/remake',:git=>'https://gitee.com/ppz_bj/LenztechBusinessSDK.git',:tag => '0.4.0.2' pod 'TensorFlowLite','~>1.13.1' //集成后在didfinishlanuch 方法加入 [LenzEngine downloadModelIfNeeded]; ``` ## 朗镜通拍照SDK文档 注:下面提到的类名和参数在最终文档之前会有所调整,但架构和基础逻辑不变 ### 1.朗镜通SDK初始化: **方法调用**: [LenzEngine registerCompanyId: @"xxxx"]; **输入参数(类型,参数名,说明):** @param NSString companyId 企业id ### 2.获取企业任务模型列表 **方法调用:** ``` void (^callback)(NSArray *,NSString *) = ^(NSArray * list,NSString * message) { }; [LenzEngine getTaskInfo:callback]; ``` **输入参数(类型,参数名,说明):** @param block callback 回调 ​ callback说明: ​ @param NSArray list 模型列表 该参数有两种状态 ​ nil, list.count >= 0,nil即为报 错,对应的message会提示错误信息 ​ @param NSString message 返回信息 ``` LenzTaskInfo 业务模型说明: @interface LenzTaskInfo @property (copy) NSString *taskId; //企业模型任务 @property (copy) NSString *taskName; //企业模型任务描述 @property (copy) NSString *questionId;//模型任务唯一问题id @property (copy) NSString *questionName;//模型任务唯一问题描述 @end ``` ### 3.引擎初始化(每次初始化即为一组新的拍摄) **方法调用:** ``` LenzTaskInfo *taskInfo; NSArray *ids; //engine需要自行持有 LenzEngine *engine = [[LenzEngine alloc]initWithTaskInfo:taskInfo businessDataIds:ids]; ``` **输入参数(类型,参数名,说明):** @param LenzTaskInfo taskInfo 已选择 匹配活动任务模型实例 @param NSArray businessDataIds 一组字符串,具体根据接入方业务定义 ### 4.普通相机调用 **方法调用:** ``` LenzEngine *engine; //(3中持有的实例) LenzNormalCameraConfig *config = [LenzNormalCameraConfig defaultConfig]; void (^eachCapture)(LTImageItem *,NSString *) = ^(LTImageItem *model,NSString *imgId){ }; UIViewController *camera = [engine cameraWithConfig:config eachCapture:eachCapture]; [vc prensentViewController:camera]; ``` **输入参数(类型,参数名,说明):** @param LenzNormalCameraConfig config 相机配置 @param block eachCapture 每次拍完照的回调 ``` @interface LenzNormalCameraConfig /** 默认为nil,即没有连拍 目前数组只支持传入 @[@(3)],3秒连拍 */ @property (nonatomic,copy) NSArray *seconds; //连拍模式 @property (nonatomic,assign) BOOL tilt; //倾斜校验 默认为NO @property (nonatomic,assign) BOOL vague; //模糊校验 默认为NO @property (nonatomic,assign) BOOL black; //黑屏拍模式 默认为NO @property (nonatomic,assign) NSUInteger maxCount; //可拍摄最大数量 默认0 即不限制 /* 使用该功能需要根据文档接入:TensorFlowLite 具体看文档,否则调用无效 */ @property (nonatomic,assign) BOOL remake; //是否校验翻拍,默认为NO /** 0 - 原图,1 - 4k,2 - 1080p,3 - 720p */ @property (nonatomic,assign) int compressionLevel; //压缩等级 0,1,2,3 默认2 @property (nonatomic,assign) CGFloat tiltValue; //倾斜校验算法阀值 默认7 @property (nonatomic,assign) CGFloat vagueValue; //模糊校验算法阀值 默认0.4 @property (nonatomic,assign) BOOL saveToAlbum; //是否存到相册 @end ``` ### 5.拼接详情及拼接相机调用 **方法调用:** ``` LenzEngine *engine; //(3中持有的实例) LenzStitchCameraConfig *config = [LenzStitchCameraConfig defaultConfig]; void (^eachCapture)(LTImageItem *,NSString *) = ^(LTImageItem *model,NSString *imgId){ }; void (^completion)(BOOL ,NSArray < LTImageItem *> *,NSArray * ) = ^(BOOL cancel,NSArray < LTImageItem *> *list,NSArray * stitchInfos){ }; UIViewController *camera = [engine stitchCameraWithConfig:config eachCapture:eachCapture completion:completion]; [vc prensentViewController:camera]; ``` **输入参数(类型,参数名,说明):** @param LenzStitchCameraConfig config 相机配置 @param block eachCapture 每次拍完照的回调 @param block completion 整体拍完的回调 list:拍照的所有照片 stitchInfos:根据组排序附带行列信息的所有照片信息 ``` @interface LenzStitchCameraConfig /** 0 - 原图,1 - 4k,2 - 1080p,3 - 720p */ @property (nonatomic,assign) int compressionLevel; //压缩等级 0,1,2,3 默认2 @property (nonatomic,assign) BOOL saveToAlbum; //是否存到相册 默认YES @property (nonatomic,assign) BOOL uploadImmediately; //拍完即传,默认NO /* @{@"icon":"xxname" //图片名称 ,@"size":[NSValue valueWithCGSize:] //按钮大小 } */ @property (copy,nonatomic) NSDictionary * navigationLeftButtonParams; //定制左边返回按钮 默认值:无图片 /* @{@"title":NSAttributedString //按钮富文本 ,@"size":[NSValue valueWithCGSize:] //按钮大小 } */ @property (copy,nonatomic) NSDictionary * navigationRightButtonParams;//定制右边返回按钮 默认值:帮助 @end ``` ### 6.图片上传 **方法调用:** ``` LenzEngine *engine; //(3中持有的实例) NSArray *images; id callback; //参考demo中CallBack 类 [engine submitAnswerAndUploadFiles:images callback:callback]; ``` **传入参数:** @param NSArray * images 图片列表 @param id callback 回调协议类,自行实现实现回调相关方法 ``` @protocol LenzUploadCallback @optional - (void)setEngine:(LenzEngine *)engine; //LenzEngine初始化时传入的参数 - (void)setBusinessDataIds:(NSArray *)businessDataIds; //LenzEngine初始化时传入的taskInfo - (void)setTaskInfo:(LenzTaskInfo *)taskInfo; @required //上传进度回调 - (void)progress:(NSUInteger)current total:(NSUInteger)total progress:(float)progress; //上传成功或者失败 /* @param data: 返回的必要数据,例如responseId @param code: 1-成功 -1-取消 -2-图片资源失败 (上传阿里云失败) -3-提交数据失败 (请求服务器失败) -4-到达最大并发数量 (执行callback前,内部会持有 LenzEngine 实例 从而控制并发,达到最大并发 会报 code = -4 ) -5-图片上传失败 -6-资源被重复上传 (队列中已经有了LenEngine 又加入一个同样的会报该错) */ - (void)completion:(BOOL)success message:(NSString *)message code:(NSInteger)code data:(NSDictionary *)data; @end ``` ## 辅助接口: ### 7.获取图片数组列表 **方法调用:** ``` /** 获取缓存的图片资源数据 和下面方法关联使用:例如通过currentPictures方法获取到图片然后增加或删除,在调用setCurrentPictures同步数据 @return LTImageItem 数组 */ - (NSArray *)currentPictures; ``` ### 8.同步图片资源数据 **方法调用:** ``` /** 同步图片资源数据 @param pictures 增删改查后的数组 */ - (void)setCurrentPictures:(NSArray *)pictures; ``` ### 9.删除当前题目答案 **方法调用:** ``` /** 删除当前题目答案 例如在上传完成后 的回调中调用该方法 */ - (void)removeCurrentAnswer; ``` ### 10.删除已经提交过的题目 **方法调用:** ``` /** 删除可以删除的缓存 已经提交成功的 */ + (void)removeAllSubmittedAnswers; ``` ## Q & A 1. pod install 完 编译报 AFNetworking相关错误,例如 undifined symbols ,记得查看对应AFNetworing版本是否正确(目前为4.0.1) 2. 常见编译错误之 苹果官方框架 未集成之:undefined symbols 1) _WKWebsiteDataStore 以及类似 请集成 webkit.framework 2) _ASIdentifierManager 以及类似 请集成 adsupport.framework 3. 首次获取权限后拍照卡顿 目前发现是iOS14的系统bug:https://developer.apple.com/forums/thread/658114 解决方法:调用相机拍照前,调用LenzEngine提供的 getCameraAndPhotoAuthority方法主动获取权限 4. submitAnswerAndUploadFiles 上传报错:-4,上传资源已达到指定数量 建议:等待LenzUploadCallback完成(completion:message:code:data)之后再调用下一次submitAnswerAndUploadFiles 解决方法:可以通过设置 LenzEngine.maxTaskConcurrentCount 为更大数解决(小于64) 5. LTImageItem.localIdentifier为nil 或者 imgId 为 nil 解决方法:LenzNormalCameraConfig.saveToAlbum 设置为YES。为NO只能获取到name 6. 需要后台上传的请自行开发 ## 开发团队 Lenztech iOS team