萤石云 iOSSDK,移植跨平台相关工程
JLChen
2021-03-02 d56c8422138cd82d2ea9bed8e2f4b0bc7766be4b
2021-03-02 1.最近新云端接口
4个文件已添加
18个文件已修改
664 ■■■■■ 已修改文件
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/ResponseData.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/ResponseData.m 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/DeviceListCell.m 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZDeviceResultViewController.m 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/zh-Hans.lproj/Localizable.strings 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK.IOS/EZSDK.IOS/Properties/AssemblyInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK.xcodeproj/project.pbxproj 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/Global/EZHttpUtil.h 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/Global/EZHttpUtil.m 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/Global/GlobalKit.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/Global/GlobalKit.m 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/Global/ResponseData.h 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/Global/ResponseData.m 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/TableViewCells/DeviceListCell.m 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/UIViewControllers/EZDeviceResultViewController.m 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/UIViewControllers/EZDeviceTableViewController.m 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZ/UIViewControllers/EZSettingViewController.m 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZSDK.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EZSDK/EZSDK/EZSDK.m 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h
@@ -11,7 +11,6 @@
NS_ASSUME_NONNULL_BEGIN
/// 河东接口网络请求工具类
@interface EZHttpUtil : NSObject
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/ResponseData.h
@@ -23,6 +23,7 @@
- (id)initWithDictionary:(NSDictionary *)dic;
/**是否成功*/
- (BOOL)success;
@end
NS_ASSUME_NONNULL_END
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/ResponseData.m
@@ -10,16 +10,17 @@
@implementation ResponseData
/// Description
- (BOOL)success
{
    //河东code为0 ,萤石为200 代表成功
    return [self.code isEqual: @"0"] || [self.code isEqual: @"200"]  ;
/// init
-(id)init {
     if (self = [super init])  {
         self.code = @"-1";
         self.message = @"请求服务器失败,请稍后再试!";
     }
     return self;
}
/// 解析返回字典参数
/// 初始化并解析返回字典参数
/// @param dic 返回参数
- (id)initWithDictionary:(NSDictionary *)dic
{
@@ -35,15 +36,16 @@
                self.data = mData;
            } else {
                //没有返回数据
                self.message = @"网络错误";
                self.message = @"请求服务器失败,请稍后再试!";
                self.data = nil;
                self.code = @"-2";
                self.code = @"-1";
            }
        }
            //接收到异常
        @catch (NSException *exception) {
            self.message = @"数据解析错误";
            self.data = dic;
            self.code = @"-1";
            self.code = @"-2";
        }
        @finally {
            
@@ -51,4 +53,12 @@
    }
    return self;
}
/// Description
- (BOOL)success
{
    //河东code为0 ,萤石为200 代表成功
    return [self.code isEqual: @"0"] || [self.code isEqual: @"200"]  ;
}
@end
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/DeviceListCell.m
@@ -35,6 +35,7 @@
    }
    
    self.nameLabel.text = [NSString stringWithFormat:@"%@",deviceInfo.deviceName];
//    self.cameraImageView.contentMode =  UIViewContentModeScaleAspectFit;
    [self.cameraImageView sd_setImageWithURL:[NSURL URLWithString:deviceInfo.deviceCover] placeholderImage:[UIImage imageNamed:@"device_default"]];
//    [EZOPENSDK capturePicture:cameraInfo.deviceSerial channelNo:cameraInfo.channelNo completion:^(NSString *url, NSError *error) {
//        if(!error){
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZDeviceResultViewController.m
@@ -178,7 +178,7 @@
                            if (error.code == EZ_HTTPS_DEVICE_ADDED_MYSELF || error.code == EZ_HTTPS_DEVICE_ONLINE_ADDED)
                            {
                                self.statusLabel.textColor = [UIColor blackColor];
                                self.statusLabel.text = NSLocalizedString(@"ad_already_added",@"您已添加过此设备");
                                self.statusLabel.text = NSLocalizedString(@"ad_already_added",@"此设备已被添加");
                                self.statusLabel.hidden = NO;
                            }
                            else if (error.code == EZ_HTTPS_DEVICE_ONLINE_IS_ADDED || error.code == EZ_HTTPS_DEVICE_OFFLINE_IS_ADDED)
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/zh-Hans.lproj/Localizable.strings
@@ -31,7 +31,7 @@
"ad_restart_tip"="长按设备上的reset键10秒后松开,并等待大约30秒直到设备启动完成";
"ad_restart_done"="我已重启好";
"ad_get_device_info_msg"="正在查询设备信息,请稍后...";
"ad_already_added"="您已添加过此设备";
"ad_already_added"="此设备已被添加";
"ad_added_by_others"="此设备已被别人添加";
"get_info_fail"="查询失败,网络不给力";
"ad_input_manual"="手动输入";
EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs
@@ -20,6 +20,11 @@
        [Export("setEZAccessToken:")]
        void SetEZAccessToken(string accessToken);
        // +(void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *)refreshToken;
        [Static]
        [Export("setHDlAccessToken:refreshToken:")]
        void SetHDlAccessToken(string accessToken, string refreshToken);
        // +(void)go2EZvizMonitor;
        [Static]
        [Export("go2EZvizMonitor")]
EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a
Binary files differ
EZSDK.IOS/EZSDK.IOS/Properties/AssemblyInfo.cs
@@ -25,7 +25,7 @@
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion("1.0.6")]
[assembly: AssemblyVersion("1.0.7")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
EZSDK/EZSDK.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
    objects = {
/* Begin PBXBuildFile section */
        B965BE0325EE0B0D00E58AFB /* EZHttpUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B965BDFF25EE0B0D00E58AFB /* EZHttpUtil.m */; };
        B965BE0425EE0B0D00E58AFB /* ResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = B965BE0025EE0B0D00E58AFB /* ResponseData.m */; };
        B9BC92FF25C0FC3500C024FE /* EZSDK.m in Sources */ = {isa = PBXBuildFile; fileRef = B9BC92FE25C0FC3500C024FE /* EZSDK.m */; };
        B9BC930025C0FC3500C024FE /* EZSDK.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = B9BC92FD25C0FC3500C024FE /* EZSDK.h */; };
        B9BC956225C0FC6C00C024FE /* DeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = B9BC94D125C0FC6B00C024FE /* DeviceInfo.m */; };
@@ -159,6 +161,10 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
        B965BDFF25EE0B0D00E58AFB /* EZHttpUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZHttpUtil.m; sourceTree = "<group>"; };
        B965BE0025EE0B0D00E58AFB /* ResponseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ResponseData.m; sourceTree = "<group>"; };
        B965BE0125EE0B0D00E58AFB /* EZHttpUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZHttpUtil.h; sourceTree = "<group>"; };
        B965BE0225EE0B0D00E58AFB /* ResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResponseData.h; sourceTree = "<group>"; };
        B9BC92FA25C0FC3500C024FE /* libEZSDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libEZSDK.a; sourceTree = BUILT_PRODUCTS_DIR; };
        B9BC92FD25C0FC3500C024FE /* EZSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZSDK.h; sourceTree = "<group>"; };
        B9BC92FE25C0FC3500C024FE /* EZSDK.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZSDK.m; sourceTree = "<group>"; };
@@ -1008,10 +1014,10 @@
            isa = PBXGroup;
            children = (
                B9BC991A25C0FFBA00C024FE /* CameraListCell.h */,
                B9BC991B25C0FFBA00C024FE /* DeviceListCell.h */,
                B9BC991C25C0FFBA00C024FE /* MessageListCell.h */,
                B9BC991D25C0FFBA00C024FE /* DeviceListCell.m */,
                B9BC991E25C0FFBA00C024FE /* CameraListCell.m */,
                B9BC991B25C0FFBA00C024FE /* DeviceListCell.h */,
                B9BC991D25C0FFBA00C024FE /* DeviceListCell.m */,
                B9BC991C25C0FFBA00C024FE /* MessageListCell.h */,
                B9BC991F25C0FFBA00C024FE /* MessageListCell.m */,
            );
            path = TableViewCells;
@@ -1115,6 +1121,10 @@
            children = (
                B9BC997125C0FFBB00C024FE /* GlobalKit.h */,
                B9BC997025C0FFBB00C024FE /* GlobalKit.m */,
                B965BE0125EE0B0D00E58AFB /* EZHttpUtil.h */,
                B965BDFF25EE0B0D00E58AFB /* EZHttpUtil.m */,
                B965BE0225EE0B0D00E58AFB /* ResponseData.h */,
                B965BE0025EE0B0D00E58AFB /* ResponseData.m */,
            );
            path = Global;
            sourceTree = "<group>";
@@ -1389,6 +1399,7 @@
                B9BC99F325C0FFBD00C024FE /* UIButton+WebCache.m in Sources */,
                B9BC99B925C0FFBD00C024FE /* MWTapDetectingImageView.m in Sources */,
                B9BC99DE25C0FFBD00C024FE /* AFHTTPRequestOperationManager.m in Sources */,
                B965BE0425EE0B0D00E58AFB /* ResponseData.m in Sources */,
                B9BC999F25C0FFBD00C024FE /* DALabeledCircularProgressView.m in Sources */,
                B9BC99B825C0FFBD00C024FE /* UIImage+MWPhotoBrowser.m in Sources */,
                B9BC99E025C0FFBD00C024FE /* AFHTTPRequestOperation.m in Sources */,
@@ -1418,6 +1429,7 @@
                B9BC9A0E25C0FFBD00C024FE /* EZLocalDeviceListViewController.m in Sources */,
                B9BC9A1125C0FFBD00C024FE /* EZDeviceRestartTipsViewController.m in Sources */,
                B9BC99CA25C0FFBD00C024FE /* UIImageView+DDKit.m in Sources */,
                B965BE0325EE0B0D00E58AFB /* EZHttpUtil.m in Sources */,
                B9BC9A2825C0FFBD00C024FE /* EZPlaybackViewController.m in Sources */,
                B9BC9A1C25C0FFBD00C024FE /* EZSupportViewController.m in Sources */,
                B9BC92FF25C0FC3500C024FE /* EZSDK.m in Sources */,
EZSDK/EZSDK/EZ/Global/EZHttpUtil.h
New file
@@ -0,0 +1,53 @@
//
//  EZHttpUtil.h
//  EZOpenSDKDemo
//
//  Created by 陈嘉乐 on 2021/2/26.
//  Copyright © 2021 hikvision. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ResponseData.h"
NS_ASSUME_NONNULL_BEGIN
/// 河东接口网络请求工具类
@interface EZHttpUtil : NSObject
#pragma mark -接口
/**
 *  @since 河东获取子账号token的接口
 *
 *  @param block 回调block
 */
+ (void)getChildToken:(void (^)(NSString *accessToken))block;
/**
 *  @since 河东添加设备的接口
 *  根据设备序列号和设备验证码添加设备接口
 *
 *  @param deviceSerial 设备序列号
 *  @param verifyCode   设备验证码
 *  @param completion   回调block,error为空时表示添加成功
 *
 *  @return operation
 */
+ (void)addDeviceByHDL:(NSString *)deviceSerial
                verifyCode:(NSString *)verifyCode
                completion:(void (^)(ResponseData *responseData))completion;
/**
 *  @since 河东删除设备的接口
 *  根据设备序列号删除设备接口
 *
 *  @param deviceSerial 设备序列号
 *  @param completion   回调block,error为空时表示添加成功
 *
 *  @return operation
 */
+ (void)deleteDeviceByHDL:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion;
@end
NS_ASSUME_NONNULL_END
EZSDK/EZSDK/EZ/Global/EZHttpUtil.m
New file
@@ -0,0 +1,297 @@
//
//  EZHttpUtil.m
//  EZOpenSDKDemo
//
//  Created by 陈嘉乐 on 2021/2/26.
//  Copyright © 2021 hikvision. All rights reserved.
//
#import "EZHttpUtil.h"
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#import "AFNetworking.h"
#pragma mark API
#define API_POST_EZ_AddDevice @"/home-wisdom/platform/childAddDevice"
#define API_POST_EZ_GetChildToken @"/home-wisdom/platform/childToken"
#define API_POST_EZ_ChildDelDevice @"/home-wisdom/platform/childDelDevice"
#define API_POST_EZ_RefreshToken @"/smart-footstone/member/oauth/login"
#pragma mark APP_KEY
#define APP_KEY @"HDL-HOME-APP-TEST"
#define SECRET_KEY @"WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss"
@implementation EZHttpUtil
#pragma mark -接口请求部分
/**
 *  @since 河东获取子账号token的接口
 *
 *  @param block 回调block
 */
+ (void)getChildToken:(void (^)(NSString *accessToken))block{
    //2.设置请求参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters = [self GetSignRequestDictionary:parameters];
    [self requestHttpsPost:API_POST_EZ_GetChildToken parameters:parameters completion:^(ResponseData *responseData) {
        if (block) {
            NSString * token = @"";
            if(responseData.success){
                token = responseData.data[@"accessToken"];
            }
            block(token);
        }
    }];
//    return task;
}
/**
 *  @since 河东添加设备的接口
 *  根据设备序列号和设备验证码添加设备接口
 *
 *  @param deviceSerial 设备序列号
 *  @param verifyCode   设备验证码
 *  @param completion   回调block,error为空时表示添加成功
 *
 *  @return operation
 */
+ (void)addDeviceByHDL:(NSString *)deviceSerial
                              verifyCode:(NSString *)verifyCode
                              completion:(void (^)(ResponseData *responseData))completion{
    //2.设置请求参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    [parameters setValue:deviceSerial forKey:@"deviceSerial"];
    [parameters setValue:verifyCode forKey:@"validateCode"];
    parameters = [self GetSignRequestDictionary:parameters];
   [self requestHttpsPost:API_POST_EZ_AddDevice parameters:parameters completion:^(ResponseData *responseData) {
        if (completion) {
            completion (responseData);
        }
    }];
//    return task;
}
/**
 *  @since 河东删除设备的接口
 *  根据设备序列号删除设备接口
 *
 *  @param deviceSerial 设备序列号
 *  @param completion   回调block,error为空时表示添加成功
 *
 *  @return operation
 */
+ (void)deleteDeviceByHDL:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion{
    //1.设置请求参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    [parameters setValue:deviceSerial forKey:@"deviceSerial"];
    parameters = [self GetSignRequestDictionary:parameters];
    [self requestHttpsPost:API_POST_EZ_ChildDelDevice parameters:parameters completion:^(ResponseData *responseData) {
        if (completion) {
            completion (responseData);
        }
    }];
//    return task;
}
/// 刷新token
/// @param block 结果
+ (void)refreshHDLToken:(void (^)(BOOL isSuccess))block{
    //1.设置请求参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    [parameters setValue:GlobalKit.shareKit.hdlRefreshToken forKey:@"refreshToken"];
    [parameters setValue:@"refresh_token" forKey:@"grantType"];
    [parameters setValue:@"APP" forKey:@"platform"];
    parameters = [self GetSignRequestDictionary:parameters];
    [self requestHttpsBase:API_POST_EZ_RefreshToken parameters:parameters completion:^(ResponseData *responseData) {
        if (block) {
            if (responseData) {
                if(responseData.success){
                    [EZSDK setHDlAccessToken:
                     [NSString stringWithFormat:@"%@%@",responseData.data[@"headerPrefix"], responseData.data[@"accessToken"]]
                                refreshToken:responseData.data[@"refreshToken"]];
                    block(YES);
                    return;
                }
            }
            block(NO);
        }
    }];
//    return task;
}
#pragma mark HttpUtil
/// 通用  请求服务器方法
/// @param apiPath 接口地址
/// @param parameters 请求参数
/// @param completion 请求响应参数
+ (void)requestHttpsPost:(NSString *)apiPath
                                parameters:(NSMutableDictionary *)parameters
              completion:(void (^)(ResponseData *responseData))completion{
    [self requestHttpsBase:apiPath parameters:parameters completion:^(ResponseData *responseData) {
        if (completion) {
            if([responseData.code isEqual:@"10001"]){
                //刷新token
                [self refreshHDLToken:^(BOOL isSuccess) {
                    if (isSuccess) {
                        //刷新token成功,重新请求一次
                        [self requestHttpsBase:apiPath parameters:parameters completion:^(ResponseData *responseData) {
                            completion(responseData);
                            return;
                        }];
                    }
                }];
            }
            completion(responseData);
        }
    }];
}
/// 通用  请求服务器方法
/// @param apiPath 接口地址
/// @param parameters 请求参数
/// @param completion 请求响应参数
+ (void)requestHttpsBase:(NSString *)apiPath
                                parameters:(NSMutableDictionary *)parameters
                                completion:(void (^)(ResponseData *responseData))completion{
    //1,创建你得请求url
    NSString *URL = @"";
    if([GlobalKit shareKit].GlobalRequestHttpsHost == NULL){
        URL = @"https://test-gz.hdlcontrol.com";
    }
    URL = [NSString stringWithFormat:@"%@%@", URL, apiPath];
//    NSURLSessionDataTask * task=nil;
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.responseSerializer = responseSerializer;
    //3.request
    NSMutableURLRequest * request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"post" URLString:URL parameters:parameters error:nil];
    request.timeoutInterval = 10.0f;
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:GlobalKit.shareKit.hdlAccessToken forHTTPHeaderField:@"Authorization"];
    //4.dataTaskWithRequest
    [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (completion) {
            ResponseData *responseData = [[ResponseData alloc] init];
            responseData.code = @"-1";
            if(responseObject != NULL){
                //4.解析拿到的响应数据
                NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
                NSDictionary * outDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
                responseData = [[ResponseData alloc] initWithDictionary:outDic];
            }
            if (!responseData) {
                responseData = [[ResponseData alloc] init];
            }
            completion(responseData);
        }
    }]resume];
//    return task;
}
/**
 *  基础服务的接口都要校验sign
 */
+(NSMutableDictionary *)GetSignRequestDictionary:(NSMutableDictionary *)params{
    if(params == NULL){
        params =[NSMutableDictionary dictionary];
    }
    UInt64 recordTime = [[NSDate date] timeIntervalSince1970]*1000;
    [params setValue:APP_KEY forKey:@"appKey"];
    [params setValue:[NSString stringWithFormat:@"%llu",recordTime] forKey:@"timestamp"];
    //1.对KEY升序
    NSArray *keyArray = [params allKeys];
    NSArray *sortKeyArray = [keyArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    //2.2 拼接按URL键值对
    NSString *newString = @"";
    for(NSString *key in sortKeyArray){
        if(params[key] != NULL){
            NSString *valueStr = params[key];
            //检测当前参数是否需要参与校验
            if([self IfValueNeedSign:valueStr]){
                newString = [newString stringByAppendingString:[NSString stringWithFormat:@"%@=%@&", key,valueStr]];
            }
        }
    }
    //2.3 拼接SECRET_KEY
    newString = [newString substringToIndex:[newString length] - 1];
    newString = [newString stringByAppendingString: SECRET_KEY];
    //2.4 MD5转换+转小写
    if(newString == nil || newString == NULL){
        newString = @"";
    }
    NSString* signstr = [self signMD5Encrypt:newString];
    [params setValue:signstr forKey:@"sign"];
    return params;
}
/**
 MD5转换+转小写
 */
+ (NSString*)signMD5Encrypt:(NSString *)str
{
    const char *cStr = [str UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr),digest );
    NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
    [result appendFormat:@"%02x", digest[i]];
    return result;
}
/// <summary>
/// 判断当前值是否需要参与签名,保持跟云端一致
/// 空字符串不参与
/// 数组,集合,对象不参与
/// </summary>
/// <param name="valueStr"></param>
/// <returns></returns>
+(bool)IfValueNeedSign:(NSString *)valueStr{
    if (( (valueStr == nil || [valueStr isKindOfClass:[NSNull class]] || valueStr.length == 0))//判空字符
        || ([[valueStr substringToIndex:1] isEqual:@"{"])//判断是否为对象
        || ([[valueStr substringToIndex:1] isEqual:@"["])//判断是否为数组
        ) {
        return false;
    }
    return true;
}
@end
EZSDK/EZSDK/EZ/Global/GlobalKit.h
@@ -10,16 +10,17 @@
//#define CURR_LANG ([[NSLocale preferredLanguages] objectAtIndex:0])
//#define LanguageIsChinese ([CURR_LANG rangeOfString:@"zh-Hans"].location != NSNotFound)
////中文走国内, 不是中文走海外
#define EZOPENSDK LanguageIsChinese ? [EZOpenSDK class] : [EZGlobalSDK class]
//2021-02-01 不考虑海外先,默认国内
//2021-02-01 不考虑海外先
#define LanguageIsChinese true
@interface GlobalKit : NSObject
@property (nonatomic, copy) NSString *GlobalRequestHttpsHost;
@property (nonatomic, copy) NSString *hdlAccessToken;
@property (nonatomic, copy) NSString *hdlRefreshToken;
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *deviceSerialNo;  //设备序列号
@@ -35,4 +36,7 @@
- (void)clearDeviceInfo;
//+(void)hello;
@end
EZSDK/EZSDK/EZ/Global/GlobalKit.m
@@ -8,6 +8,10 @@
#import "GlobalKit.h"
#define EZOpenSDKAccessToken @"EZOpenSDKAccessToken"
#define EZhdlAccessToken @"EZhdlAccessToken"
#define EZhdlRefreshToken @"EZhdlRefreshToken"
@implementation GlobalKit
+ (instancetype)shareKit
@@ -25,7 +29,10 @@
    self = [super init];
    if (self)
    {
        _accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"EZOpenSDKAccessToken"];
        _accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:EZOpenSDKAccessToken];
        _hdlAccessToken = [[NSUserDefaults standardUserDefaults] objectForKey:EZhdlAccessToken];
        _hdlRefreshToken = [[NSUserDefaults standardUserDefaults] objectForKey:EZhdlRefreshToken];
        _deviceVerifyCodeBySerial = [NSMutableDictionary new];
    }
    return self;
@@ -35,14 +42,31 @@
- (void)setAccessToken:(NSString *)accessToken
{
    _accessToken = accessToken;
    [[NSUserDefaults standardUserDefaults] setObject:accessToken?:@"" forKey:@"EZOpenSDKAccessToken"];
    [[NSUserDefaults standardUserDefaults] setObject:accessToken?:@"" forKey:EZOpenSDKAccessToken];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
- (void)setHdlAccessToken:(NSString *)hdlAccessToken
{
    _hdlAccessToken = hdlAccessToken;
    [[NSUserDefaults standardUserDefaults] setObject:hdlAccessToken?:@"" forKey:EZhdlAccessToken];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
- (void)setHdlRefreshToken:(NSString *)hdlRefreshToken
{
    _hdlRefreshToken = hdlRefreshToken;
    [[NSUserDefaults standardUserDefaults] setObject:hdlRefreshToken?:@"" forKey:EZhdlRefreshToken];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
- (void)clearSession
{
    _accessToken = nil;
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"EZOpenSDKAccessToken"];
    _hdlRefreshToken = nil;
    _hdlRefreshToken = nil;
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:EZOpenSDKAccessToken];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
EZSDK/EZSDK/EZ/Global/ResponseData.h
New file
@@ -0,0 +1,29 @@
//
//  ResponseData.h
//  EZOpenSDKDemo
//
//  Created by 陈嘉乐 on 2021/3/1.
//  Copyright © 2021 hikvision. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
 ResponseData
 */
@interface ResponseData : NSObject
/** 响应状态码 */
@property (nonatomic, copy) NSString *code;
/** 错误信息*/
@property (nonatomic, copy) NSString *message;
/** 接收数据的字典  */
@property (nonatomic, strong) NSDictionary * __nullable data;
/** 字典处理 */
- (id)initWithDictionary:(NSDictionary *)dic;
/**是否成功*/
- (BOOL)success;
@end
NS_ASSUME_NONNULL_END
EZSDK/EZSDK/EZ/Global/ResponseData.m
New file
@@ -0,0 +1,64 @@
//
//  ResponseData.m
//  EZOpenSDKDemo
//
//  Created by 陈嘉乐 on 2021/3/1.
//  Copyright © 2021 hikvision. All rights reserved.
//
#import "ResponseData.h"
@implementation ResponseData
/// init
-(id)init {
     if (self = [super init])  {
         self.code = @"-1";
         self.message = @"请求服务器失败,请稍后再试!";
     }
     return self;
}
/// 初始化并解析返回字典参数
/// @param dic 返回参数
- (id)initWithDictionary:(NSDictionary *)dic
{
    if (self = [super init]) {
        @try {
            if (dic) {
                //1.取出返回数据的状态码
                self.code = [NSString stringWithFormat:@"%@", dic[@"code"]];
                //2.提示信息
                self.message = [dic objectForKey:@"message"];
                //3.返回数据
                NSDictionary *mData = (NSDictionary *)[dic objectForKey:@"data"];
                self.data = mData;
            } else {
                //没有返回数据
                self.message = @"请求服务器失败,请稍后再试!";
                self.data = nil;
                self.code = @"-1";
            }
        }
            //接收到异常
        @catch (NSException *exception) {
            self.message = @"数据解析错误";
            self.data = dic;
            self.code = @"-2";
        }
        @finally {
        }
    }
    return self;
}
/// Description
- (BOOL)success
{
    //河东code为0 ,萤石为200 代表成功
    return [self.code isEqual: @"0"] || [self.code isEqual: @"200"]  ;
}
@end
EZSDK/EZSDK/EZ/TableViewCells/DeviceListCell.m
@@ -35,12 +35,14 @@
    }
    
    self.nameLabel.text = [NSString stringWithFormat:@"%@",deviceInfo.deviceName];
    [self.cameraImageView sd_setImageWithURL:[NSURL URLWithString:deviceInfo.deviceCover] placeholderImageScale:nil];
    //    self.cameraImageView.contentMode =  UIViewContentModeScaleAspectFit;
    [self.cameraImageView sd_setImageWithURL:[NSURL URLWithString:deviceInfo.deviceCover] placeholderImage:[UIImage imageNamed:@"device_default"]];
//    [EZOPENSDK capturePicture:cameraInfo.deviceSerial channelNo:cameraInfo.channelNo completion:^(NSString *url, NSError *error) {
//        if(!error){
//            [self.cameraImageView sd_setImageWithURL:[NSURL URLWithString:url]];
//        }
//    }];
//    [EZOPENSDK cap]
    
    self.messageButton.hidden = NO;
    self.settingButton.hidden = NO;
EZSDK/EZSDK/EZ/UIViewControllers/EZDeviceResultViewController.m
@@ -14,7 +14,7 @@
#import "EZWifiConfigViewController.h"
#import "EZWifiTipsViewController.h"
#import "MBProgressHUD.h"
#import "EZSDK.h"
@interface EZDeviceResultViewController ()<UIAlertViewDelegate>
@@ -82,12 +82,21 @@
        [GlobalKit shareKit].deviceVerifyCode = [alertView textFieldAtIndex:0].text;
        __weak MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.labelText = NSLocalizedString(@"ad_adding_msg", @"正在添加,请稍候...");
        [EZOPENSDK addDevice:[GlobalKit shareKit].deviceSerialNo
                  verifyCode:[GlobalKit shareKit].deviceVerifyCode
                  completion:^(NSError *error) {
                      [hud hide:YES];
                      [self handleTheError:error];
                  }];
//        [EZOPENSDK addDevice:[GlobalKit shareKit].deviceSerialNo
//                  verifyCode:[GlobalKit shareKit].deviceVerifyCode
//                  completion:^(NSError *error) {
//                      [hud hide:YES];
//                      [self handleTheError:error];
//                  }];
        [EZHttpUtil addDeviceByHDL:[GlobalKit shareKit].deviceSerialNo
                   verifyCode:[GlobalKit shareKit].deviceVerifyCode
                   completion:^(ResponseData *responseData) {
                       [hud hide:YES];
                       [self handleTheError:responseData];
                   }];
    }
    else if (alertView.tag == 0xbb && buttonIndex == 1)
    {
@@ -112,12 +121,20 @@
        {
            __weak MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
            hud.labelText = NSLocalizedString(@"ad_adding_msg", @"正在添加,请稍候...");
            [EZOPENSDK addDevice:[GlobalKit shareKit].deviceSerialNo
                      verifyCode:[GlobalKit shareKit].deviceVerifyCode
                      completion:^(NSError *error) {
                          [hud hide:YES];
                          [self handleTheError:error];
                      }];
//            [EZOPENSDK addDevice:[GlobalKit shareKit].deviceSerialNo
//                      verifyCode:[GlobalKit shareKit].deviceVerifyCode
//                      completion:^(NSError *error) {
//                          [hud hide:YES];
//                          [self handleTheError:error];
//                      }];
            [EZHttpUtil addDeviceByHDL:[GlobalKit shareKit].deviceSerialNo
                       verifyCode:[GlobalKit shareKit].deviceVerifyCode
                       completion:^(ResponseData *responseData) {
                           [hud hide:YES];
                           [self handleTheError:responseData];
                       }];
        }
        else
        {
@@ -161,7 +178,7 @@
                            if (error.code == EZ_HTTPS_DEVICE_ADDED_MYSELF || error.code == EZ_HTTPS_DEVICE_ONLINE_ADDED)
                            {
                                self.statusLabel.textColor = [UIColor blackColor];
                                self.statusLabel.text = NSLocalizedString(@"ad_already_added",@"您已添加过此设备");
                                self.statusLabel.text = NSLocalizedString(@"ad_already_added",@"此设备已被添加");
                                self.statusLabel.hidden = NO;
                            }
                            else if (error.code == EZ_HTTPS_DEVICE_ONLINE_IS_ADDED || error.code == EZ_HTTPS_DEVICE_OFFLINE_IS_ADDED)
@@ -212,24 +229,24 @@
}
- (void)handleTheError:(NSError *)error
- (void)handleTheError:(ResponseData *)responseData
{
    if (!error)
    if (responseData.success)
    {
        [self performSegueWithIdentifier:@"go2WifiResult" sender:nil];
        return;
    }
    if (error.code == 105002)
    if ([responseData.code isEqual: @"20010"])
    {
        UIAlertView *retryAlertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"device_verify_code_wrong", @"验证码错误") message:nil delegate:self cancelButtonTitle:NSLocalizedString(@"cancel", @"取消") otherButtonTitles:NSLocalizedString(@"retry", @"重试"), nil];
        retryAlertView.tag = 0xbb;
        [retryAlertView show];
    }
    else if (error.code == 105000)
    else if ([responseData.code isEqual: @"20017"])
    {
        [UIView dd_showMessage:NSLocalizedString(@"ad_already_added",@"您已添加过此设备")];
    }
    else if (error.code == 105001)
    else if ([responseData.code isEqual: @"20013"])
    {
        [UIView dd_showMessage:NSLocalizedString(@"ad_added_by_others",@"此设备已被别人添加")];
    }
EZSDK/EZSDK/EZ/UIViewControllers/EZDeviceTableViewController.m
@@ -51,7 +51,9 @@
- (void)viewDidLoad
{
    [super viewDidLoad];
//    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
//     forBarMetrics:UIBarMetricsDefault];
    
    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
@@ -64,6 +66,8 @@
    //    self.title.
    
    self.logoutBtn.title = NSLocalizedString(@"Logout", @"注销");
    self.logoutBtn.title = @"";
    [self.logoutBtn setEnabled: NO];
    
    [self checkEZIsLogin];
}
EZSDK/EZSDK/EZ/UIViewControllers/EZSettingViewController.m
@@ -360,8 +360,25 @@
    {
        __weak MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.labelText = NSLocalizedString(@"message_deleting", @"正在删除,请稍候...");
        [EZOPENSDK deleteDevice:self.deviceInfo.deviceSerial completion:^(NSError *error) {
            if(!error)
//        [EZOPENSDK deleteDevice:self.deviceInfo.deviceSerial completion:^(NSError *error) {
//            if(!error)
//            {
//                [hud hide:YES];
//                NSArray *viewControllers = self.navigationController.viewControllers;
//                for (UIViewController *vc in viewControllers)
//                {
//                    if([vc isKindOfClass:[EZDeviceTableViewController class]])
//                    {
//                        ((EZDeviceTableViewController *)vc).needRefresh = YES;
//                        [self.navigationController popToViewController:vc animated:YES];
//                        break;
//                    }
//                }
//            }
//        }];
        [EZHttpUtil deleteDeviceByHDL:self.deviceInfo.deviceSerial completion:^(ResponseData *responseData) {
            if(responseData.success)
            {
                [hud hide:YES];
                NSArray *viewControllers = self.navigationController.viewControllers;
@@ -376,6 +393,8 @@
                }
            }
        }];
    }
}
EZSDK/EZSDK/EZSDK.h
@@ -7,6 +7,7 @@
#import <Foundation/Foundation.h>
@interface EZSDK : NSObject
/**
 初始化SDK
@@ -17,6 +18,10 @@
 设置SDK的accessToken
 */
+(void)setEZAccessToken:(NSString *) accessToken;
/**
 设置HDLSDK的accessToken
 */
+(void)setHDlAccessToken:(NSString *) accessToken refreshToken:(NSString *) refreshToken;
/**
 直接跳转到萤石摄像头列表
 */
@@ -37,9 +42,5 @@
 回放播放历史
 */
+(void)playBackVideo:(NSObject*)deviceInfo;
@end
EZSDK/EZSDK/EZSDK.m
@@ -6,8 +6,7 @@
//
#import "EZSDK.h"
#import "DeviceInfo.h"
#import "EZDeviceInfo.h"
//#import "DeviceInfo.h"
#import "EZDeviceInfo.h"
#import "EZOpenSDK.h"
#import "GlobalKit.h"
@@ -19,6 +18,10 @@
#import "EZPlaybackViewController.h"
#import "EZDeviceTableViewController.h"
#import "EZHCNetDeviceSDK.h"
@implementation EZSDK
@@ -58,7 +61,14 @@
    [EZOPENSDK setAccessToken:accessToken];
}
/**
 设置HDLSDK的accessToken
 */
+(void)setHDlAccessToken:(NSString *) accessToken refreshToken:(NSString *) refreshToken
{
    [[GlobalKit shareKit] setHdlAccessToken:accessToken];
    [[GlobalKit shareKit] setHdlRefreshToken:refreshToken];
}
//获取当前屏幕显示的viewcontroller   (这里面获取的相当于rootViewController)
+(UINavigationController *)getCurrentVC
@@ -278,4 +288,6 @@
//    }
//}
@end