From 1a27ef122fb0a2b9f1c19dd609897728b795df5d Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期五, 09 七月 2021 18:27:41 +0800
Subject: [PATCH] 2021-07-09 1.告警消息相关接口替换,改为河东管理
---
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.h | 24
EZSDK/EZSDK/EZ/Global/EZHttpUtil.h | 18
EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.m | 362 ++++
EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.m | 25
EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.m | 8
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo.xcodeproj/project.pbxproj | 6
EZSDK/EZSDK.xcodeproj/project.pbxproj | 28
EZSDK/EZSDK/EZ/Venders/YYModel/YYModel.h | 22
EZSDK/EZSDK/EZSDK.h | 27
EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.h | 4
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.m | 47
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.h | 5
EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs | 219 +-
EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.h | 200 ++
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessageListViewController.m | 488 +++--
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.m | 14
EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.h | 56
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.h | 4
EZSDK/EZSDK/EZDeviceInfo.h | 55
EZSDK/EZSDK/EZSDK.m | 48
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.m | 8
EZSDK.IOS/EZSDK.IOS/Properties/AssemblyInfo.cs | 2
EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.m | 14
EZSDK/EZSDK/EZ/UIViewControllers/EZMessageListViewController.m | 488 +++--
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.m | 25
EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.h | 5
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/GlobalKit.m | 1
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.h | 56
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/ViewController.m | 24
EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a | 0
EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.m | 1839 +++++++++++++++++++++++
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h | 18
Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.m | 70
EZSDK/EZSDK/EZ/Global/EZHttpUtil.m | 70
EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.h | 440 +++++
35 files changed, 4,144 insertions(+), 576 deletions(-)
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo.xcodeproj/project.pbxproj b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo.xcodeproj/project.pbxproj
index a00534f..56f87cf 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo.xcodeproj/project.pbxproj
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo.xcodeproj/project.pbxproj
@@ -142,6 +142,7 @@
B91B6E5225EC9DFF00915F73 /* ResponseData.m in Sources */ = {isa = PBXBuildFile; fileRef = B91B6E5125EC9DFF00915F73 /* ResponseData.m */; };
B95004F125B927D0002D3C58 /* com.hri.hpc.mobile.ios.player.metallib in Resources */ = {isa = PBXBuildFile; fileRef = B95004F025B927D0002D3C58 /* com.hri.hpc.mobile.ios.player.metallib */; };
B95004F725B929EF002D3C58 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B95004F625B929EF002D3C58 /* Launch Screen.storyboard */; };
+ B95AB8792697F8F8007BC8D7 /* HDLAlarmInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = B95AB8782697F8F8007BC8D7 /* HDLAlarmInfo.m */; };
B96C125625E8C5EA00B69941 /* EZSDK.m in Sources */ = {isa = PBXBuildFile; fileRef = B96C125525E8C5EA00B69941 /* EZSDK.m */; };
B96C126725E8F64800B69941 /* EZHttpUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B96C126625E8F64800B69941 /* EZHttpUtil.m */; };
B9E6208D26969E170054E443 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = B9E6208A26969E170054E443 /* NSObject+YYModel.m */; };
@@ -571,6 +572,8 @@
B91B6E5125EC9DFF00915F73 /* ResponseData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ResponseData.m; sourceTree = "<group>"; };
B95004F025B927D0002D3C58 /* com.hri.hpc.mobile.ios.player.metallib */ = {isa = PBXFileReference; lastKnownFileType = "archive.metal-library"; path = com.hri.hpc.mobile.ios.player.metallib; sourceTree = "<group>"; };
B95004F625B929EF002D3C58 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
+ B95AB8772697F8F8007BC8D7 /* HDLAlarmInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HDLAlarmInfo.h; sourceTree = "<group>"; };
+ B95AB8782697F8F8007BC8D7 /* HDLAlarmInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HDLAlarmInfo.m; sourceTree = "<group>"; };
B96C125425E8C5EA00B69941 /* EZSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZSDK.h; sourceTree = "<group>"; };
B96C125525E8C5EA00B69941 /* EZSDK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZSDK.m; sourceTree = "<group>"; };
B96C126525E8F64800B69941 /* EZHttpUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZHttpUtil.h; sourceTree = "<group>"; };
@@ -1041,6 +1044,8 @@
B96C126625E8F64800B69941 /* EZHttpUtil.m */,
B91B6E5025EC9DFF00915F73 /* ResponseData.h */,
B91B6E5125EC9DFF00915F73 /* ResponseData.m */,
+ B95AB8772697F8F8007BC8D7 /* HDLAlarmInfo.h */,
+ B95AB8782697F8F8007BC8D7 /* HDLAlarmInfo.m */,
);
path = Global;
sourceTree = "<group>";
@@ -1803,6 +1808,7 @@
B9EA4E4825C7E7AB000FFDA2 /* MJRefreshFooter.m in Sources */,
B9EA4E3F25C7E7AB000FFDA2 /* MJRefreshBackGifFooter.m in Sources */,
0D5015181BF8B7FF00F13269 /* DACircularProgressView.m in Sources */,
+ B95AB8792697F8F8007BC8D7 /* HDLAlarmInfo.m in Sources */,
B9EA4E4025C7E7AB000FFDA2 /* MJRefreshBackStateFooter.m in Sources */,
0DCE0C0A1BE22761000EA68A /* UIView+DDKit.m in Sources */,
B9EA4E4C25C7E7AB000FFDA2 /* MJRefreshComponent.m in Sources */,
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h
index 448a1db..7a659f3 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.h
@@ -48,6 +48,24 @@
*/
- (void)deleteDeviceByHDL:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion;
+/**
+ * 鏍规嵁璁惧搴忓垪鍙疯幏鍙栧憡璀︿俊鎭垪琛�
+ */
+- (void)getAlarmList:(NSString *)deviceSerial
+ pageNo:(NSInteger)pageNo
+ pageSize:(NSInteger)pageSize
+ completion:(void (^)(ResponseData *responseData))completion;
+/**
+ * 鎵归噺鍒犻櫎鎶ヨ璁板綍
+ */
+- (void)deleteAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion;
+
+/**
+ * 鎵归噺鏍囪鎶ヨ璁板綍宸茶
+ */
+- (void)readAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion;
@end
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.m
index 6c2236e..d87504f 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZHttpUtil.m
@@ -10,6 +10,7 @@
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#import "AFNetworking.h"
+#import "YYModel.h"
#define TestRequestHttpsHost @"https://test-gz.hdlcontrol.com"
#pragma mark API
@@ -18,6 +19,9 @@
#define API_POST_EZ_ChildDelDevice @"/home-wisdom/platform/yingshi/child/deleteDevice"
#define API_POST_EZ_RefreshToken @"/smart-footstone/member/oauth/login"
+#define API_POST_EZ_GetAlarmList @"/home-wisdom/platform/yingshi/alarm/records"//鑾峰彇鎶ヨ娑堟伅
+#define API_POST_EZ_DeleteAlarmMes @"/home-wisdom/platform/yingshi/alarm/delete"//鍒犻櫎鎶ヨ娑堟伅
+#define API_POST_EZ_ReadAlarmMes @"/home-wisdom/platform/yingshi/alarm/updateChecked"//鏍囪鎶ヨ娑堟伅宸茶
#pragma mark APP_KEY
#define APP_KEY @"HDL-HOME-APP-TEST"
@@ -126,6 +130,70 @@
}
+/**
+ * 鏍规嵁璁惧搴忓垪鍙疯幏鍙栧憡璀︿俊鎭垪琛�
+ */
+- (void)getAlarmList:(NSString *)deviceSerial
+ pageNo:(NSInteger)pageNo
+ pageSize:(NSInteger)pageSize
+ completion:(void (^)(ResponseData *responseData))completion{
+
+ //1.璁剧疆璇锋眰鍙傛暟
+ NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+ [parameters setValue:deviceSerial forKey:@"deviceSerial"];
+ [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"];
+ [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageSize] forKey:@"pageSize"];
+ [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageNo] forKey:@"pageNo"];
+
+ parameters = [self GetSignRequestDictionary:parameters];
+ NSLog(@"HDLpageNo:%ld",(long)pageNo);
+ [self requestHttpsPost:API_POST_EZ_GetAlarmList parameters:parameters completion:^(ResponseData *responseData) {
+ if (completion) {
+ completion (responseData);
+ }
+ }];
+}
+
+/**
+ * 鎵归噺鍒犻櫎鎶ヨ璁板綍
+ */
+- (void)deleteAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion{
+
+ //1.璁剧疆璇锋眰鍙傛暟
+ NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+ [parameters setValue:[alarmIds yy_modelToJSONObject] forKey:@"alarmIds"];
+
+ parameters = [self GetSignRequestDictionary:parameters];
+
+ [self requestHttpsPost:API_POST_EZ_DeleteAlarmMes parameters:parameters completion:^(ResponseData *responseData) {
+ if (completion) {
+ completion (responseData);
+ }
+ }];
+}
+
+
+/**
+ * 鎵归噺鏍囪鎶ヨ璁板綍宸茶
+ */
+- (void)readAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion{
+
+ //1.璁剧疆璇锋眰鍙傛暟
+ NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+ [parameters setValue:@"1" forKey:@"isChecked"];
+ [parameters setValue:[alarmIds yy_modelToJSONObject] forKey:@"alarmIds"];
+
+ parameters = [self GetSignRequestDictionary:parameters];
+
+ [self requestHttpsPost:API_POST_EZ_ReadAlarmMes parameters:parameters completion:^(ResponseData *responseData) {
+ if (completion) {
+ completion (responseData);
+ }
+ }];
+}
+
/// 鍒锋柊token
/// @param block 缁撴灉
@@ -143,7 +211,7 @@
if (block) {
if (responseData) {
if(responseData.success){
- [EZSDK setHDlAccessToken:
+ [[EZSDK sharedInstance] setHDlAccessToken:
[NSString stringWithFormat:@"%@%@",responseData.data[@"headerPrefix"], responseData.data[@"accessToken"]]
refreshToken:responseData.data[@"refreshToken"]];
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.h b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.h
index 9325728..49ce8b1 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.h
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.h
@@ -9,46 +9,50 @@
#import "EZDeviceInfo.h"
@interface EZSDK : NSObject
+///sharedInstance
++ (instancetype)sharedInstance;
+
/**
鍒濆鍖朣DK
浼犲叆鍥藉唴鐗坘ey 鍜屾捣澶栫増globalAppKey
*/
-+ (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey;
+- (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey;
/**
璁剧疆SDK鐨刟ccessToken
*/
-+(void)setEZAccessToken:(NSString *) accessToken;
+- (void)setEZAccessToken:(NSString *) accessToken;
/**
璁剧疆HDLSDK鐨刟ccessToken
*/
-+(void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *) refreshToken;
+- (void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *) refreshToken;
/**
璁剧疆SDK鐨勬渤涓滄帴鍙g殑requestHttpsHost鍜屽钩鍙� 鏍囪瘑锛�1.on+(榛樿) 2.evoyo
*/
-+(void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId;
+- (void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId;
/**
鐩存帴璺宠浆鍒拌悿鐭虫憚鍍忓ご鍒楄〃
*/
-+(void)go2EZvizMonitor;
+- (void)go2EZvizMonitor;
/**
璺宠浆娣诲姞娣诲姞璁惧
*/
-+(void)addEzvizMonitor;
+- (void)addEzvizMonitor;
/**
鏌ョ湅瑙嗛鐩戞帶鐩存挱
*/
-+(void)Play:(EZDeviceInfo*)deviceInfo;
+- (void)Play:(EZDeviceInfo*)deviceInfo;
/// 鎸囧畾搴忓垪鍙� 鏌ョ湅瑙嗛鐩戞帶鐩存挱
/// @param deviceSerial 搴忓垪鍙�
-+(void)PlayWithDeviceSerial:(NSString *)deviceSerial;
+- (void)PlayWithDeviceSerial:(NSString *)deviceSerial;
/**
鎵撳紑鎽勫儚澶磋缃〉闈�
*/
-+(void)setting:(EZDeviceInfo*)deviceInfo;
+- (void)setting:(EZDeviceInfo*)deviceInfo;
/**
鍥炴斁鎾斁鍘嗗彶
*/
-+(void)playBackVideo:(EZDeviceInfo*)deviceInfo;
+- (void)playBackVideo:(EZDeviceInfo*)deviceInfo;
+
@end
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.m
index cfb414f..4438cb0 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/EZSDK.m
@@ -18,12 +18,24 @@
#import "EZPlaybackViewController.h"
#import "EZDeviceTableViewController.h"
#import "EZHCNetDeviceSDK.h"
-
+#import "EZMessagePhotoViewController.h"
@implementation EZSDK
+
+///
++ (instancetype)sharedInstance{
+ static EZSDK *instance = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ if (!instance) {
+ instance = [[EZSDK alloc] init];
+ }
+ });
+ return instance;
+}
static BOOL isHavelibInit=NO;
@@ -31,7 +43,7 @@
鍒濆鍖朣DK
浼犲叆鍥藉唴鐗坘ey 鍜屾捣澶栫増globalAppKey
*/
-+ (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey
+- (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey
{
if (!isHavelibInit) {
@@ -57,7 +69,7 @@
/**
璁剧疆SDK鐨刟ccessToken
*/
-+(void)setEZAccessToken:(NSString *) accessToken
+-(void)setEZAccessToken:(NSString *) accessToken
{
[[GlobalKit shareKit] setAccessToken:accessToken];
[EZOPENSDK setAccessToken:accessToken];
@@ -66,7 +78,7 @@
/**
璁剧疆HDLSDK鐨刟ccessToken
*/
-+(void)setHDlAccessToken:(NSString *) accessToken refreshToken:(NSString *) refreshToken
+-(void)setHDlAccessToken:(NSString *) accessToken refreshToken:(NSString *) refreshToken
{
[[GlobalKit shareKit] setHdlAccessToken:accessToken];
[[GlobalKit shareKit] setHdlRefreshToken:refreshToken];
@@ -74,14 +86,14 @@
/**
璁剧疆SDK鐨勬渤涓滄帴鍙g殑requestHttpsHost鍜屽钩鍙� 鏍囪瘑锛�1.on+(榛樿) 2.evoyo
*/
-+(void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId{
+-(void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId{
[[GlobalKit shareKit] setGlobalRequestHttpsHost:requestHttpsHost];
[[GlobalKit shareKit] setHdlPlatform:platform];
[[GlobalKit shareKit] setHdlHomeId:homeId];
}
//鑾峰彇褰撳墠灞忓箷鏄剧ず鐨剉iewcontroller (杩欓噷闈㈣幏鍙栫殑鐩稿綋浜巖ootViewController)
-+(UINavigationController *)getCurrentVC
+-(UINavigationController *)getCurrentVC
{
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
@@ -104,7 +116,7 @@
/**
鐩存帴璺宠浆鍒拌悿鐭虫憚鍍忓ご鍒楄〃
*/
-+(void)go2EZvizMonitor
+-(void)go2EZvizMonitor
{
// NSLog(@"go2EZvizMonitor");
//鑾峰彇EZMain鐨剆troyboard鏂囦欢
@@ -121,7 +133,7 @@
/**
璺宠浆娣诲姞娣诲姞璁惧
*/
-+(void)addEzvizMonitor
+-(void)addEzvizMonitor
{
// NSLog(@"娣诲姞鎽勫儚澶�");
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
@@ -139,7 +151,7 @@
/**
鏌ョ湅瑙嗛鐩戞帶鐩存挱
*/
-+(void)Play:(EZDeviceInfo*)deviceInfo
+-(void)Play:(EZDeviceInfo*)deviceInfo
{
UIStoryboard *addDeviceStoryBoard = [UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
EZLivePlayViewController *rootViewController = [addDeviceStoryBoard instantiateViewControllerWithIdentifier:@"EZLivePlayViewController"];
@@ -155,7 +167,7 @@
/// 鎸囧畾搴忓垪鍙锋挱鏀�
/// @param deviceSerial 搴忓垪鍙�
-+(void)PlayWithDeviceSerial:(NSString *)deviceSerial{
+-(void)PlayWithDeviceSerial:(NSString *)deviceSerial{
//鑾峰彇璁惧鍒楄〃鎺ュ彛
[EZOpenSDK getDeviceInfo:deviceSerial completion:^(EZDeviceInfo *deviceInfo, NSError *error) {
if(error)
@@ -172,7 +184,7 @@
/**
鎵撳紑鎽勫儚澶磋缃〉闈�
*/
-+(void)setting:(EZDeviceInfo*)deviceInfo
+-(void)setting:(EZDeviceInfo*)deviceInfo
{
UIStoryboard *settingStoryBoard=[UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
EZSettingViewController *settingVC=[settingStoryBoard instantiateViewControllerWithIdentifier:@"EZSettingViewController"];
@@ -184,7 +196,7 @@
/**
鍥炴斁鎾斁鍘嗗彶
*/
-+(void)playBackVideo:(EZDeviceInfo*)deviceInfo
+-(void)playBackVideo:(EZDeviceInfo*)deviceInfo
{
UIStoryboard *playBackStoryBoard=[UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
EZPlaybackViewController *playBackVC=[playBackStoryBoard instantiateViewControllerWithIdentifier:@"EZPlaybackViewController"];
@@ -193,6 +205,17 @@
[[self getCurrentVC] pushViewController:playBackVC animated:YES];
}
+////
+//-(void)goToEZMessagePhotoVC:(EZAlarmInfo*)alarmInfo{
+// UIStoryboard *addDeviceStoryBoard = [UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
+// EZMessagePhotoViewController *rootViewController = [addDeviceStoryBoard instantiateViewControllerWithIdentifier:@"EZMessagePhotoViewController"];
+// // NSLog(@"play--iphone--rootViewController");
+// rootViewController.info = alarmInfo;
+//// NSLog(@"play--iphone--deviceName -%@",rootViewController.deviceInfo.deviceName);
+//// rootViewController.cameraIndex=0;
+// [[self getCurrentVC] setNavigationBarHidden:NO];
+// [[self getCurrentVC] pushViewController:rootViewController animated:YES];
+//}
//+(void)MonitorPushMessage:(NSString *)MonitorType ID:(NSString *)ID
//{
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/GlobalKit.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/GlobalKit.m
index e26e622..c58d0ad 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/GlobalKit.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/GlobalKit.m
@@ -45,7 +45,6 @@
_accessToken = accessToken;
[[NSUserDefaults standardUserDefaults] setObject:accessToken?:@"" forKey:EZOpenSDKAccessToken];
[[NSUserDefaults standardUserDefaults] synchronize];
- [EZOPENSDK setAccessToken:[GlobalKit shareKit].accessToken];
}
- (void)setHdlAccessToken:(NSString *)hdlAccessToken
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.h b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.h
new file mode 100644
index 0000000..e03b208
--- /dev/null
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.h
@@ -0,0 +1,56 @@
+//
+// HDLAlarmInfo.h
+// EZOpenSDKDemo
+//
+// Created by 闄堝槈涔� on 2021/7/9.
+// Copyright 漏 2021 hikvision. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HDLAlarmInfo : NSObject
+
+/// 涓婚敭ID
+@property (nonatomic, copy) NSString *ysId;
+/// 鍛婅ID
+@property (nonatomic, copy) NSString *alarmId;
+/// 閫氶亾鍙�
+@property (nonatomic, assign) NSInteger channelNo;
+/// 璁惧搴忓垪鍙�
+@property (nonatomic, copy) NSString *deviceSerial;
+/// 鍛婅鍚嶇О
+@property (nonatomic, copy) NSString *alarmName;
+/// 鍛婅鍥剧墖
+@property (nonatomic, copy) NSString *alarmPicUrl;
+/// 鍛婅寮�濮嬫椂闂�
+@property (nonatomic, strong) NSDate *alarmTime;
+/// 浣忓畢Id
+@property (nonatomic, copy) NSString *homeId;
+/// 鍛婅绫诲瀷
+@property (nonatomic, copy) NSString *alarmType;
+/// 鏄惁宸茶
+@property (nonatomic, assign) NSInteger isChecked;
+/// 鏄惁鍔犲瘑
+@property (nonatomic, assign) NSInteger isEncrypt;
+//@property (nonatomic, assign) NSInteger deleted;
+//@property (nonatomic, copy) NSString *tenantID;
+@property (nonatomic, copy) NSString *createTime;
+//@property (nonatomic, copy) NSString *modifyTime;
+//@property (nonatomic, copy) NSString *region;
+//@property (nonatomic, copy) NSString *identifier;
+-(NSDate *)getAlarmStartTime;
+@end
+
+@interface HDLAlarmInfoData : NSObject
+@property (nonatomic, copy) NSArray<HDLAlarmInfo *> *list;
+@property (nonatomic, assign) NSInteger totalCount;
+@property (nonatomic, assign) NSInteger totalPage;
+@property (nonatomic, assign) NSInteger pageNo;
+@property (nonatomic, assign) NSInteger pageSize;
+@end
+
+
+
+NS_ASSUME_NONNULL_END
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.m
new file mode 100644
index 0000000..676b81b
--- /dev/null
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/Global/HDLAlarmInfo.m
@@ -0,0 +1,25 @@
+//
+// HDLAlarmInfo.m
+// EZOpenSDKDemo
+//
+// Created by 闄堝槈涔� on 2021/7/9.
+// Copyright 漏 2021 hikvision. All rights reserved.
+//
+
+#import "HDLAlarmInfo.h"
+
+@implementation HDLAlarmInfo
+
+-(NSDate *)getAlarmStartTime{
+ NSTimeInterval time = [_createTime doubleValue];
+// return [NSDate dateWithTimeIntervalSince1970:time];;
+ return [NSDate dateWithTimeIntervalSince1970:time/1000];
+}
+
+@end
+
+@implementation HDLAlarmInfoData
++ (NSDictionary *)modelContainerPropertyGenericClass {
+ return @{@"list" : [HDLAlarmInfo class]};
+}
+@end
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.h b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.h
index 3a2f630..b8acfc7 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.h
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.h
@@ -7,7 +7,7 @@
//
#import <UIKit/UIKit.h>
-#import "EZAlarmInfo.h"
+#import "HDLAlarmInfo.h"
@interface MessageListCell : UITableViewCell
@@ -18,6 +18,6 @@
@property (nonatomic, weak) IBOutlet UIImageView *readStatusIcon;
@property (nonatomic, copy) NSString *deviceSerial;
-- (void)setAlarmInfo:(EZAlarmInfo *)info;
+- (void)setAlarmInfo:(HDLAlarmInfo *)info;
@end
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.m
index 1709c69..9c4d171 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/TableViewCells/MessageListCell.m
@@ -9,7 +9,7 @@
#import "MessageListCell.h"
#import "UIImageView+EzvizOpenSDK.h"
#import "UIImageView+AFNetworking.h"
-
+#import "HDLAlarmInfo.h"
#import "DDKit.h"
static dispatch_semaphore_t ezviz_sema; //鍏ㄥ眬淇″彿閲�
@@ -55,13 +55,13 @@
dispatch_semaphore_signal(ezviz_sema);
}
-- (void)setAlarmInfo:(EZAlarmInfo *)info
+- (void)setAlarmInfo:(HDLAlarmInfo *)info
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"HH:mm:ss";
- self.timeLabel.text = [formatter stringFromDate:info.alarmStartTime];
+ self.timeLabel.text = [formatter stringFromDate:[info getAlarmStartTime]];
self.readStatusIcon.hidden = NO;
- if(info.isRead)
+ if(info.isChecked)
{
self.readStatusIcon.hidden = YES;
}
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessageListViewController.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessageListViewController.m
index 74a44d1..0dcb0bd 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessageListViewController.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessageListViewController.m
@@ -15,6 +15,8 @@
#import "MBProgressHUD.h"
#import "EZMessagePhotoViewController.h"
#import "NSDate-Utilities.h"
+#import "HDLAlarmInfo.h"
+#import "YYModel.h"
#define EZMessageListPageSize 10
@@ -31,7 +33,7 @@
@property (nonatomic) NSInteger currentIndex;
@property (nonatomic, strong) NSMutableArray *messageList;
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
-@property (nonatomic, strong) NSMutableArray *sections;
+//@property (nonatomic, strong) NSMutableArray *sections;
@property (nonatomic) NSInteger lastIndex;
@property (nonatomic, weak) IBOutlet UIImageView *noMessage;
@property (nonatomic, weak) IBOutlet UILabel *noMessageLabel;
@@ -59,16 +61,16 @@
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
self.title = NSLocalizedString(@"dmessage_title", @"娑堟伅");
- [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
- self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
- }];
+ // [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
+ // self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
+ // }];
- if(!_messageList)
- _messageList = [NSMutableArray new];
+ if(!self.messageList)
+ self.messageList = [NSMutableArray new];
- if(!_sections)
- _sections = [NSMutableArray new];
-
+// if(!_sections)
+// _sections = [NSMutableArray new];
+//
if(!_selectedMessageArray)
_selectedMessageArray = [NSMutableArray new];
@@ -99,35 +101,20 @@
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
- return _sections.count;
+ return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- if (_sections.count == 1)
- {
- return _messageList.count;
- }
- else
- {
- if (section == 0) {
- return [_sections[1][@"index"] integerValue];
- }
- else if (section == _sections.count - 1)
- {
- return _messageList.count - [_sections[section][@"index"] integerValue];
- }
- else
- {
- return [_sections[section + 1][@"index"] integerValue] - [_sections[section][@"index"] integerValue];
- }
- }
+
+ return self.messageList.count;
+
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Configure the cell...
MessageListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MessageCell" forIndexPath:indexPath];
cell.deviceSerial = self.deviceInfo.deviceSerial;
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];
[cell setAlarmInfo:info];
if (tableView.allowsMultipleSelectionDuringEditing == YES) {
if([_selectedMessageArray containsObject:info])
@@ -150,7 +137,7 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];
if(tableView.allowsMultipleSelectionDuringEditing)
{
if ([self.selectedMessageArray containsObject:info])
@@ -165,14 +152,14 @@
{
self.deleteSelected.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"delete", @"鍒犻櫎"),(int)[self.selectedMessageArray count]];
self.deleteSelected.enabled = YES;
- self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"dmessage_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
+ self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"message_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
self.readAll.enabled = YES;
}
else
{
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
self.deleteSelected.enabled = NO;
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
self.readAll.enabled = NO;
}
return;
@@ -180,16 +167,16 @@
MessageListCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[self performSegueWithIdentifier:@"go2MessagePhoto" sender:@{@"image":cell.actionImageView.image?:[UIImage new],
@"alarmInfo":info}];
- [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
- self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
- }];
+ // [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
+ // self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
+ // }];
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView.allowsMultipleSelectionDuringEditing)
{
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];;
if ([self.selectedMessageArray containsObject:info])
{
[self.selectedMessageArray removeObject:info];
@@ -202,14 +189,14 @@
{
self.deleteSelected.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"delete", @"鍒犻櫎"),(int)[self.selectedMessageArray count]];
self.deleteSelected.enabled = YES;
- self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"dmessage_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
+ self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"message_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
self.readAll.enabled = YES;
}
else
{
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
self.deleteSelected.enabled = NO;
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
self.readAll.enabled = NO;
}
}
@@ -220,49 +207,64 @@
return 75.0f;
}
-- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
-{
- return 20.0f;
-}
+//- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
+//{
+// return 20.0f;
+//}
-- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
-{
- UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 20)];
- NSString *key = [self.sections dd_objectAtIndex:section][@"date"];
- headerLabel.text = [NSString stringWithFormat:@" %@",[self dateStringWithUserDefine:key]];
- headerLabel.font = [UIFont systemFontOfSize:14.0f];
- headerLabel.backgroundColor = [UIColor dd_hexStringToColor:@"0xf0f0f3"];
- return headerLabel;
-}
+//- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
+//{
+// UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 20)];
+// NSString *key = [self.sections dd_objectAtIndex:section][@"date"];
+// headerLabel.text = [NSString stringWithFormat:@" %@",[self dateStringWithUserDefine:key]];
+// headerLabel.font = [UIFont systemFontOfSize:14.0f];
+// headerLabel.backgroundColor = [UIColor dd_hexStringToColor:@"0xf0f0f3"];
+// return headerLabel;
+//}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];;
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = NSLocalizedString(@"message_deleting", @"姝e湪鍒犻櫎锛岃绋嶅��...");
- [EZOPENSDK deleteAlarm:@[info.alarmId] completion:^(NSError *error) {
- [hud hide:YES];
- [_messageList removeObject:info];
- [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ // [EZOPENSDK deleteAlarm:@[info.alarmId] completion:^(NSError *error) {
+ // [hud hide:YES];
+ // [self.messageList removeObject:info];
+ // [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ // }];
+
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] deleteAlarmMessage:@[info.ysId] completion:^(ResponseData * responseData) {
+ if (responseData.success) {
+ [hud hide:YES];
+ [weakSelf.messageList removeObject:info];
+ [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ }else{
+ hud.labelText = NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触");
+ hud.mode = MBProgressHUDModeText;
+ [hud hide:YES afterDelay:1.2];
+ }
+
}];
+
}
}
/*
-// Override to support rearranging the table view.
-- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
-}
-*/
+ // Override to support rearranging the table view.
+ - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+ }
+ */
/*
-// Override to support conditional rearranging of the table view.
-- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the item to be re-orderable.
- return YES;
-}
-*/
+ // Override to support conditional rearranging of the table view.
+ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the item to be re-orderable.
+ return YES;
+ }
+ */
#pragma mark - UIActionSheetDelegate Methods
@@ -274,29 +276,51 @@
hud.labelText = NSLocalizedString(@"message_deleting", @"姝e湪鍒犻櫎锛岃绋嶅��...");
NSMutableArray *alarmIds = [NSMutableArray new];
for (int i = 0; i < self.selectedMessageArray.count; i++) {
- EZAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
- [alarmIds addObject:info.alarmId];
+ HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ [alarmIds addObject:info.ysId];
}
- [EZOPENSDK deleteAlarm:alarmIds completion:^(NSError *error) {
- if(error)
- {
- hud.labelText = error.localizedDescription;
+ // [EZOPENSDK deleteAlarm:alarmIds completion:^(NSError *error) {
+ // if(error)
+ // {
+ // hud.labelText = error.localizedDescription;
+ // hud.mode = MBProgressHUDModeText;
+ // [hud hide:YES afterDelay:1.2];
+ // }
+ // else
+ // {
+ // [hud hide:YES];
+ // }
+ // [self.messageList removeObjectsInArray:self.selectedMessageArray];
+ // [self editTableView:self.navigationItem.rightBarButtonItem];
+ // if(self.messageList.count > 0){
+ // [self.tableView reloadData];
+ // }
+ // else
+ // {
+ // [self.tableView.mj_header beginRefreshing];
+ // }
+ // }];
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] deleteAlarmMessage:alarmIds completion:^(ResponseData * responseData) {
+ [hud hide:YES];
+ if (responseData.success) {
+ [hud hide:YES];
+ }else{
+ hud.labelText = NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触");
hud.mode = MBProgressHUDModeText;
[hud hide:YES afterDelay:1.2];
}
- else
- {
- [hud hide:YES];
- }
- [self.messageList removeObjectsInArray:self.selectedMessageArray];
- [self editTableView:self.navigationItem.rightBarButtonItem];
- if(self.messageList.count > 0){
- [self.tableView reloadData];
+
+ [weakSelf.messageList removeObjectsInArray:self.selectedMessageArray];
+ [weakSelf editTableView:self.navigationItem.rightBarButtonItem];
+ if(weakSelf.messageList.count > 0){
+ [weakSelf.tableView reloadData];
}
else
{
- [self.tableView.header beginRefreshing];
+ [weakSelf.tableView.mj_header beginRefreshing];
}
+
}];
}
}
@@ -308,15 +332,25 @@
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
NSDictionary *dict = sender;
- EZAlarmInfo *info = dict[@"alarmInfo"];
- if(!info.isRead){
- [EZOPENSDK setAlarmStatus:@[info.alarmId] alarmStatus:EZMessageStatusRead completion:^(NSError *error) {
- if(!error)
- {
- info.isRead = YES;
- [self.tableView reloadData];
+ HDLAlarmInfo *info = dict[@"alarmInfo"];
+ if(!info.isChecked){
+ // [EZOPENSDK setAlarmStatus:@[info.alarmId] alarmStatus:EZMessageStatusRead completion:^(NSError *error) {
+ // if(!error)
+ // {
+ // info.isChecked = YES;
+ // [self.tableView reloadData];
+ // }
+ // }];
+
+ //鏍囪宸茶
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] readAlarmMessage:@[info.ysId] completion:^(ResponseData * responseData) {
+ if(responseData.success){
+ info.isChecked = YES;
+ [weakSelf.tableView reloadData];
}
}];
+
}
EZMessagePhotoViewController *nextVC = [segue destinationViewController];
nextVC.image = dict[@"image"];
@@ -329,64 +363,118 @@
- (void)addHeaderRefresh
{
__weak typeof(self) weakSelf = self;
- self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
- weakSelf.currentIndex = 0;
+ self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
+ weakSelf.currentIndex = 1;
[weakSelf.noMessage removeFromSuperview];
[weakSelf.noMessageLabel removeFromSuperview];
- [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
- pageIndex:weakSelf.currentIndex++
- pageSize:EZMessageListPageSize
- beginTime:weakSelf.beginTime
- endTime:weakSelf.endTime
-// beginTime:nil
-// endTime:nil
- completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
- [weakSelf.messageList removeAllObjects];
- [weakSelf.messageList addObjectsFromArray:alarmList];
- weakSelf.totalCount = alarmCount;
- if(weakSelf.messageList.count != weakSelf.totalCount)
- {
- [weakSelf addFooter];
- }
- [weakSelf tableViewDidReload:alarmList];
- [weakSelf.tableView.header endRefreshing];
- if(weakSelf.messageList.count > 0)
- weakSelf.navigationItem.rightBarButtonItem = self.editButton;
- }];
-
+
+ // [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
+ // pageIndex:weakSelf.currentIndex++
+ // pageSize:EZMessageListPageSize
+ // beginTime:weakSelf.beginTime
+ // endTime:weakSelf.endTime
+ //// beginTime:nil
+ //// endTime:nil
+ // completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
+ // [weakSelf.messageList removeAllObjects];
+ // [weakSelf.messageList addObjectsFromArray:alarmList];
+ // weakSelf.totalCount = alarmCount;
+ // if(weakSelf.messageList.count != weakSelf.totalCount)
+ // {
+ // [weakSelf addFooter];
+ // }
+ // [weakSelf tableViewDidReload:alarmList];
+ // [weakSelf.tableView.mj_header endRefreshing];
+ // if(weakSelf.messageList.count > 0)
+ // weakSelf.navigationItem.rightBarButtonItem = self.editButton;
+ // }];
+ //2021-07-09 1.淇敼涓篐DL鎺ュ彛鏂规
+ [[EZHttpUtil sharedManager] getAlarmList:weakSelf.deviceInfo.deviceSerial pageNo:weakSelf.currentIndex++ pageSize:EZMessageListPageSize completion:^(ResponseData * responseData) {
+ NSInteger alarmCount = 0;
+ NSArray<HDLAlarmInfo *> *alarmList = [NSArray array];
+ if (responseData.success){
+ HDLAlarmInfoData *alarmInfoData = [HDLAlarmInfoData yy_modelWithDictionary:responseData.data];
+ if (alarmInfoData) {
+ alarmCount = alarmInfoData.totalCount;
+ if (alarmInfoData.list) {
+ alarmList = alarmInfoData.list;
+ }
+ }
+ }
+
+ [weakSelf.messageList removeAllObjects];
+ [weakSelf.messageList addObjectsFromArray:alarmList];
+ weakSelf.totalCount = alarmCount;
+ if(weakSelf.messageList.count != weakSelf.totalCount)
+ {
+ [weakSelf addFooter];
+ }
+ [weakSelf tableViewDidReload];
+ [weakSelf.tableView.mj_header endRefreshing];
+ if(weakSelf.messageList.count > 0)
+ weakSelf.navigationItem.rightBarButtonItem = self.editButton;
+
+ }];
+
}];
- self.tableView.header.automaticallyChangeAlpha = YES;
- [self.tableView.header beginRefreshing];
+ self.tableView.mj_header.automaticallyChangeAlpha = YES;
+ [self.tableView.mj_header beginRefreshing];
}
- (void)addFooter
{
__weak typeof(self) weakSelf = self;
- self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
- [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
- pageIndex:weakSelf.currentIndex++
- pageSize:EZMessageListPageSize
- beginTime:weakSelf.beginTime
- endTime:weakSelf.endTime
- completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
- [weakSelf.messageList addObjectsFromArray:alarmList];
- if(weakSelf.messageList.count >= weakSelf.totalCount)
- {
- weakSelf.tableView.footer.hidden = YES;
- return;
- }
- [weakSelf tableViewDidReload:alarmList];
- [weakSelf.tableView.footer endRefreshing];
- }];
-
+ self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
+ // [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
+ // pageIndex:weakSelf.currentIndex++
+ // pageSize:EZMessageListPageSize
+ // beginTime:weakSelf.beginTime
+ // endTime:weakSelf.endTime
+ // completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
+ // [weakSelf.messageList addObjectsFromArray:alarmList];
+ // if(weakSelf.messageList.count >= weakSelf.totalCount)
+ // {
+ // weakSelf.tableView.mj_footer.hidden = YES;
+ // return;
+ // }
+ // [weakSelf tableViewDidReload:alarmList];
+ // [weakSelf.tableView.mj_footer endRefreshing];
+ // }];
+
+ [[EZHttpUtil sharedManager] getAlarmList:weakSelf.deviceInfo.deviceSerial pageNo:weakSelf.currentIndex++ pageSize:EZMessageListPageSize completion:^(ResponseData * responseData) {
+ NSArray<HDLAlarmInfo *> *alarmList = [NSArray array];
+ if (responseData.success){
+ HDLAlarmInfoData *alarmInfoData = [HDLAlarmInfoData yy_modelWithDictionary:responseData.data];
+ if (alarmInfoData) {
+ if (alarmInfoData.list) {
+ alarmList = alarmInfoData.list;
+ }
+ }
+ }
+
+ [weakSelf.messageList addObjectsFromArray:alarmList];
+
+
+ [weakSelf tableViewDidReload];
+ [weakSelf.tableView.mj_footer endRefreshing];
+
+ if(weakSelf.messageList.count >= weakSelf.totalCount)
+ {
+ weakSelf.tableView.mj_footer.hidden = YES;
+ return;
+ }
+
+
+ }];
+
}];
}
#pragma mark - Action Methods
-- (void)tableViewDidReload:(NSArray *)messageList
+- (void)tableViewDidReload
{
- if(messageList.count == 0)
+ if(self.messageList.count == 0)
{
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.tableView reloadData];
@@ -397,28 +485,28 @@
self.noMessageLabel.frame = CGRectMake((self.tableView.frame.size.width - 100)/2.0, self.noMessage.frame.origin.y + self.noMessage.frame.size.height + 10, 100, 20.0);
return;
}
- if(self.currentIndex == 1)
- {
- [self.sections removeAllObjects];
- [self.tableView.footer endRefreshing];
- self.lastDate = [messageList[0] alarmStartTime];
- self.dateFormatter.dateFormat = @"yyyy-MM-dd";
- NSString *key = [self.dateFormatter stringFromDate:self.lastDate];
- NSDictionary *dict = @{@"index":@0, @"date":key};
- [self.sections addObject:dict];
- }
- for (int i = 0; i < messageList.count; i++) {
- EZAlarmInfo *info = [messageList dd_objectAtIndex:i];
- if(![info.alarmStartTime isSameToDate:self.lastDate])
- {
- NSInteger index = [self.messageList indexOfObject:info];
- self.dateFormatter.dateFormat = @"yyyy-MM-dd";
- NSString *key = [self.dateFormatter stringFromDate:info.alarmStartTime];
- NSDictionary *dict = @{@"index":@(index),@"date":key};
- [self.sections addObject:dict];
- }
- self.lastDate = info.alarmStartTime;
- }
+// if(self.currentIndex == 1)
+// {
+// [self.sections removeAllObjects];
+// [self.tableView.mj_footer endRefreshing];
+// self.lastDate = [messageList[0] getAlarmStartTime];
+// self.dateFormatter.dateFormat = @"yyyy-MM-dd";
+// NSString *key = [self.dateFormatter stringFromDate:self.lastDate];
+// NSDictionary *dict = @{@"index":@0, @"date":key};
+// [self.sections addObject:dict];
+// }
+// for (int i = 0; i < messageList.count; i++) {
+// HDLAlarmInfo *info = [messageList dd_objectAtIndex:i];
+// if(![[info getAlarmStartTime] isSameToDate:self.lastDate])
+// {
+// NSInteger index = [self.messageList indexOfObject:info];
+// self.dateFormatter.dateFormat = @"yyyy-MM-dd";
+// NSString *key = [self.dateFormatter stringFromDate:[info getAlarmStartTime]];
+// NSDictionary *dict = @{@"index":@(index),@"date":key};
+// [self.sections addObject:dict];
+// }
+// self.lastDate = [info getAlarmStartTime];
+// }
[self.tableView reloadData];
}
@@ -431,19 +519,19 @@
[self.navigationController setToolbarHidden:YES animated:YES];
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
self.deleteSelected.enabled = NO;
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
self.readAll.enabled = NO;
[self.selectedMessageArray removeAllObjects];
- self.tableView.header.hidden = NO;
+ self.tableView.mj_header.hidden = NO;
if(self.messageList.count < self.totalCount)
- self.tableView.footer.hidden = NO;
+ self.tableView.mj_footer.hidden = NO;
}else{
self.tableView.allowsMultipleSelectionDuringEditing = YES;
[self.tableView setEditing:YES animated:YES];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(editTableView:)];
[self.navigationController setToolbarHidden:NO animated:YES];
- self.tableView.header.hidden = YES;
- self.tableView.footer.hidden = YES;
+ self.tableView.mj_header.hidden = YES;
+ self.tableView.mj_footer.hidden = YES;
self.selectedAll.enabled = YES;
self.deleteSelected.enabled = NO;
self.readAll.enabled = NO;
@@ -463,19 +551,19 @@
[self.selectedMessageArray addObjectsFromArray:self.messageList];
self.deleteSelected.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"delete", @"鍒犻櫎"),(int)[self.selectedMessageArray count]];
self.deleteSelected.enabled = YES;
- self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"dmessage_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
+ self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"message_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
self.readAll.enabled = YES;
}
else
{
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
[self.selectedMessageArray removeAllObjects];
self.deleteSelected.enabled = NO;
self.readAll.enabled = NO;
}
[self.tableView reloadData];
- self.tableView.footer.hidden = YES;
+ self.tableView.mj_footer.hidden = YES;
}
- (IBAction)deleteMessage:(id)sender
@@ -511,35 +599,57 @@
hud.labelText = NSLocalizedString(@"message_setting", @"姝e湪璁剧疆宸茶锛岃绋嶅��...");
NSMutableArray *alarmIds = [NSMutableArray new];
for (int i = 0; i < self.selectedMessageArray.count; i++) {
- EZAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
- [alarmIds addObject:info.alarmId];
+ HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ [alarmIds addObject:info.ysId];
}
- [EZOPENSDK setAlarmStatus:alarmIds
- alarmStatus:EZMessageStatusRead
- completion:^(NSError *error) {
- if(error)
- {
- hud.labelText = error.localizedDescription;
- hud.mode = MBProgressHUDModeText;
- [hud hide:YES afterDelay:1.2];
- }
- else
- {
- [hud hide:YES];
- }
- if(!error)
- {
- for (int i = 0; i < self.selectedMessageArray.count; i++) {
- EZAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
- info.isRead = YES;
- }
- [self editTableView:self.navigationItem.rightBarButtonItem];
- [self.tableView reloadData];
- [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
- self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"message_title", @"娑堟伅"), (int)count];
- }];
- }
+ // [EZOPENSDK setAlarmStatus:alarmIds
+ // alarmStatus:EZMessageStatusRead
+ // completion:^(NSError *error) {
+ // if(error)
+ // {
+ // hud.labelText = error.localizedDescription;
+ // hud.mode = MBProgressHUDModeText;
+ // [hud hide:YES afterDelay:1.2];
+ // }
+ // else
+ // {
+ // [hud hide:YES];
+ // }
+ // if(!error)
+ // {
+ // for (int i = 0; i < self.selectedMessageArray.count; i++) {
+ // HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ // info.isChecked = YES;
+ // }
+ // [self editTableView:self.navigationItem.rightBarButtonItem];
+ // [self.tableView reloadData];
+ // [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
+ // self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"message_title", @"娑堟伅"), (int)count];
+ // }];
+ // }
+ // }];
+
+ //鏍囪宸茶
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] readAlarmMessage:alarmIds completion:^(ResponseData * responseData) {
+ if(responseData.success){
+ [hud hide:YES];
+ for (int i = 0; i < self.selectedMessageArray.count; i++) {
+ HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ info.isChecked = YES;
+ }
+ [weakSelf editTableView:self.navigationItem.rightBarButtonItem];
+ [weakSelf.tableView reloadData];
+
+ }else{
+ hud.labelText = NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触");
+ hud.mode = MBProgressHUDModeText;
+ [hud hide:YES afterDelay:1.2];
+ }
}];
+
+
+
}
- (NSString *)dateStringWithUserDefine:(NSString *)dateString
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.h b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.h
index b884525..41a08a9 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.h
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.h
@@ -7,13 +7,14 @@
//
#import "MWPhotoBrowser.h"
-#import "EZAlarmInfo.h"
+//#import "EZAlarmInfo.h"
#import "EZDeviceInfo.h"
+#import "HDLAlarmInfo.h"
@interface EZMessagePhotoViewController : MWPhotoBrowser
@property (nonatomic, strong) UIImage *image;
-@property (nonatomic, strong) EZAlarmInfo *info;
+@property (nonatomic, strong) HDLAlarmInfo *info;
@property (nonatomic, strong) EZDeviceInfo *deviceInfo;
@end
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.m
index 5b21b38..74a681d 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/UIViewControllers/EZMessagePhotoViewController.m
@@ -34,8 +34,10 @@
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
- self.timeLabel.text = [formatter stringFromDate:self.info.alarmStartTime];
+ self.timeLabel.text = [formatter stringFromDate:[self.info getAlarmStartTime]];
self.contentLabel.text = [NSString stringWithFormat:@"%@:%@",NSLocalizedString(@"message_from", @"鏉ヨ嚜"),self.info.alarmName];
+
+ [self.recordButton setHidden:YES];
}
- (void)didReceiveMemoryWarning {
@@ -50,11 +52,11 @@
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
- EZAlarmInfo *info = sender;
-
- EZMessagePlaybackViewController *messagePlaybackVC = [segue destinationViewController];
- messagePlaybackVC.info = info;
- messagePlaybackVC.deviceInfo = self.deviceInfo;
+// HDLAlarmInfo *info = sender;
+//
+// EZMessagePlaybackViewController *messagePlaybackVC = [segue destinationViewController];
+// messagePlaybackVC.info = info;
+// messagePlaybackVC.deviceInfo = self.deviceInfo;
}
diff --git a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/ViewController.m b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/ViewController.m
index 510811b..82d242f 100644
--- a/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/ViewController.m
+++ b/Demo/EZOpensdk_iOS_4.15.1_build20201104/Demo/EZOpenSDKDemo/ViewController.m
@@ -56,10 +56,10 @@
// */
// [self performSegueWithIdentifier:@"go2CameraList" sender:nil];
- [EZSDK setHDlAccessToken:@"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiIyYTAwZGRmOTNjMGY0YzlhYjljNjU2M2VhMDJjZjhmMyIsImNvbXBhbnlJZCI6IjAiLCJyb2xlIjoiIiwiaGVhZGVyUHJlZml4IjoiQmVhcmVyICIsInVzZXJBY2NvdW50Ijoid3hyIiwidGVuYW50SWQiOiIyMCIsInVzZXJUeXBlIjoiVVNFUl9DIiwidG9rZW5UeXBlIjoiYWNjZXNzX3Rva2VuIiwidXNlck5hbWUiOiJrYWVkZSIsIm9wZW5BcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzOTIwMzU1NjgyMDQ0MjMxNjkiLCJleHAiOjE2MjU2NjA0NjQsIm5iZiI6MTYyNTY1MzI2NH0.I4YfZQqm1p1SwJQbNWyUEOWXCqpYCWQdmAMOR-xlOMJ0pYFh3_nyjPBiWypTTMgy5nTpj7IqUM1bHwHWGsDEInF4Bl6trxrgOE39Toj-aY1UJcViYhx7e3E3ChrlXptVfKtk3cVEtDlFkMdHdHiJi-6OZox4KOz_AallI8lFIlo" refreshToken:@"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI1ZjdmOGFkY2I3MGU0NzYwOWE0NTcxOTZmOTAyOTY1OSIsImNvbXBhbnlJZCI6IjAiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidGVuYW50SWQiOiIyMCIsInRva2VuVHlwZSI6InJlZnJlc2hfdG9rZW4iLCJvcGVuQXBwbGljYXRpb25JZCI6IjAiLCJ1c2VySWQiOiIxMzkyMDM1NTY4MjA0NDIzMTY5IiwiZXhwIjoxNjI2MjU4MDY0LCJuYmYiOjE2MjU2NTMyNjR9.DB1pGaM6xtpQiP_KvaAHbWDZtxjLXZwJCgFfrp_XA0bnV8wMC8SE7K_uoP79c97WGqcmpHJVY-x8NCVJneGpIKN2oSCvX0Sn0uAttqni4zbVjmErC2AmpONJwWY27GYjHk4LFri03p38D-5zlULFo3ITtN3Il2aJOjVOpyNCcuI"];
+ [[EZSDK sharedInstance] setHDlAccessToken:@"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiIyYTAwZGRmOTNjMGY0YzlhYjljNjU2M2VhMDJjZjhmMyIsImNvbXBhbnlJZCI6IjAiLCJyb2xlIjoiIiwiaGVhZGVyUHJlZml4IjoiQmVhcmVyICIsInVzZXJBY2NvdW50Ijoid3hyIiwidGVuYW50SWQiOiIyMCIsInVzZXJUeXBlIjoiVVNFUl9DIiwidG9rZW5UeXBlIjoiYWNjZXNzX3Rva2VuIiwidXNlck5hbWUiOiJrYWVkZSIsIm9wZW5BcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzOTIwMzU1NjgyMDQ0MjMxNjkiLCJleHAiOjE2MjU2NjA0NjQsIm5iZiI6MTYyNTY1MzI2NH0.I4YfZQqm1p1SwJQbNWyUEOWXCqpYCWQdmAMOR-xlOMJ0pYFh3_nyjPBiWypTTMgy5nTpj7IqUM1bHwHWGsDEInF4Bl6trxrgOE39Toj-aY1UJcViYhx7e3E3ChrlXptVfKtk3cVEtDlFkMdHdHiJi-6OZox4KOz_AallI8lFIlo" refreshToken:@"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI1ZjdmOGFkY2I3MGU0NzYwOWE0NTcxOTZmOTAyOTY1OSIsImNvbXBhbnlJZCI6IjAiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidGVuYW50SWQiOiIyMCIsInRva2VuVHlwZSI6InJlZnJlc2hfdG9rZW4iLCJvcGVuQXBwbGljYXRpb25JZCI6IjAiLCJ1c2VySWQiOiIxMzkyMDM1NTY4MjA0NDIzMTY5IiwiZXhwIjoxNjI2MjU4MDY0LCJuYmYiOjE2MjU2NTMyNjR9.DB1pGaM6xtpQiP_KvaAHbWDZtxjLXZwJCgFfrp_XA0bnV8wMC8SE7K_uoP79c97WGqcmpHJVY-x8NCVJneGpIKN2oSCvX0Sn0uAttqni4zbVjmErC2AmpONJwWY27GYjHk4LFri03p38D-5zlULFo3ITtN3Il2aJOjVOpyNCcuI"];
- [EZSDK setRequestHttpsHostAndPlatform:@"https://test-gz.hdlcontrol.com" platform:1 homeId:@"1396717478877241345"];
+ [[EZSDK sharedInstance] setRequestHttpsHostAndPlatform:@"https://test-gz.hdlcontrol.com" platform:1 homeId:@"1396717478877241345"];
@@ -68,7 +68,7 @@
[EZHttpUtil.sharedManager getChildToken:^(NSString *accessToken) {
[hud hide:YES];
if(accessToken != NULL && ![accessToken isEqual:@""]){
- [[GlobalKit shareKit] setAccessToken:accessToken];
+ [[EZSDK sharedInstance] setEZAccessToken:accessToken];
/**
* 涓嬮潰浠g爜鍔熻兘涓庝互涓婄殑娉ㄩ噴鏂规硶鐩稿悓
*/
@@ -82,11 +82,13 @@
- (IBAction)logout:(id)sender
{
+
+ return;
// [[GlobalKit shareKit] setAccessToken:@"ra.a5bfkhhx7ycscsj41if7l0cf9ytfhv5q-9keuxvphmn-1fvjt6p-jugtyy8sr"];
- [EZSDK setHDlAccessToken:@"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI2Zjk1ZTEwZWIwNjA0ZjNiYTdmNTc0ZGUyM2QxYmNmZiIsImNvbXBhbnlJZCI6IjAiLCJyb2xlIjoiIiwiaGVhZGVyUHJlZml4IjoiQmVhcmVyICIsInVzZXJBY2NvdW50Ijoid3hyIiwidGVuYW50SWQiOiIyMCIsInVzZXJUeXBlIjoiVVNFUl9DIiwidG9rZW5UeXBlIjoiYWNjZXNzX3Rva2VuIiwidXNlck5hbWUiOiJrYWVkZSIsIm9wZW5BcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzOTIwMzU1NjgyMDQ0MjMxNjkiLCJleHAiOjE2MjU3MTY3NjAsIm5iZiI6MTYyNTcwOTU2MH0.C6w0mb0YiNhqQfLPscXiNVh_DOsbza_fubUbn_T-W04L3R7egi7-Gv_iifdfvh4XTU10rEdVl6FLXKxt3JJvo2x_sjBQLkWRQINMVl1qLOz9cMew79_aykXOwl8mdroYs9SKBd90qyM2lZaA91sD4H0HMVVyc_D2TEcG4XJzSBM" refreshToken:@"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI1M2FlMzg3NDhmNjU0MzE1OTM0MTQ0OWQyYmQ0NjE0NiIsImNvbXBhbnlJZCI6IjAiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidGVuYW50SWQiOiIyMCIsInRva2VuVHlwZSI6InJlZnJlc2hfdG9rZW4iLCJvcGVuQXBwbGljYXRpb25JZCI6IjAiLCJ1c2VySWQiOiIxMzkyMDM1NTY4MjA0NDIzMTY5IiwiZXhwIjoxNjI2MzE0MzYwLCJuYmYiOjE2MjU3MDk1NjB9.AZlG8jO8lFDcj5dfoY0rZsDfglGdeyLuSImzMw1enHWfAacjkIof0vXQ_qJG9Q-6qxyXXbPu_xrd0DhkGNFeHJ4WFL0iiYgDP51sJuUdKrQklUCSC6T7ZjIW0GSVmvOW4GCw0s6L51bVT_rkdrusVD4rDnOtJwWqXTUfyNanmlk"];
+ [[EZSDK sharedInstance] setHDlAccessToken:@"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI2Zjk1ZTEwZWIwNjA0ZjNiYTdmNTc0ZGUyM2QxYmNmZiIsImNvbXBhbnlJZCI6IjAiLCJyb2xlIjoiIiwiaGVhZGVyUHJlZml4IjoiQmVhcmVyICIsInVzZXJBY2NvdW50Ijoid3hyIiwidGVuYW50SWQiOiIyMCIsInVzZXJUeXBlIjoiVVNFUl9DIiwidG9rZW5UeXBlIjoiYWNjZXNzX3Rva2VuIiwidXNlck5hbWUiOiJrYWVkZSIsIm9wZW5BcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzOTIwMzU1NjgyMDQ0MjMxNjkiLCJleHAiOjE2MjU3MTY3NjAsIm5iZiI6MTYyNTcwOTU2MH0.C6w0mb0YiNhqQfLPscXiNVh_DOsbza_fubUbn_T-W04L3R7egi7-Gv_iifdfvh4XTU10rEdVl6FLXKxt3JJvo2x_sjBQLkWRQINMVl1qLOz9cMew79_aykXOwl8mdroYs9SKBd90qyM2lZaA91sD4H0HMVVyc_D2TEcG4XJzSBM" refreshToken:@"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI1M2FlMzg3NDhmNjU0MzE1OTM0MTQ0OWQyYmQ0NjE0NiIsImNvbXBhbnlJZCI6IjAiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidGVuYW50SWQiOiIyMCIsInRva2VuVHlwZSI6InJlZnJlc2hfdG9rZW4iLCJvcGVuQXBwbGljYXRpb25JZCI6IjAiLCJ1c2VySWQiOiIxMzkyMDM1NTY4MjA0NDIzMTY5IiwiZXhwIjoxNjI2MzE0MzYwLCJuYmYiOjE2MjU3MDk1NjB9.AZlG8jO8lFDcj5dfoY0rZsDfglGdeyLuSImzMw1enHWfAacjkIof0vXQ_qJG9Q-6qxyXXbPu_xrd0DhkGNFeHJ4WFL0iiYgDP51sJuUdKrQklUCSC6T7ZjIW0GSVmvOW4GCw0s6L51bVT_rkdrusVD4rDnOtJwWqXTUfyNanmlk"];
- [EZSDK setRequestHttpsHostAndPlatform:@"https://test-gz.hdlcontrol.com" platform:1 homeId:@"1396717478877241345"];
+ [[EZSDK sharedInstance] setRequestHttpsHostAndPlatform:@"https://test-gz.hdlcontrol.com" platform:1 homeId:@"1396717478877241345"];
__weak MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
@@ -95,10 +97,14 @@
[hud hide:YES];
if(accessToken != NULL && ![accessToken isEqual:@""]){
NSLog(@"accessToken HDL:%@",accessToken);
- [[GlobalKit shareKit] setAccessToken:accessToken];
+ [[EZSDK sharedInstance] setEZAccessToken:accessToken];
- [EZSDK PlayWithDeviceSerial:@"F44133728"];
-
+// [[EZSDK sharedInstance] PlayWithDeviceSerial:@"F44133728"];
+
+ EZAlarmInfo *info = [[EZAlarmInfo alloc] init];
+ info.alarmName = @"浜轰綋妫�娴�";
+ info.alarmPicUrl = @"https://i.ys7.com/streamer/alarm/url/get?fileId=20210707204930-F41014762-1-00000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&ct=1&lc=90&bn=1_hikalarm";
+ [[EZSDK sharedInstance] goToEZMessagePhotoVC:info];
}
}];
@@ -118,7 +124,7 @@
return;
}
if (deviceInfo) {
- [EZSDK Play:deviceInfo];
+ [[EZSDK sharedInstance] Play:deviceInfo];
}
}];
diff --git a/EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs b/EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs
index 0046eca..9f04503 100644
--- a/EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs
+++ b/EZSDK.IOS/EZSDK.IOS/ApiDefinition.cs
@@ -4,145 +4,140 @@
namespace EZSDK.IOS
{
- // @interface EZDeviceInfo : NSObject
- [BaseType(typeof(NSObject))]
- interface EZDeviceInfo
- {
- // @property (nonatomic, strong) NSArray * cameraInfo;
- [Export("cameraInfo", ArgumentSemantic.Strong)]
- //[Verify(StronglyTypedNSArray)]
- NSArray CameraInfo { get; set; }
+ // @interface EZDeviceInfo : NSObject
+ [BaseType(typeof(NSObject))]
+ interface EZDeviceInfo
+ {
+ // @property (nonatomic, strong) NSArray * cameraInfo;
+ [Export("cameraInfo", ArgumentSemantic.Strong)]
+ //[Verify(StronglyTypedNSArray)]
+ NSArray CameraInfo { get; set; }
- // @property (nonatomic) NSInteger cameraNum;
- [Export("cameraNum")]
- int CameraNum { get; set; }
+ // @property (nonatomic) NSInteger cameraNum;
+ [Export("cameraNum")]
+ int CameraNum { get; set; }
- // @property (nonatomic) NSInteger defence;
- [Export("defence")]
- int Defence { get; set; }
+ // @property (nonatomic) NSInteger defence;
+ [Export("defence")]
+ int Defence { get; set; }
- // @property (nonatomic) NSInteger detectorNum;
- [Export("detectorNum")]
- int DetectorNum { get; set; }
+ // @property (nonatomic) NSInteger detectorNum;
+ [Export("detectorNum")]
+ int DetectorNum { get; set; }
- // @property (nonatomic, strong) NSArray * detectorInfo;
- [Export("detectorInfo", ArgumentSemantic.Strong)]
- //[Verify(StronglyTypedNSArray)]
- NSArray DetectorInfo { get; set; }
+ // @property (nonatomic, strong) NSArray * detectorInfo;
+ [Export("detectorInfo", ArgumentSemantic.Strong)]
+ //[Verify(StronglyTypedNSArray)]
+ NSArray DetectorInfo { get; set; }
- // @property (copy, nonatomic) NSString * deviceCover;
- [Export("deviceCover")]
- string DeviceCover { get; set; }
+ // @property (copy, nonatomic) NSString * deviceCover;
+ [Export("deviceCover")]
+ string DeviceCover { get; set; }
- // @property (copy, nonatomic) NSString * deviceName;
- [Export("deviceName")]
- string DeviceName { get; set; }
+ // @property (copy, nonatomic) NSString * deviceName;
+ [Export("deviceName")]
+ string DeviceName { get; set; }
- // @property (copy, nonatomic) NSString * deviceSerial;
- [Export("deviceSerial")]
- string DeviceSerial { get; set; }
+ // @property (copy, nonatomic) NSString * deviceSerial;
+ [Export("deviceSerial")]
+ string DeviceSerial { get; set; }
- // @property (copy, nonatomic) NSString * deviceType;
- [Export("deviceType")]
- string DeviceType { get; set; }
+ // @property (copy, nonatomic) NSString * deviceType;
+ [Export("deviceType")]
+ string DeviceType { get; set; }
- // @property (copy, nonatomic) NSString * deviceVersion;
- [Export("deviceVersion")]
- string DeviceVersion { get; set; }
+ // @property (copy, nonatomic) NSString * deviceVersion;
+ [Export("deviceVersion")]
+ string DeviceVersion { get; set; }
- // @property (nonatomic) BOOL isEncrypt;
- [Export("isEncrypt")]
- bool IsEncrypt { get; set; }
+ // @property (nonatomic) BOOL isEncrypt;
+ [Export("isEncrypt")]
+ bool IsEncrypt { get; set; }
- // @property (nonatomic) NSInteger status;
- [Export("status")]
- int Status { get; set; }
+ // @property (nonatomic) NSInteger status;
+ [Export("status")]
+ nint Status { get; set; }
- // @property (nonatomic) NSInteger isSupportTalk;
- [Export("isSupportTalk")]
- int IsSupportTalk { get; set; }
+ // @property (nonatomic) NSInteger isSupportTalk;
+ [Export("isSupportTalk")]
+ int IsSupportTalk { get; set; }
- // @property (nonatomic) BOOL isSupportPTZ;
- [Export("isSupportPTZ")]
- bool IsSupportPTZ { get; set; }
+ // @property (nonatomic) BOOL isSupportPTZ;
+ [Export("isSupportPTZ")]
+ bool IsSupportPTZ { get; set; }
- // @property (nonatomic) BOOL isSupportZoom;
- [Export("isSupportZoom")]
- bool IsSupportZoom { get; set; }
+ // @property (nonatomic) BOOL isSupportZoom;
+ [Export("isSupportZoom")]
+ bool IsSupportZoom { get; set; }
- // @property (nonatomic) BOOL isSupportAudioOnOff;
- [Export("isSupportAudioOnOff")]
- bool IsSupportAudioOnOff { get; set; }
+ // @property (nonatomic) BOOL isSupportAudioOnOff;
+ [Export("isSupportAudioOnOff")]
+ bool IsSupportAudioOnOff { get; set; }
- // @property (nonatomic) BOOL isSupportMirrorCenter;
- [Export("isSupportMirrorCenter")]
- bool IsSupportMirrorCenter { get; set; }
+ // @property (nonatomic) BOOL isSupportMirrorCenter;
+ [Export("isSupportMirrorCenter")]
+ bool IsSupportMirrorCenter { get; set; }
- // @property (nonatomic) BOOL isSupportSoundWave;
- [Export("isSupportSoundWave")]
- bool IsSupportSoundWave { get; set; }
+ // @property (nonatomic) BOOL isSupportSoundWave;
+ [Export("isSupportSoundWave")]
+ bool IsSupportSoundWave { get; set; }
- // @property (copy, nonatomic) NSString * category;
- [Export("category")]
- string Category { get; set; }
+ // @property (copy, nonatomic) NSString * category;
+ [Export("category")]
+ string Category { get; set; }
- // @property (nonatomic, strong) NSDate * addTime;
- [Export("addTime", ArgumentSemantic.Strong)]
- NSDate AddTime { get; set; }
- }
+ // @property (nonatomic, strong) NSDate * addTime;
+ [Export("addTime", ArgumentSemantic.Strong)]
+ NSDate AddTime { get; set; }
+ }
- // @interface EZSDK : NSObject
- [BaseType(typeof(NSObject))]
- interface EZSDK
- {
- // +(BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey;
- [Static]
- [Export("initLibWithAppKey:globalAppKey:")]
- bool InitLibWithAppKey(string appKey, string globalAppKey);
+ // @interface EZSDK : NSObject
+ [BaseType(typeof(NSObject))]
+ interface EZSDK
+ {
+ // +(instancetype)sharedInstance;
+ [Static]
+ [Export("sharedInstance")]
+ EZSDK SharedInstance();
- // +(void)setEZAccessToken:(NSString *)accessToken;
- [Static]
- [Export("setEZAccessToken:")]
- void SetEZAccessToken(string accessToken);
+ // -(BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey;
+ [Export("initLibWithAppKey:globalAppKey:")]
+ bool InitLibWithAppKey(string appKey, string globalAppKey);
- // +(void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *)refreshToken;
- [Static]
- [Export("setHDlAccessToken:refreshToken:")]
- void SetHDlAccessToken(string accessToken, string refreshToken);
+ // -(void)setEZAccessToken:(NSString *)accessToken;
+ [Export("setEZAccessToken:")]
+ void SetEZAccessToken(string accessToken);
- // +(void)setRequestHttpsHostAndPlatform:(NSString *)requestHttpsHost platform:(int)platform homeId:(NSString *)homeId;
- [Static]
- [Export("setRequestHttpsHostAndPlatform:platform:homeId:")]
- void SetRequestHttpsHostAndPlatform(string requestHttpsHost, int platform, string homeId);
+ // -(void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *)refreshToken;
+ [Export("setHDlAccessToken:refreshToken:")]
+ void SetHDlAccessToken(string accessToken, string refreshToken);
- // +(void)go2EZvizMonitor;
- [Static]
- [Export("go2EZvizMonitor")]
- void Go2EZvizMonitor();
+ // -(void)setRequestHttpsHostAndPlatform:(NSString *)requestHttpsHost platform:(int)platform homeId:(NSString *)homeId;
+ [Export("setRequestHttpsHostAndPlatform:platform:homeId:")]
+ void SetRequestHttpsHostAndPlatform(string requestHttpsHost, int platform, string homeId);
- // +(void)addEzvizMonitor;
- [Static]
- [Export("addEzvizMonitor")]
- void AddEzvizMonitor();
+ // -(void)go2EZvizMonitor;
+ [Export("go2EZvizMonitor")]
+ void Go2EZvizMonitor();
- // +(void)Play:(EZDeviceInfo *)deviceInfo;
- [Static]
- [Export("Play:")]
- void Play(EZDeviceInfo deviceInfo);
+ // -(void)addEzvizMonitor;
+ [Export("addEzvizMonitor")]
+ void AddEzvizMonitor();
- // +(void)PlayWithDeviceSerial:(NSString *)deviceSerial;
- [Static]
- [Export("PlayWithDeviceSerial:")]
- void PlayWithDeviceSerial(string deviceSerial);
+ // -(void)Play:(EZDeviceInfo *)deviceInfo;
+ [Export("Play:")]
+ void Play(EZDeviceInfo deviceInfo);
- // +(void)setting:(EZDeviceInfo *)deviceInfo;
- [Static]
- [Export("setting:")]
- void Setting(EZDeviceInfo deviceInfo);
+ // -(void)PlayWithDeviceSerial:(NSString *)deviceSerial;
+ [Export("PlayWithDeviceSerial:")]
+ void PlayWithDeviceSerial(string deviceSerial);
- // +(void)playBackVideo:(EZDeviceInfo *)deviceInfo;
- [Static]
- [Export("playBackVideo:")]
- void PlayBackVideo(EZDeviceInfo deviceInfo);
- }
+ // -(void)setting:(EZDeviceInfo *)deviceInfo;
+ [Export("setting:")]
+ void Setting(EZDeviceInfo deviceInfo);
+
+ // -(void)playBackVideo:(EZDeviceInfo *)deviceInfo;
+ [Export("playBackVideo:")]
+ void PlayBackVideo(EZDeviceInfo deviceInfo);
+ }
}
diff --git a/EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a b/EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a
index dcd6b46..fcf41a2 100644
--- a/EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a
+++ b/EZSDK.IOS/EZSDK.IOS/Library/libEZSDK.a
Binary files differ
diff --git a/EZSDK.IOS/EZSDK.IOS/Properties/AssemblyInfo.cs b/EZSDK.IOS/EZSDK.IOS/Properties/AssemblyInfo.cs
index 7cbedfc..2f581db 100644
--- a/EZSDK.IOS/EZSDK.IOS/Properties/AssemblyInfo.cs
+++ b/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.4.2")]
+[assembly: AssemblyVersion("1.4.3")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
diff --git a/EZSDK/EZSDK.xcodeproj/project.pbxproj b/EZSDK/EZSDK.xcodeproj/project.pbxproj
index 8711570..cded2a4 100644
--- a/EZSDK/EZSDK.xcodeproj/project.pbxproj
+++ b/EZSDK/EZSDK.xcodeproj/project.pbxproj
@@ -7,6 +7,9 @@
objects = {
/* Begin PBXBuildFile section */
+ B95AB87E26984D49007BC8D7 /* HDLAlarmInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = B95AB87D26984D49007BC8D7 /* HDLAlarmInfo.m */; };
+ B95AB88726984DD5007BC8D7 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = B95AB88426984DD5007BC8D7 /* NSObject+YYModel.m */; };
+ B95AB88826984DD5007BC8D7 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = B95AB88526984DD5007BC8D7 /* YYClassInfo.m */; };
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 */; };
@@ -159,6 +162,13 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ B95AB87C26984D49007BC8D7 /* HDLAlarmInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLAlarmInfo.h; sourceTree = "<group>"; };
+ B95AB87D26984D49007BC8D7 /* HDLAlarmInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLAlarmInfo.m; sourceTree = "<group>"; };
+ B95AB88226984DD5007BC8D7 /* YYClassInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYClassInfo.h; sourceTree = "<group>"; };
+ B95AB88326984DD5007BC8D7 /* YYModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYModel.h; sourceTree = "<group>"; };
+ B95AB88426984DD5007BC8D7 /* NSObject+YYModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+YYModel.m"; sourceTree = "<group>"; };
+ B95AB88526984DD5007BC8D7 /* YYClassInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYClassInfo.m; sourceTree = "<group>"; };
+ B95AB88626984DD5007BC8D7 /* NSObject+YYModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+YYModel.h"; sourceTree = "<group>"; };
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>"; };
@@ -576,6 +586,18 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ B95AB88126984DD5007BC8D7 /* YYModel */ = {
+ isa = PBXGroup;
+ children = (
+ B95AB88226984DD5007BC8D7 /* YYClassInfo.h */,
+ B95AB88326984DD5007BC8D7 /* YYModel.h */,
+ B95AB88426984DD5007BC8D7 /* NSObject+YYModel.m */,
+ B95AB88526984DD5007BC8D7 /* YYClassInfo.m */,
+ B95AB88626984DD5007BC8D7 /* NSObject+YYModel.h */,
+ );
+ path = YYModel;
+ sourceTree = "<group>";
+ };
B99F57BA262D85CF0049A308 /* include */ = {
isa = PBXGroup;
children = (
@@ -675,6 +697,7 @@
B9BC97D425C0FFB600C024FE /* Venders */ = {
isa = PBXGroup;
children = (
+ B95AB88126984DD5007BC8D7 /* YYModel */,
B9EA4E5325C7E805000FFDA2 /* MJRefresh */,
B9BC97D525C0FFB600C024FE /* UITableView-FDTemplateLayoutCell */,
B9BC97DE25C0FFB600C024FE /* DACircularProgress */,
@@ -1147,6 +1170,8 @@
B9BC996F25C0FFBB00C024FE /* Global */ = {
isa = PBXGroup;
children = (
+ B95AB87C26984D49007BC8D7 /* HDLAlarmInfo.h */,
+ B95AB87D26984D49007BC8D7 /* HDLAlarmInfo.m */,
B9BC997125C0FFBB00C024FE /* GlobalKit.h */,
B9BC997025C0FFBB00C024FE /* GlobalKit.m */,
B965BE0125EE0B0D00E58AFB /* EZHttpUtil.h */,
@@ -1340,6 +1365,7 @@
B9BC99B425C0FFBD00C024FE /* UIView+Toast.m in Sources */,
B9BC99C925C0FFBD00C024FE /* UISegmentedControl+DDKit.m in Sources */,
B9BC99DB25C0FFBD00C024FE /* AFHTTPSessionManager.m in Sources */,
+ B95AB87E26984D49007BC8D7 /* HDLAlarmInfo.m in Sources */,
B9BC99D325C0FFBD00C024FE /* UIAlertView+AFNetworking.m in Sources */,
B9BC99EA25C0FFBD00C024FE /* UIImage+GIF.m in Sources */,
B9BC99E825C0FFBD00C024FE /* UIImageView+HighlightedWebCache.m in Sources */,
@@ -1459,6 +1485,8 @@
B9BC99A125C0FFBD00C024FE /* DDCollectionViewFlowLayout.m in Sources */,
B9BC9A1E25C0FFBD00C024FE /* EZWifiInfoViewController.m in Sources */,
B9BC9A1925C0FFBD00C024FE /* EZAPWiFiConfigViewController.m in Sources */,
+ B95AB88826984DD5007BC8D7 /* YYClassInfo.m in Sources */,
+ B95AB88726984DD5007BC8D7 /* NSObject+YYModel.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/EZSDK/EZSDK/EZ/Global/EZHttpUtil.h b/EZSDK/EZSDK/EZ/Global/EZHttpUtil.h
index 448a1db..7a659f3 100644
--- a/EZSDK/EZSDK/EZ/Global/EZHttpUtil.h
+++ b/EZSDK/EZSDK/EZ/Global/EZHttpUtil.h
@@ -48,6 +48,24 @@
*/
- (void)deleteDeviceByHDL:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion;
+/**
+ * 鏍规嵁璁惧搴忓垪鍙疯幏鍙栧憡璀︿俊鎭垪琛�
+ */
+- (void)getAlarmList:(NSString *)deviceSerial
+ pageNo:(NSInteger)pageNo
+ pageSize:(NSInteger)pageSize
+ completion:(void (^)(ResponseData *responseData))completion;
+/**
+ * 鎵归噺鍒犻櫎鎶ヨ璁板綍
+ */
+- (void)deleteAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion;
+
+/**
+ * 鎵归噺鏍囪鎶ヨ璁板綍宸茶
+ */
+- (void)readAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion;
@end
diff --git a/EZSDK/EZSDK/EZ/Global/EZHttpUtil.m b/EZSDK/EZSDK/EZ/Global/EZHttpUtil.m
index 6c2236e..d87504f 100644
--- a/EZSDK/EZSDK/EZ/Global/EZHttpUtil.m
+++ b/EZSDK/EZSDK/EZ/Global/EZHttpUtil.m
@@ -10,6 +10,7 @@
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#import "AFNetworking.h"
+#import "YYModel.h"
#define TestRequestHttpsHost @"https://test-gz.hdlcontrol.com"
#pragma mark API
@@ -18,6 +19,9 @@
#define API_POST_EZ_ChildDelDevice @"/home-wisdom/platform/yingshi/child/deleteDevice"
#define API_POST_EZ_RefreshToken @"/smart-footstone/member/oauth/login"
+#define API_POST_EZ_GetAlarmList @"/home-wisdom/platform/yingshi/alarm/records"//鑾峰彇鎶ヨ娑堟伅
+#define API_POST_EZ_DeleteAlarmMes @"/home-wisdom/platform/yingshi/alarm/delete"//鍒犻櫎鎶ヨ娑堟伅
+#define API_POST_EZ_ReadAlarmMes @"/home-wisdom/platform/yingshi/alarm/updateChecked"//鏍囪鎶ヨ娑堟伅宸茶
#pragma mark APP_KEY
#define APP_KEY @"HDL-HOME-APP-TEST"
@@ -126,6 +130,70 @@
}
+/**
+ * 鏍规嵁璁惧搴忓垪鍙疯幏鍙栧憡璀︿俊鎭垪琛�
+ */
+- (void)getAlarmList:(NSString *)deviceSerial
+ pageNo:(NSInteger)pageNo
+ pageSize:(NSInteger)pageSize
+ completion:(void (^)(ResponseData *responseData))completion{
+
+ //1.璁剧疆璇锋眰鍙傛暟
+ NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+ [parameters setValue:deviceSerial forKey:@"deviceSerial"];
+ [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"];
+ [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageSize] forKey:@"pageSize"];
+ [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageNo] forKey:@"pageNo"];
+
+ parameters = [self GetSignRequestDictionary:parameters];
+ NSLog(@"HDLpageNo:%ld",(long)pageNo);
+ [self requestHttpsPost:API_POST_EZ_GetAlarmList parameters:parameters completion:^(ResponseData *responseData) {
+ if (completion) {
+ completion (responseData);
+ }
+ }];
+}
+
+/**
+ * 鎵归噺鍒犻櫎鎶ヨ璁板綍
+ */
+- (void)deleteAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion{
+
+ //1.璁剧疆璇锋眰鍙傛暟
+ NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+ [parameters setValue:[alarmIds yy_modelToJSONObject] forKey:@"alarmIds"];
+
+ parameters = [self GetSignRequestDictionary:parameters];
+
+ [self requestHttpsPost:API_POST_EZ_DeleteAlarmMes parameters:parameters completion:^(ResponseData *responseData) {
+ if (completion) {
+ completion (responseData);
+ }
+ }];
+}
+
+
+/**
+ * 鎵归噺鏍囪鎶ヨ璁板綍宸茶
+ */
+- (void)readAlarmMessage:(NSArray *)alarmIds
+ completion:(void (^)(ResponseData *responseData))completion{
+
+ //1.璁剧疆璇锋眰鍙傛暟
+ NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
+ [parameters setValue:@"1" forKey:@"isChecked"];
+ [parameters setValue:[alarmIds yy_modelToJSONObject] forKey:@"alarmIds"];
+
+ parameters = [self GetSignRequestDictionary:parameters];
+
+ [self requestHttpsPost:API_POST_EZ_ReadAlarmMes parameters:parameters completion:^(ResponseData *responseData) {
+ if (completion) {
+ completion (responseData);
+ }
+ }];
+}
+
/// 鍒锋柊token
/// @param block 缁撴灉
@@ -143,7 +211,7 @@
if (block) {
if (responseData) {
if(responseData.success){
- [EZSDK setHDlAccessToken:
+ [[EZSDK sharedInstance] setHDlAccessToken:
[NSString stringWithFormat:@"%@%@",responseData.data[@"headerPrefix"], responseData.data[@"accessToken"]]
refreshToken:responseData.data[@"refreshToken"]];
diff --git a/EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.h b/EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.h
new file mode 100644
index 0000000..e03b208
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.h
@@ -0,0 +1,56 @@
+//
+// HDLAlarmInfo.h
+// EZOpenSDKDemo
+//
+// Created by 闄堝槈涔� on 2021/7/9.
+// Copyright 漏 2021 hikvision. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HDLAlarmInfo : NSObject
+
+/// 涓婚敭ID
+@property (nonatomic, copy) NSString *ysId;
+/// 鍛婅ID
+@property (nonatomic, copy) NSString *alarmId;
+/// 閫氶亾鍙�
+@property (nonatomic, assign) NSInteger channelNo;
+/// 璁惧搴忓垪鍙�
+@property (nonatomic, copy) NSString *deviceSerial;
+/// 鍛婅鍚嶇О
+@property (nonatomic, copy) NSString *alarmName;
+/// 鍛婅鍥剧墖
+@property (nonatomic, copy) NSString *alarmPicUrl;
+/// 鍛婅寮�濮嬫椂闂�
+@property (nonatomic, strong) NSDate *alarmTime;
+/// 浣忓畢Id
+@property (nonatomic, copy) NSString *homeId;
+/// 鍛婅绫诲瀷
+@property (nonatomic, copy) NSString *alarmType;
+/// 鏄惁宸茶
+@property (nonatomic, assign) NSInteger isChecked;
+/// 鏄惁鍔犲瘑
+@property (nonatomic, assign) NSInteger isEncrypt;
+//@property (nonatomic, assign) NSInteger deleted;
+//@property (nonatomic, copy) NSString *tenantID;
+@property (nonatomic, copy) NSString *createTime;
+//@property (nonatomic, copy) NSString *modifyTime;
+//@property (nonatomic, copy) NSString *region;
+//@property (nonatomic, copy) NSString *identifier;
+-(NSDate *)getAlarmStartTime;
+@end
+
+@interface HDLAlarmInfoData : NSObject
+@property (nonatomic, copy) NSArray<HDLAlarmInfo *> *list;
+@property (nonatomic, assign) NSInteger totalCount;
+@property (nonatomic, assign) NSInteger totalPage;
+@property (nonatomic, assign) NSInteger pageNo;
+@property (nonatomic, assign) NSInteger pageSize;
+@end
+
+
+
+NS_ASSUME_NONNULL_END
diff --git a/EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.m b/EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.m
new file mode 100644
index 0000000..676b81b
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Global/HDLAlarmInfo.m
@@ -0,0 +1,25 @@
+//
+// HDLAlarmInfo.m
+// EZOpenSDKDemo
+//
+// Created by 闄堝槈涔� on 2021/7/9.
+// Copyright 漏 2021 hikvision. All rights reserved.
+//
+
+#import "HDLAlarmInfo.h"
+
+@implementation HDLAlarmInfo
+
+-(NSDate *)getAlarmStartTime{
+ NSTimeInterval time = [_createTime doubleValue];
+// return [NSDate dateWithTimeIntervalSince1970:time];;
+ return [NSDate dateWithTimeIntervalSince1970:time/1000];
+}
+
+@end
+
+@implementation HDLAlarmInfoData
++ (NSDictionary *)modelContainerPropertyGenericClass {
+ return @{@"list" : [HDLAlarmInfo class]};
+}
+@end
diff --git a/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.h b/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.h
index 3a2f630..b8acfc7 100644
--- a/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.h
+++ b/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.h
@@ -7,7 +7,7 @@
//
#import <UIKit/UIKit.h>
-#import "EZAlarmInfo.h"
+#import "HDLAlarmInfo.h"
@interface MessageListCell : UITableViewCell
@@ -18,6 +18,6 @@
@property (nonatomic, weak) IBOutlet UIImageView *readStatusIcon;
@property (nonatomic, copy) NSString *deviceSerial;
-- (void)setAlarmInfo:(EZAlarmInfo *)info;
+- (void)setAlarmInfo:(HDLAlarmInfo *)info;
@end
diff --git a/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.m b/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.m
index 1709c69..9c4d171 100644
--- a/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.m
+++ b/EZSDK/EZSDK/EZ/TableViewCells/MessageListCell.m
@@ -9,7 +9,7 @@
#import "MessageListCell.h"
#import "UIImageView+EzvizOpenSDK.h"
#import "UIImageView+AFNetworking.h"
-
+#import "HDLAlarmInfo.h"
#import "DDKit.h"
static dispatch_semaphore_t ezviz_sema; //鍏ㄥ眬淇″彿閲�
@@ -55,13 +55,13 @@
dispatch_semaphore_signal(ezviz_sema);
}
-- (void)setAlarmInfo:(EZAlarmInfo *)info
+- (void)setAlarmInfo:(HDLAlarmInfo *)info
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"HH:mm:ss";
- self.timeLabel.text = [formatter stringFromDate:info.alarmStartTime];
+ self.timeLabel.text = [formatter stringFromDate:[info getAlarmStartTime]];
self.readStatusIcon.hidden = NO;
- if(info.isRead)
+ if(info.isChecked)
{
self.readStatusIcon.hidden = YES;
}
diff --git a/EZSDK/EZSDK/EZ/UIViewControllers/EZMessageListViewController.m b/EZSDK/EZSDK/EZ/UIViewControllers/EZMessageListViewController.m
index 74a44d1..0dcb0bd 100644
--- a/EZSDK/EZSDK/EZ/UIViewControllers/EZMessageListViewController.m
+++ b/EZSDK/EZSDK/EZ/UIViewControllers/EZMessageListViewController.m
@@ -15,6 +15,8 @@
#import "MBProgressHUD.h"
#import "EZMessagePhotoViewController.h"
#import "NSDate-Utilities.h"
+#import "HDLAlarmInfo.h"
+#import "YYModel.h"
#define EZMessageListPageSize 10
@@ -31,7 +33,7 @@
@property (nonatomic) NSInteger currentIndex;
@property (nonatomic, strong) NSMutableArray *messageList;
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
-@property (nonatomic, strong) NSMutableArray *sections;
+//@property (nonatomic, strong) NSMutableArray *sections;
@property (nonatomic) NSInteger lastIndex;
@property (nonatomic, weak) IBOutlet UIImageView *noMessage;
@property (nonatomic, weak) IBOutlet UILabel *noMessageLabel;
@@ -59,16 +61,16 @@
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
self.title = NSLocalizedString(@"dmessage_title", @"娑堟伅");
- [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
- self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
- }];
+ // [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
+ // self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
+ // }];
- if(!_messageList)
- _messageList = [NSMutableArray new];
+ if(!self.messageList)
+ self.messageList = [NSMutableArray new];
- if(!_sections)
- _sections = [NSMutableArray new];
-
+// if(!_sections)
+// _sections = [NSMutableArray new];
+//
if(!_selectedMessageArray)
_selectedMessageArray = [NSMutableArray new];
@@ -99,35 +101,20 @@
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
- return _sections.count;
+ return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- if (_sections.count == 1)
- {
- return _messageList.count;
- }
- else
- {
- if (section == 0) {
- return [_sections[1][@"index"] integerValue];
- }
- else if (section == _sections.count - 1)
- {
- return _messageList.count - [_sections[section][@"index"] integerValue];
- }
- else
- {
- return [_sections[section + 1][@"index"] integerValue] - [_sections[section][@"index"] integerValue];
- }
- }
+
+ return self.messageList.count;
+
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Configure the cell...
MessageListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MessageCell" forIndexPath:indexPath];
cell.deviceSerial = self.deviceInfo.deviceSerial;
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];
[cell setAlarmInfo:info];
if (tableView.allowsMultipleSelectionDuringEditing == YES) {
if([_selectedMessageArray containsObject:info])
@@ -150,7 +137,7 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];
if(tableView.allowsMultipleSelectionDuringEditing)
{
if ([self.selectedMessageArray containsObject:info])
@@ -165,14 +152,14 @@
{
self.deleteSelected.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"delete", @"鍒犻櫎"),(int)[self.selectedMessageArray count]];
self.deleteSelected.enabled = YES;
- self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"dmessage_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
+ self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"message_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
self.readAll.enabled = YES;
}
else
{
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
self.deleteSelected.enabled = NO;
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
self.readAll.enabled = NO;
}
return;
@@ -180,16 +167,16 @@
MessageListCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[self performSegueWithIdentifier:@"go2MessagePhoto" sender:@{@"image":cell.actionImageView.image?:[UIImage new],
@"alarmInfo":info}];
- [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
- self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
- }];
+ // [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
+ // self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"dmessage_title", @"娑堟伅"), (int)count];
+ // }];
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView.allowsMultipleSelectionDuringEditing)
{
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];;
if ([self.selectedMessageArray containsObject:info])
{
[self.selectedMessageArray removeObject:info];
@@ -202,14 +189,14 @@
{
self.deleteSelected.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"delete", @"鍒犻櫎"),(int)[self.selectedMessageArray count]];
self.deleteSelected.enabled = YES;
- self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"dmessage_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
+ self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"message_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
self.readAll.enabled = YES;
}
else
{
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
self.deleteSelected.enabled = NO;
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
self.readAll.enabled = NO;
}
}
@@ -220,49 +207,64 @@
return 75.0f;
}
-- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
-{
- return 20.0f;
-}
+//- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
+//{
+// return 20.0f;
+//}
-- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
-{
- UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 20)];
- NSString *key = [self.sections dd_objectAtIndex:section][@"date"];
- headerLabel.text = [NSString stringWithFormat:@" %@",[self dateStringWithUserDefine:key]];
- headerLabel.font = [UIFont systemFontOfSize:14.0f];
- headerLabel.backgroundColor = [UIColor dd_hexStringToColor:@"0xf0f0f3"];
- return headerLabel;
-}
+//- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
+//{
+// UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 20)];
+// NSString *key = [self.sections dd_objectAtIndex:section][@"date"];
+// headerLabel.text = [NSString stringWithFormat:@" %@",[self dateStringWithUserDefine:key]];
+// headerLabel.font = [UIFont systemFontOfSize:14.0f];
+// headerLabel.backgroundColor = [UIColor dd_hexStringToColor:@"0xf0f0f3"];
+// return headerLabel;
+//}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
- EZAlarmInfo *info = [_messageList dd_objectAtIndex:[[_sections dd_objectAtIndex:indexPath.section][@"index"] integerValue] + indexPath.row];
+ HDLAlarmInfo *info = self.messageList[indexPath.row];;
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = NSLocalizedString(@"message_deleting", @"姝e湪鍒犻櫎锛岃绋嶅��...");
- [EZOPENSDK deleteAlarm:@[info.alarmId] completion:^(NSError *error) {
- [hud hide:YES];
- [_messageList removeObject:info];
- [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ // [EZOPENSDK deleteAlarm:@[info.alarmId] completion:^(NSError *error) {
+ // [hud hide:YES];
+ // [self.messageList removeObject:info];
+ // [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ // }];
+
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] deleteAlarmMessage:@[info.ysId] completion:^(ResponseData * responseData) {
+ if (responseData.success) {
+ [hud hide:YES];
+ [weakSelf.messageList removeObject:info];
+ [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ }else{
+ hud.labelText = NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触");
+ hud.mode = MBProgressHUDModeText;
+ [hud hide:YES afterDelay:1.2];
+ }
+
}];
+
}
}
/*
-// Override to support rearranging the table view.
-- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
-}
-*/
+ // Override to support rearranging the table view.
+ - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+ }
+ */
/*
-// Override to support conditional rearranging of the table view.
-- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the item to be re-orderable.
- return YES;
-}
-*/
+ // Override to support conditional rearranging of the table view.
+ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the item to be re-orderable.
+ return YES;
+ }
+ */
#pragma mark - UIActionSheetDelegate Methods
@@ -274,29 +276,51 @@
hud.labelText = NSLocalizedString(@"message_deleting", @"姝e湪鍒犻櫎锛岃绋嶅��...");
NSMutableArray *alarmIds = [NSMutableArray new];
for (int i = 0; i < self.selectedMessageArray.count; i++) {
- EZAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
- [alarmIds addObject:info.alarmId];
+ HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ [alarmIds addObject:info.ysId];
}
- [EZOPENSDK deleteAlarm:alarmIds completion:^(NSError *error) {
- if(error)
- {
- hud.labelText = error.localizedDescription;
+ // [EZOPENSDK deleteAlarm:alarmIds completion:^(NSError *error) {
+ // if(error)
+ // {
+ // hud.labelText = error.localizedDescription;
+ // hud.mode = MBProgressHUDModeText;
+ // [hud hide:YES afterDelay:1.2];
+ // }
+ // else
+ // {
+ // [hud hide:YES];
+ // }
+ // [self.messageList removeObjectsInArray:self.selectedMessageArray];
+ // [self editTableView:self.navigationItem.rightBarButtonItem];
+ // if(self.messageList.count > 0){
+ // [self.tableView reloadData];
+ // }
+ // else
+ // {
+ // [self.tableView.mj_header beginRefreshing];
+ // }
+ // }];
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] deleteAlarmMessage:alarmIds completion:^(ResponseData * responseData) {
+ [hud hide:YES];
+ if (responseData.success) {
+ [hud hide:YES];
+ }else{
+ hud.labelText = NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触");
hud.mode = MBProgressHUDModeText;
[hud hide:YES afterDelay:1.2];
}
- else
- {
- [hud hide:YES];
- }
- [self.messageList removeObjectsInArray:self.selectedMessageArray];
- [self editTableView:self.navigationItem.rightBarButtonItem];
- if(self.messageList.count > 0){
- [self.tableView reloadData];
+
+ [weakSelf.messageList removeObjectsInArray:self.selectedMessageArray];
+ [weakSelf editTableView:self.navigationItem.rightBarButtonItem];
+ if(weakSelf.messageList.count > 0){
+ [weakSelf.tableView reloadData];
}
else
{
- [self.tableView.header beginRefreshing];
+ [weakSelf.tableView.mj_header beginRefreshing];
}
+
}];
}
}
@@ -308,15 +332,25 @@
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
NSDictionary *dict = sender;
- EZAlarmInfo *info = dict[@"alarmInfo"];
- if(!info.isRead){
- [EZOPENSDK setAlarmStatus:@[info.alarmId] alarmStatus:EZMessageStatusRead completion:^(NSError *error) {
- if(!error)
- {
- info.isRead = YES;
- [self.tableView reloadData];
+ HDLAlarmInfo *info = dict[@"alarmInfo"];
+ if(!info.isChecked){
+ // [EZOPENSDK setAlarmStatus:@[info.alarmId] alarmStatus:EZMessageStatusRead completion:^(NSError *error) {
+ // if(!error)
+ // {
+ // info.isChecked = YES;
+ // [self.tableView reloadData];
+ // }
+ // }];
+
+ //鏍囪宸茶
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] readAlarmMessage:@[info.ysId] completion:^(ResponseData * responseData) {
+ if(responseData.success){
+ info.isChecked = YES;
+ [weakSelf.tableView reloadData];
}
}];
+
}
EZMessagePhotoViewController *nextVC = [segue destinationViewController];
nextVC.image = dict[@"image"];
@@ -329,64 +363,118 @@
- (void)addHeaderRefresh
{
__weak typeof(self) weakSelf = self;
- self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
- weakSelf.currentIndex = 0;
+ self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
+ weakSelf.currentIndex = 1;
[weakSelf.noMessage removeFromSuperview];
[weakSelf.noMessageLabel removeFromSuperview];
- [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
- pageIndex:weakSelf.currentIndex++
- pageSize:EZMessageListPageSize
- beginTime:weakSelf.beginTime
- endTime:weakSelf.endTime
-// beginTime:nil
-// endTime:nil
- completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
- [weakSelf.messageList removeAllObjects];
- [weakSelf.messageList addObjectsFromArray:alarmList];
- weakSelf.totalCount = alarmCount;
- if(weakSelf.messageList.count != weakSelf.totalCount)
- {
- [weakSelf addFooter];
- }
- [weakSelf tableViewDidReload:alarmList];
- [weakSelf.tableView.header endRefreshing];
- if(weakSelf.messageList.count > 0)
- weakSelf.navigationItem.rightBarButtonItem = self.editButton;
- }];
-
+
+ // [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
+ // pageIndex:weakSelf.currentIndex++
+ // pageSize:EZMessageListPageSize
+ // beginTime:weakSelf.beginTime
+ // endTime:weakSelf.endTime
+ //// beginTime:nil
+ //// endTime:nil
+ // completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
+ // [weakSelf.messageList removeAllObjects];
+ // [weakSelf.messageList addObjectsFromArray:alarmList];
+ // weakSelf.totalCount = alarmCount;
+ // if(weakSelf.messageList.count != weakSelf.totalCount)
+ // {
+ // [weakSelf addFooter];
+ // }
+ // [weakSelf tableViewDidReload:alarmList];
+ // [weakSelf.tableView.mj_header endRefreshing];
+ // if(weakSelf.messageList.count > 0)
+ // weakSelf.navigationItem.rightBarButtonItem = self.editButton;
+ // }];
+ //2021-07-09 1.淇敼涓篐DL鎺ュ彛鏂规
+ [[EZHttpUtil sharedManager] getAlarmList:weakSelf.deviceInfo.deviceSerial pageNo:weakSelf.currentIndex++ pageSize:EZMessageListPageSize completion:^(ResponseData * responseData) {
+ NSInteger alarmCount = 0;
+ NSArray<HDLAlarmInfo *> *alarmList = [NSArray array];
+ if (responseData.success){
+ HDLAlarmInfoData *alarmInfoData = [HDLAlarmInfoData yy_modelWithDictionary:responseData.data];
+ if (alarmInfoData) {
+ alarmCount = alarmInfoData.totalCount;
+ if (alarmInfoData.list) {
+ alarmList = alarmInfoData.list;
+ }
+ }
+ }
+
+ [weakSelf.messageList removeAllObjects];
+ [weakSelf.messageList addObjectsFromArray:alarmList];
+ weakSelf.totalCount = alarmCount;
+ if(weakSelf.messageList.count != weakSelf.totalCount)
+ {
+ [weakSelf addFooter];
+ }
+ [weakSelf tableViewDidReload];
+ [weakSelf.tableView.mj_header endRefreshing];
+ if(weakSelf.messageList.count > 0)
+ weakSelf.navigationItem.rightBarButtonItem = self.editButton;
+
+ }];
+
}];
- self.tableView.header.automaticallyChangeAlpha = YES;
- [self.tableView.header beginRefreshing];
+ self.tableView.mj_header.automaticallyChangeAlpha = YES;
+ [self.tableView.mj_header beginRefreshing];
}
- (void)addFooter
{
__weak typeof(self) weakSelf = self;
- self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
- [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
- pageIndex:weakSelf.currentIndex++
- pageSize:EZMessageListPageSize
- beginTime:weakSelf.beginTime
- endTime:weakSelf.endTime
- completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
- [weakSelf.messageList addObjectsFromArray:alarmList];
- if(weakSelf.messageList.count >= weakSelf.totalCount)
- {
- weakSelf.tableView.footer.hidden = YES;
- return;
- }
- [weakSelf tableViewDidReload:alarmList];
- [weakSelf.tableView.footer endRefreshing];
- }];
-
+ self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
+ // [EZOPENSDK getAlarmList:weakSelf.deviceInfo.deviceSerial
+ // pageIndex:weakSelf.currentIndex++
+ // pageSize:EZMessageListPageSize
+ // beginTime:weakSelf.beginTime
+ // endTime:weakSelf.endTime
+ // completion:^(NSArray *alarmList, NSInteger alarmCount, NSError *error) {
+ // [weakSelf.messageList addObjectsFromArray:alarmList];
+ // if(weakSelf.messageList.count >= weakSelf.totalCount)
+ // {
+ // weakSelf.tableView.mj_footer.hidden = YES;
+ // return;
+ // }
+ // [weakSelf tableViewDidReload:alarmList];
+ // [weakSelf.tableView.mj_footer endRefreshing];
+ // }];
+
+ [[EZHttpUtil sharedManager] getAlarmList:weakSelf.deviceInfo.deviceSerial pageNo:weakSelf.currentIndex++ pageSize:EZMessageListPageSize completion:^(ResponseData * responseData) {
+ NSArray<HDLAlarmInfo *> *alarmList = [NSArray array];
+ if (responseData.success){
+ HDLAlarmInfoData *alarmInfoData = [HDLAlarmInfoData yy_modelWithDictionary:responseData.data];
+ if (alarmInfoData) {
+ if (alarmInfoData.list) {
+ alarmList = alarmInfoData.list;
+ }
+ }
+ }
+
+ [weakSelf.messageList addObjectsFromArray:alarmList];
+
+
+ [weakSelf tableViewDidReload];
+ [weakSelf.tableView.mj_footer endRefreshing];
+
+ if(weakSelf.messageList.count >= weakSelf.totalCount)
+ {
+ weakSelf.tableView.mj_footer.hidden = YES;
+ return;
+ }
+
+
+ }];
+
}];
}
#pragma mark - Action Methods
-- (void)tableViewDidReload:(NSArray *)messageList
+- (void)tableViewDidReload
{
- if(messageList.count == 0)
+ if(self.messageList.count == 0)
{
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.tableView reloadData];
@@ -397,28 +485,28 @@
self.noMessageLabel.frame = CGRectMake((self.tableView.frame.size.width - 100)/2.0, self.noMessage.frame.origin.y + self.noMessage.frame.size.height + 10, 100, 20.0);
return;
}
- if(self.currentIndex == 1)
- {
- [self.sections removeAllObjects];
- [self.tableView.footer endRefreshing];
- self.lastDate = [messageList[0] alarmStartTime];
- self.dateFormatter.dateFormat = @"yyyy-MM-dd";
- NSString *key = [self.dateFormatter stringFromDate:self.lastDate];
- NSDictionary *dict = @{@"index":@0, @"date":key};
- [self.sections addObject:dict];
- }
- for (int i = 0; i < messageList.count; i++) {
- EZAlarmInfo *info = [messageList dd_objectAtIndex:i];
- if(![info.alarmStartTime isSameToDate:self.lastDate])
- {
- NSInteger index = [self.messageList indexOfObject:info];
- self.dateFormatter.dateFormat = @"yyyy-MM-dd";
- NSString *key = [self.dateFormatter stringFromDate:info.alarmStartTime];
- NSDictionary *dict = @{@"index":@(index),@"date":key};
- [self.sections addObject:dict];
- }
- self.lastDate = info.alarmStartTime;
- }
+// if(self.currentIndex == 1)
+// {
+// [self.sections removeAllObjects];
+// [self.tableView.mj_footer endRefreshing];
+// self.lastDate = [messageList[0] getAlarmStartTime];
+// self.dateFormatter.dateFormat = @"yyyy-MM-dd";
+// NSString *key = [self.dateFormatter stringFromDate:self.lastDate];
+// NSDictionary *dict = @{@"index":@0, @"date":key};
+// [self.sections addObject:dict];
+// }
+// for (int i = 0; i < messageList.count; i++) {
+// HDLAlarmInfo *info = [messageList dd_objectAtIndex:i];
+// if(![[info getAlarmStartTime] isSameToDate:self.lastDate])
+// {
+// NSInteger index = [self.messageList indexOfObject:info];
+// self.dateFormatter.dateFormat = @"yyyy-MM-dd";
+// NSString *key = [self.dateFormatter stringFromDate:[info getAlarmStartTime]];
+// NSDictionary *dict = @{@"index":@(index),@"date":key};
+// [self.sections addObject:dict];
+// }
+// self.lastDate = [info getAlarmStartTime];
+// }
[self.tableView reloadData];
}
@@ -431,19 +519,19 @@
[self.navigationController setToolbarHidden:YES animated:YES];
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
self.deleteSelected.enabled = NO;
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
self.readAll.enabled = NO;
[self.selectedMessageArray removeAllObjects];
- self.tableView.header.hidden = NO;
+ self.tableView.mj_header.hidden = NO;
if(self.messageList.count < self.totalCount)
- self.tableView.footer.hidden = NO;
+ self.tableView.mj_footer.hidden = NO;
}else{
self.tableView.allowsMultipleSelectionDuringEditing = YES;
[self.tableView setEditing:YES animated:YES];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(editTableView:)];
[self.navigationController setToolbarHidden:NO animated:YES];
- self.tableView.header.hidden = YES;
- self.tableView.footer.hidden = YES;
+ self.tableView.mj_header.hidden = YES;
+ self.tableView.mj_footer.hidden = YES;
self.selectedAll.enabled = YES;
self.deleteSelected.enabled = NO;
self.readAll.enabled = NO;
@@ -463,19 +551,19 @@
[self.selectedMessageArray addObjectsFromArray:self.messageList];
self.deleteSelected.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"delete", @"鍒犻櫎"),(int)[self.selectedMessageArray count]];
self.deleteSelected.enabled = YES;
- self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"dmessage_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
+ self.readAll.title = [NSString stringWithFormat:@"%@(%d)",NSLocalizedString(@"message_read", @"鏍囪宸茶"),(int)[self.selectedMessageArray count]];
self.readAll.enabled = YES;
}
else
{
self.deleteSelected.title = NSLocalizedString(@"delete", @"鍒犻櫎");
- self.readAll.title = NSLocalizedString(@"dmessage_read", @"鏍囪宸茶");
+ self.readAll.title = NSLocalizedString(@"message_read", @"鏍囪宸茶");
[self.selectedMessageArray removeAllObjects];
self.deleteSelected.enabled = NO;
self.readAll.enabled = NO;
}
[self.tableView reloadData];
- self.tableView.footer.hidden = YES;
+ self.tableView.mj_footer.hidden = YES;
}
- (IBAction)deleteMessage:(id)sender
@@ -511,35 +599,57 @@
hud.labelText = NSLocalizedString(@"message_setting", @"姝e湪璁剧疆宸茶锛岃绋嶅��...");
NSMutableArray *alarmIds = [NSMutableArray new];
for (int i = 0; i < self.selectedMessageArray.count; i++) {
- EZAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
- [alarmIds addObject:info.alarmId];
+ HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ [alarmIds addObject:info.ysId];
}
- [EZOPENSDK setAlarmStatus:alarmIds
- alarmStatus:EZMessageStatusRead
- completion:^(NSError *error) {
- if(error)
- {
- hud.labelText = error.localizedDescription;
- hud.mode = MBProgressHUDModeText;
- [hud hide:YES afterDelay:1.2];
- }
- else
- {
- [hud hide:YES];
- }
- if(!error)
- {
- for (int i = 0; i < self.selectedMessageArray.count; i++) {
- EZAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
- info.isRead = YES;
- }
- [self editTableView:self.navigationItem.rightBarButtonItem];
- [self.tableView reloadData];
- [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
- self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"message_title", @"娑堟伅"), (int)count];
- }];
- }
+ // [EZOPENSDK setAlarmStatus:alarmIds
+ // alarmStatus:EZMessageStatusRead
+ // completion:^(NSError *error) {
+ // if(error)
+ // {
+ // hud.labelText = error.localizedDescription;
+ // hud.mode = MBProgressHUDModeText;
+ // [hud hide:YES afterDelay:1.2];
+ // }
+ // else
+ // {
+ // [hud hide:YES];
+ // }
+ // if(!error)
+ // {
+ // for (int i = 0; i < self.selectedMessageArray.count; i++) {
+ // HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ // info.isChecked = YES;
+ // }
+ // [self editTableView:self.navigationItem.rightBarButtonItem];
+ // [self.tableView reloadData];
+ // [EZOPENSDK getUnreadMessageCount:self.deviceInfo.deviceSerial messageType:EZMessageTypeAlarm completion:^(NSInteger count, NSError *error) {
+ // self.title = [NSString stringWithFormat:@"%@锛�%d锛�",NSLocalizedString(@"message_title", @"娑堟伅"), (int)count];
+ // }];
+ // }
+ // }];
+
+ //鏍囪宸茶
+ __weak __typeof(self)weakSelf = self;
+ [[EZHttpUtil sharedManager] readAlarmMessage:alarmIds completion:^(ResponseData * responseData) {
+ if(responseData.success){
+ [hud hide:YES];
+ for (int i = 0; i < self.selectedMessageArray.count; i++) {
+ HDLAlarmInfo *info = [self.selectedMessageArray dd_objectAtIndex:i];
+ info.isChecked = YES;
+ }
+ [weakSelf editTableView:self.navigationItem.rightBarButtonItem];
+ [weakSelf.tableView reloadData];
+
+ }else{
+ hud.labelText = NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触");
+ hud.mode = MBProgressHUDModeText;
+ [hud hide:YES afterDelay:1.2];
+ }
}];
+
+
+
}
- (NSString *)dateStringWithUserDefine:(NSString *)dateString
diff --git a/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.h b/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.h
index b884525..41a08a9 100644
--- a/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.h
+++ b/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.h
@@ -7,13 +7,14 @@
//
#import "MWPhotoBrowser.h"
-#import "EZAlarmInfo.h"
+//#import "EZAlarmInfo.h"
#import "EZDeviceInfo.h"
+#import "HDLAlarmInfo.h"
@interface EZMessagePhotoViewController : MWPhotoBrowser
@property (nonatomic, strong) UIImage *image;
-@property (nonatomic, strong) EZAlarmInfo *info;
+@property (nonatomic, strong) HDLAlarmInfo *info;
@property (nonatomic, strong) EZDeviceInfo *deviceInfo;
@end
diff --git a/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.m b/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.m
index 5b21b38..74a681d 100644
--- a/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.m
+++ b/EZSDK/EZSDK/EZ/UIViewControllers/EZMessagePhotoViewController.m
@@ -34,8 +34,10 @@
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
- self.timeLabel.text = [formatter stringFromDate:self.info.alarmStartTime];
+ self.timeLabel.text = [formatter stringFromDate:[self.info getAlarmStartTime]];
self.contentLabel.text = [NSString stringWithFormat:@"%@:%@",NSLocalizedString(@"message_from", @"鏉ヨ嚜"),self.info.alarmName];
+
+ [self.recordButton setHidden:YES];
}
- (void)didReceiveMemoryWarning {
@@ -50,11 +52,11 @@
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
- EZAlarmInfo *info = sender;
-
- EZMessagePlaybackViewController *messagePlaybackVC = [segue destinationViewController];
- messagePlaybackVC.info = info;
- messagePlaybackVC.deviceInfo = self.deviceInfo;
+// HDLAlarmInfo *info = sender;
+//
+// EZMessagePlaybackViewController *messagePlaybackVC = [segue destinationViewController];
+// messagePlaybackVC.info = info;
+// messagePlaybackVC.deviceInfo = self.deviceInfo;
}
diff --git a/EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.h b/EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.h
new file mode 100644
index 0000000..73f62ec
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.h
@@ -0,0 +1,440 @@
+//
+// NSObject+YYModel.h
+// YYModel <https://github.com/ibireme/YYModel>
+//
+// Created by ibireme on 15/5/10.
+// Copyright (c) 2015 ibireme.
+//
+// This source code is licensed under the MIT-style license found in the
+// LICENSE file in the root directory of this source tree.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ Provide some data-model method:
+
+ * Convert json to any object, or convert any object to json.
+ * Set object properties with a key-value dictionary (like KVC).
+ * Implementations of `NSCoding`, `NSCopying`, `-hash` and `-isEqual:`.
+
+ See `YYModel` protocol for custom methods.
+
+
+ Sample Code:
+
+ ********************** json convertor *********************
+ @code
+ @interface YYAuthor : NSObject
+ @property (nonatomic, strong) NSString *name;
+ @property (nonatomic, assign) NSDate *birthday;
+ @end
+ @implementation YYAuthor
+ @end
+
+ @interface YYBook : NSObject
+ @property (nonatomic, copy) NSString *name;
+ @property (nonatomic, assign) NSUInteger pages;
+ @property (nonatomic, strong) YYAuthor *author;
+ @end
+ @implementation YYBook
+ @end
+
+ int main() {
+ // create model from json
+ YYBook *book = [YYBook yy_modelWithJSON:@"{\"name\": \"Harry Potter\", \"pages\": 256, \"author\": {\"name\": \"J.K.Rowling\", \"birthday\": \"1965-07-31\" }}"];
+
+ // convert model to json
+ NSString *json = [book yy_modelToJSONString];
+ // {"author":{"name":"J.K.Rowling","birthday":"1965-07-31T00:00:00+0000"},"name":"Harry Potter","pages":256}
+ }
+ @endcode
+
+ ********************** Coding/Copying/hash/equal *********************
+ @code
+ @interface YYShadow :NSObject <NSCoding, NSCopying>
+ @property (nonatomic, copy) NSString *name;
+ @property (nonatomic, assign) CGSize size;
+ @end
+
+ @implementation YYShadow
+ - (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; }
+ - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; return [self yy_modelInitWithCoder:aDecoder]; }
+ - (id)copyWithZone:(NSZone *)zone { return [self yy_modelCopy]; }
+ - (NSUInteger)hash { return [self yy_modelHash]; }
+ - (BOOL)isEqual:(id)object { return [self yy_modelIsEqual:object]; }
+ @end
+ @endcode
+
+ */
+@interface NSObject (YYModel)
+
+/**
+ Creates and returns a new instance of the receiver from a json.
+ This method is thread-safe.
+
+ @param json A json object in `NSDictionary`, `NSString` or `NSData`.
+
+ @return A new instance created from the json, or nil if an error occurs.
+ */
++ (nullable instancetype)yy_modelWithJSON:(id)json;
+
+/**
+ Creates and returns a new instance of the receiver from a key-value dictionary.
+ This method is thread-safe.
+
+ @param dictionary A key-value dictionary mapped to the instance's properties.
+ Any invalid key-value pair in dictionary will be ignored.
+
+ @return A new instance created from the dictionary, or nil if an error occurs.
+
+ @discussion The key in `dictionary` will mapped to the reciever's property name,
+ and the value will set to the property. If the value's type does not match the
+ property, this method will try to convert the value based on these rules:
+
+ `NSString` or `NSNumber` -> c number, such as BOOL, int, long, float, NSUInteger...
+ `NSString` -> NSDate, parsed with format "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd HH:mm:ss" or "yyyy-MM-dd".
+ `NSString` -> NSURL.
+ `NSValue` -> struct or union, such as CGRect, CGSize, ...
+ `NSString` -> SEL, Class.
+ */
++ (nullable instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary;
+
+/**
+ Set the receiver's properties with a json object.
+
+ @discussion Any invalid data in json will be ignored.
+
+ @param json A json object of `NSDictionary`, `NSString` or `NSData`, mapped to the
+ receiver's properties.
+
+ @return Whether succeed.
+ */
+- (BOOL)yy_modelSetWithJSON:(id)json;
+
+/**
+ Set the receiver's properties with a key-value dictionary.
+
+ @param dic A key-value dictionary mapped to the receiver's properties.
+ Any invalid key-value pair in dictionary will be ignored.
+
+ @discussion The key in `dictionary` will mapped to the reciever's property name,
+ and the value will set to the property. If the value's type doesn't match the
+ property, this method will try to convert the value based on these rules:
+
+ `NSString`, `NSNumber` -> c number, such as BOOL, int, long, float, NSUInteger...
+ `NSString` -> NSDate, parsed with format "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd HH:mm:ss" or "yyyy-MM-dd".
+ `NSString` -> NSURL.
+ `NSValue` -> struct or union, such as CGRect, CGSize, ...
+ `NSString` -> SEL, Class.
+
+ @return Whether succeed.
+ */
+- (BOOL)yy_modelSetWithDictionary:(NSDictionary *)dic;
+
+/**
+ Generate a json object from the receiver's properties.
+
+ @return A json object in `NSDictionary` or `NSArray`, or nil if an error occurs.
+ See [NSJSONSerialization isValidJSONObject] for more information.
+
+ @discussion Any of the invalid property is ignored.
+ If the reciver is `NSArray`, `NSDictionary` or `NSSet`, it just convert
+ the inner object to json object.
+ */
+- (nullable id)yy_modelToJSONObject;
+
+/**
+ Generate a json string's data from the receiver's properties.
+
+ @return A json string's data, or nil if an error occurs.
+
+ @discussion Any of the invalid property is ignored.
+ If the reciver is `NSArray`, `NSDictionary` or `NSSet`, it will also convert the
+ inner object to json string.
+ */
+- (nullable NSData *)yy_modelToJSONData;
+
+/**
+ Generate a json string from the receiver's properties.
+
+ @return A json string, or nil if an error occurs.
+
+ @discussion Any of the invalid property is ignored.
+ If the reciver is `NSArray`, `NSDictionary` or `NSSet`, it will also convert the
+ inner object to json string.
+ */
+- (nullable NSString *)yy_modelToJSONString;
+
+/**
+ Copy a instance with the receiver's properties.
+
+ @return A copied instance, or nil if an error occurs.
+ */
+- (nullable id)yy_modelCopy;
+
+/**
+ Encode the receiver's properties to a coder.
+
+ @param aCoder An archiver object.
+ */
+- (void)yy_modelEncodeWithCoder:(NSCoder *)aCoder;
+
+/**
+ Decode the receiver's properties from a decoder.
+
+ @param aDecoder An archiver object.
+
+ @return self
+ */
+- (id)yy_modelInitWithCoder:(NSCoder *)aDecoder;
+
+/**
+ Get a hash code with the receiver's properties.
+
+ @return Hash code.
+ */
+- (NSUInteger)yy_modelHash;
+
+/**
+ Compares the receiver with another object for equality, based on properties.
+
+ @param model Another object.
+
+ @return `YES` if the reciever is equal to the object, otherwise `NO`.
+ */
+- (BOOL)yy_modelIsEqual:(id)model;
+
+/**
+ Description method for debugging purposes based on properties.
+
+ @return A string that describes the contents of the receiver.
+ */
+- (NSString *)yy_modelDescription;
+
+@end
+
+
+
+/**
+ Provide some data-model method for NSArray.
+ */
+@interface NSArray (YYModel)
+
+/**
+ Creates and returns an array from a json-array.
+ This method is thread-safe.
+
+ @param cls The instance's class in array.
+ @param json A json array of `NSArray`, `NSString` or `NSData`.
+ Example: [{"name":"Mary"},{name:"Joe"}]
+
+ @return A array, or nil if an error occurs.
+ */
++ (nullable NSArray *)yy_modelArrayWithClass:(Class)cls json:(id)json;
+
+@end
+
+
+
+/**
+ Provide some data-model method for NSDictionary.
+ */
+@interface NSDictionary (YYModel)
+
+/**
+ Creates and returns a dictionary from a json.
+ This method is thread-safe.
+
+ @param cls The value instance's class in dictionary.
+ @param json A json dictionary of `NSDictionary`, `NSString` or `NSData`.
+ Example: {"user1":{"name","Mary"}, "user2": {name:"Joe"}}
+
+ @return A dictionary, or nil if an error occurs.
+ */
++ (nullable NSDictionary *)yy_modelDictionaryWithClass:(Class)cls json:(id)json;
+@end
+
+
+
+/**
+ If the default model transform does not fit to your model class, implement one or
+ more method in this protocol to change the default key-value transform process.
+ There's no need to add '<YYModel>' to your class header.
+ */
+@protocol YYModel <NSObject>
+@optional
+
+/**
+ Custom property mapper.
+
+ @discussion If the key in JSON/Dictionary does not match to the model's property name,
+ implements this method and returns the additional mapper.
+
+ Example:
+
+ json:
+ {
+ "n":"Harry Pottery",
+ "p": 256,
+ "ext" : {
+ "desc" : "A book written by J.K.Rowling."
+ },
+ "ID" : 100010
+ }
+
+ model:
+ @code
+ @interface YYBook : NSObject
+ @property NSString *name;
+ @property NSInteger page;
+ @property NSString *desc;
+ @property NSString *bookID;
+ @end
+
+ @implementation YYBook
+ + (NSDictionary *)modelCustomPropertyMapper {
+ return @{@"name" : @"n",
+ @"page" : @"p",
+ @"desc" : @"ext.desc",
+ @"bookID": @[@"id", @"ID", @"book_id"]};
+ }
+ @end
+ @endcode
+
+ @return A custom mapper for properties.
+ */
++ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;
+
+/**
+ The generic class mapper for container properties.
+
+ @discussion If the property is a container object, such as NSArray/NSSet/NSDictionary,
+ implements this method and returns a property->class mapper, tells which kind of
+ object will be add to the array/set/dictionary.
+
+ Example:
+ @code
+ @class YYShadow, YYBorder, YYAttachment;
+
+ @interface YYAttributes
+ @property NSString *name;
+ @property NSArray *shadows;
+ @property NSSet *borders;
+ @property NSDictionary *attachments;
+ @end
+
+ @implementation YYAttributes
+ + (NSDictionary *)modelContainerPropertyGenericClass {
+ return @{@"shadows" : [YYShadow class],
+ @"borders" : YYBorder.class,
+ @"attachments" : @"YYAttachment" };
+ }
+ @end
+ @endcode
+
+ @return A class mapper.
+ */
++ (nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;
+
+/**
+ If you need to create instances of different classes during json->object transform,
+ use the method to choose custom class based on dictionary data.
+
+ @discussion If the model implements this method, it will be called to determine resulting class
+ during `+modelWithJSON:`, `+modelWithDictionary:`, conveting object of properties of parent objects
+ (both singular and containers via `+modelContainerPropertyGenericClass`).
+
+ Example:
+ @code
+ @class YYCircle, YYRectangle, YYLine;
+
+ @implementation YYShape
+
+ + (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {
+ if (dictionary[@"radius"] != nil) {
+ return [YYCircle class];
+ } else if (dictionary[@"width"] != nil) {
+ return [YYRectangle class];
+ } else if (dictionary[@"y2"] != nil) {
+ return [YYLine class];
+ } else {
+ return [self class];
+ }
+ }
+
+ @end
+ @endcode
+
+ @param dictionary The json/kv dictionary.
+
+ @return Class to create from this dictionary, `nil` to use current class.
+
+ */
++ (nullable Class)modelCustomClassForDictionary:(NSDictionary *)dictionary;
+
+/**
+ All the properties in blacklist will be ignored in model transform process.
+ Returns nil to ignore this feature.
+
+ @return An array of property's name.
+ */
++ (nullable NSArray<NSString *> *)modelPropertyBlacklist;
+
+/**
+ If a property is not in the whitelist, it will be ignored in model transform process.
+ Returns nil to ignore this feature.
+
+ @return An array of property's name.
+ */
++ (nullable NSArray<NSString *> *)modelPropertyWhitelist;
+
+/**
+ This method's behavior is similar to `- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;`,
+ but be called before the model transform.
+
+ @discussion If the model implements this method, it will be called before
+ `+modelWithJSON:`, `+modelWithDictionary:`, `-modelSetWithJSON:` and `-modelSetWithDictionary:`.
+ If this method returns nil, the transform process will ignore this model.
+
+ @param dic The json/kv dictionary.
+
+ @return Returns the modified dictionary, or nil to ignore this model.
+ */
+- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;
+
+/**
+ If the default json-to-model transform does not fit to your model object, implement
+ this method to do additional process. You can also use this method to validate the
+ model's properties.
+
+ @discussion If the model implements this method, it will be called at the end of
+ `+modelWithJSON:`, `+modelWithDictionary:`, `-modelSetWithJSON:` and `-modelSetWithDictionary:`.
+ If this method returns NO, the transform process will ignore this model.
+
+ @param dic The json/kv dictionary.
+
+ @return Returns YES if the model is valid, or NO to ignore this model.
+ */
+- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;
+
+/**
+ If the default model-to-json transform does not fit to your model class, implement
+ this method to do additional process. You can also use this method to validate the
+ json dictionary.
+
+ @discussion If the model implements this method, it will be called at the end of
+ `-modelToJSONObject` and `-modelToJSONString`.
+ If this method returns NO, the transform process will ignore this json dictionary.
+
+ @param dic The json dictionary.
+
+ @return Returns YES if the model is valid, or NO to ignore this model.
+ */
+- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.m b/EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.m
new file mode 100644
index 0000000..3d7c470
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Venders/YYModel/NSObject+YYModel.m
@@ -0,0 +1,1839 @@
+//
+// NSObject+YYModel.m
+// YYModel <https://github.com/ibireme/YYModel>
+//
+// Created by ibireme on 15/5/10.
+// Copyright (c) 2015 ibireme.
+//
+// This source code is licensed under the MIT-style license found in the
+// LICENSE file in the root directory of this source tree.
+//
+
+#import "NSObject+YYModel.h"
+#import "YYClassInfo.h"
+#import <objc/message.h>
+
+#define force_inline __inline__ __attribute__((always_inline))
+
+/// Foundation Class Type
+typedef NS_ENUM (NSUInteger, YYEncodingNSType) {
+ YYEncodingTypeNSUnknown = 0,
+ YYEncodingTypeNSString,
+ YYEncodingTypeNSMutableString,
+ YYEncodingTypeNSValue,
+ YYEncodingTypeNSNumber,
+ YYEncodingTypeNSDecimalNumber,
+ YYEncodingTypeNSData,
+ YYEncodingTypeNSMutableData,
+ YYEncodingTypeNSDate,
+ YYEncodingTypeNSURL,
+ YYEncodingTypeNSArray,
+ YYEncodingTypeNSMutableArray,
+ YYEncodingTypeNSDictionary,
+ YYEncodingTypeNSMutableDictionary,
+ YYEncodingTypeNSSet,
+ YYEncodingTypeNSMutableSet,
+};
+
+/// Get the Foundation class type from property info.
+static force_inline YYEncodingNSType YYClassGetNSType(Class cls) {
+ if (!cls) return YYEncodingTypeNSUnknown;
+ if ([cls isSubclassOfClass:[NSMutableString class]]) return YYEncodingTypeNSMutableString;
+ if ([cls isSubclassOfClass:[NSString class]]) return YYEncodingTypeNSString;
+ if ([cls isSubclassOfClass:[NSDecimalNumber class]]) return YYEncodingTypeNSDecimalNumber;
+ if ([cls isSubclassOfClass:[NSNumber class]]) return YYEncodingTypeNSNumber;
+ if ([cls isSubclassOfClass:[NSValue class]]) return YYEncodingTypeNSValue;
+ if ([cls isSubclassOfClass:[NSMutableData class]]) return YYEncodingTypeNSMutableData;
+ if ([cls isSubclassOfClass:[NSData class]]) return YYEncodingTypeNSData;
+ if ([cls isSubclassOfClass:[NSDate class]]) return YYEncodingTypeNSDate;
+ if ([cls isSubclassOfClass:[NSURL class]]) return YYEncodingTypeNSURL;
+ if ([cls isSubclassOfClass:[NSMutableArray class]]) return YYEncodingTypeNSMutableArray;
+ if ([cls isSubclassOfClass:[NSArray class]]) return YYEncodingTypeNSArray;
+ if ([cls isSubclassOfClass:[NSMutableDictionary class]]) return YYEncodingTypeNSMutableDictionary;
+ if ([cls isSubclassOfClass:[NSDictionary class]]) return YYEncodingTypeNSDictionary;
+ if ([cls isSubclassOfClass:[NSMutableSet class]]) return YYEncodingTypeNSMutableSet;
+ if ([cls isSubclassOfClass:[NSSet class]]) return YYEncodingTypeNSSet;
+ return YYEncodingTypeNSUnknown;
+}
+
+/// Whether the type is c number.
+static force_inline BOOL YYEncodingTypeIsCNumber(YYEncodingType type) {
+ switch (type & YYEncodingTypeMask) {
+ case YYEncodingTypeBool:
+ case YYEncodingTypeInt8:
+ case YYEncodingTypeUInt8:
+ case YYEncodingTypeInt16:
+ case YYEncodingTypeUInt16:
+ case YYEncodingTypeInt32:
+ case YYEncodingTypeUInt32:
+ case YYEncodingTypeInt64:
+ case YYEncodingTypeUInt64:
+ case YYEncodingTypeFloat:
+ case YYEncodingTypeDouble:
+ case YYEncodingTypeLongDouble: return YES;
+ default: return NO;
+ }
+}
+
+/// Parse a number value from 'id'.
+static force_inline NSNumber *YYNSNumberCreateFromID(__unsafe_unretained id value) {
+ static NSCharacterSet *dot;
+ static NSDictionary *dic;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ dot = [NSCharacterSet characterSetWithRange:NSMakeRange('.', 1)];
+ dic = @{@"TRUE" : @(YES),
+ @"True" : @(YES),
+ @"true" : @(YES),
+ @"FALSE" : @(NO),
+ @"False" : @(NO),
+ @"false" : @(NO),
+ @"YES" : @(YES),
+ @"Yes" : @(YES),
+ @"yes" : @(YES),
+ @"NO" : @(NO),
+ @"No" : @(NO),
+ @"no" : @(NO),
+ @"NIL" : (id)kCFNull,
+ @"Nil" : (id)kCFNull,
+ @"nil" : (id)kCFNull,
+ @"NULL" : (id)kCFNull,
+ @"Null" : (id)kCFNull,
+ @"null" : (id)kCFNull,
+ @"(NULL)" : (id)kCFNull,
+ @"(Null)" : (id)kCFNull,
+ @"(null)" : (id)kCFNull,
+ @"<NULL>" : (id)kCFNull,
+ @"<Null>" : (id)kCFNull,
+ @"<null>" : (id)kCFNull};
+ });
+
+ if (!value || value == (id)kCFNull) return nil;
+ if ([value isKindOfClass:[NSNumber class]]) return value;
+ if ([value isKindOfClass:[NSString class]]) {
+ NSNumber *num = dic[value];
+ if (num != nil) {
+ if (num == (id)kCFNull) return nil;
+ return num;
+ }
+ if ([(NSString *)value rangeOfCharacterFromSet:dot].location != NSNotFound) {
+ const char *cstring = ((NSString *)value).UTF8String;
+ if (!cstring) return nil;
+ double num = atof(cstring);
+ if (isnan(num) || isinf(num)) return nil;
+ return @(num);
+ } else {
+ const char *cstring = ((NSString *)value).UTF8String;
+ if (!cstring) return nil;
+ return @(atoll(cstring));
+ }
+ }
+ return nil;
+}
+
+/// Parse string to date.
+static force_inline NSDate *YYNSDateFromString(__unsafe_unretained NSString *string) {
+ typedef NSDate* (^YYNSDateParseBlock)(NSString *string);
+ #define kParserNum 34
+ static YYNSDateParseBlock blocks[kParserNum + 1] = {0};
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ {
+ /*
+ 2014-01-20 // Google
+ */
+ NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
+ formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
+ formatter.dateFormat = @"yyyy-MM-dd";
+ blocks[10] = ^(NSString *string) { return [formatter dateFromString:string]; };
+ }
+
+ {
+ /*
+ 2014-01-20 12:24:48
+ 2014-01-20T12:24:48 // Google
+ 2014-01-20 12:24:48.000
+ 2014-01-20T12:24:48.000
+ */
+ NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
+ formatter1.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter1.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
+ formatter1.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss";
+
+ NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
+ formatter2.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter2.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
+ formatter2.dateFormat = @"yyyy-MM-dd HH:mm:ss";
+
+ NSDateFormatter *formatter3 = [[NSDateFormatter alloc] init];
+ formatter3.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter3.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
+ formatter3.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS";
+
+ NSDateFormatter *formatter4 = [[NSDateFormatter alloc] init];
+ formatter4.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter4.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
+ formatter4.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS";
+
+ blocks[19] = ^(NSString *string) {
+ if ([string characterAtIndex:10] == 'T') {
+ return [formatter1 dateFromString:string];
+ } else {
+ return [formatter2 dateFromString:string];
+ }
+ };
+
+ blocks[23] = ^(NSString *string) {
+ if ([string characterAtIndex:10] == 'T') {
+ return [formatter3 dateFromString:string];
+ } else {
+ return [formatter4 dateFromString:string];
+ }
+ };
+ }
+
+ {
+ /*
+ 2014-01-20T12:24:48Z // Github, Apple
+ 2014-01-20T12:24:48+0800 // Facebook
+ 2014-01-20T12:24:48+12:00 // Google
+ 2014-01-20T12:24:48.000Z
+ 2014-01-20T12:24:48.000+0800
+ 2014-01-20T12:24:48.000+12:00
+ */
+ NSDateFormatter *formatter = [NSDateFormatter new];
+ formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
+
+ NSDateFormatter *formatter2 = [NSDateFormatter new];
+ formatter2.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter2.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
+
+ blocks[20] = ^(NSString *string) { return [formatter dateFromString:string]; };
+ blocks[24] = ^(NSString *string) { return [formatter dateFromString:string]?: [formatter2 dateFromString:string]; };
+ blocks[25] = ^(NSString *string) { return [formatter dateFromString:string]; };
+ blocks[28] = ^(NSString *string) { return [formatter2 dateFromString:string]; };
+ blocks[29] = ^(NSString *string) { return [formatter2 dateFromString:string]; };
+ }
+
+ {
+ /*
+ Fri Sep 04 00:12:21 +0800 2015 // Weibo, Twitter
+ Fri Sep 04 00:12:21.000 +0800 2015
+ */
+ NSDateFormatter *formatter = [NSDateFormatter new];
+ formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
+
+ NSDateFormatter *formatter2 = [NSDateFormatter new];
+ formatter2.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter2.dateFormat = @"EEE MMM dd HH:mm:ss.SSS Z yyyy";
+
+ blocks[30] = ^(NSString *string) { return [formatter dateFromString:string]; };
+ blocks[34] = ^(NSString *string) { return [formatter2 dateFromString:string]; };
+ }
+ });
+ if (!string) return nil;
+ if (string.length > kParserNum) return nil;
+ YYNSDateParseBlock parser = blocks[string.length];
+ if (!parser) return nil;
+ return parser(string);
+ #undef kParserNum
+}
+
+
+/// Get the 'NSBlock' class.
+static force_inline Class YYNSBlockClass() {
+ static Class cls;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ void (^block)(void) = ^{};
+ cls = ((NSObject *)block).class;
+ while (class_getSuperclass(cls) != [NSObject class]) {
+ cls = class_getSuperclass(cls);
+ }
+ });
+ return cls; // current is "NSBlock"
+}
+
+
+
+/**
+ Get the ISO date formatter.
+
+ ISO8601 format example:
+ 2010-07-09T16:13:30+12:00
+ 2011-01-11T11:11:11+0000
+ 2011-01-26T19:06:43Z
+
+ length: 20/24/25
+ */
+static force_inline NSDateFormatter *YYISODateFormatter() {
+ static NSDateFormatter *formatter = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ formatter = [[NSDateFormatter alloc] init];
+ formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
+ formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
+ });
+ return formatter;
+}
+
+/// Get the value with key paths from dictionary
+/// The dic should be NSDictionary, and the keyPath should not be nil.
+static force_inline id YYValueForKeyPath(__unsafe_unretained NSDictionary *dic, __unsafe_unretained NSArray *keyPaths) {
+ id value = nil;
+ for (NSUInteger i = 0, max = keyPaths.count; i < max; i++) {
+ value = dic[keyPaths[i]];
+ if (i + 1 < max) {
+ if ([value isKindOfClass:[NSDictionary class]]) {
+ dic = value;
+ } else {
+ return nil;
+ }
+ }
+ }
+ return value;
+}
+
+/// Get the value with multi key (or key path) from dictionary
+/// The dic should be NSDictionary
+static force_inline id YYValueForMultiKeys(__unsafe_unretained NSDictionary *dic, __unsafe_unretained NSArray *multiKeys) {
+ id value = nil;
+ for (NSString *key in multiKeys) {
+ if ([key isKindOfClass:[NSString class]]) {
+ value = dic[key];
+ if (value) break;
+ } else {
+ value = YYValueForKeyPath(dic, (NSArray *)key);
+ if (value) break;
+ }
+ }
+ return value;
+}
+
+
+
+
+/// A property info in object model.
+@interface _YYModelPropertyMeta : NSObject {
+ @package
+ NSString *_name; ///< property's name
+ YYEncodingType _type; ///< property's type
+ YYEncodingNSType _nsType; ///< property's Foundation type
+ BOOL _isCNumber; ///< is c number type
+ Class _cls; ///< property's class, or nil
+ Class _genericCls; ///< container's generic class, or nil if threr's no generic class
+ SEL _getter; ///< getter, or nil if the instances cannot respond
+ SEL _setter; ///< setter, or nil if the instances cannot respond
+ BOOL _isKVCCompatible; ///< YES if it can access with key-value coding
+ BOOL _isStructAvailableForKeyedArchiver; ///< YES if the struct can encoded with keyed archiver/unarchiver
+ BOOL _hasCustomClassFromDictionary; ///< class/generic class implements +modelCustomClassForDictionary:
+
+ /*
+ property->key: _mappedToKey:key _mappedToKeyPath:nil _mappedToKeyArray:nil
+ property->keyPath: _mappedToKey:keyPath _mappedToKeyPath:keyPath(array) _mappedToKeyArray:nil
+ property->keys: _mappedToKey:keys[0] _mappedToKeyPath:nil/keyPath _mappedToKeyArray:keys(array)
+ */
+ NSString *_mappedToKey; ///< the key mapped to
+ NSArray *_mappedToKeyPath; ///< the key path mapped to (nil if the name is not key path)
+ NSArray *_mappedToKeyArray; ///< the key(NSString) or keyPath(NSArray) array (nil if not mapped to multiple keys)
+ YYClassPropertyInfo *_info; ///< property's info
+ _YYModelPropertyMeta *_next; ///< next meta if there are multiple properties mapped to the same key.
+}
+@end
+
+@implementation _YYModelPropertyMeta
++ (instancetype)metaWithClassInfo:(YYClassInfo *)classInfo propertyInfo:(YYClassPropertyInfo *)propertyInfo generic:(Class)generic {
+
+ // support pseudo generic class with protocol name
+ if (!generic && propertyInfo.protocols) {
+ for (NSString *protocol in propertyInfo.protocols) {
+ Class cls = objc_getClass(protocol.UTF8String);
+ if (cls) {
+ generic = cls;
+ break;
+ }
+ }
+ }
+
+ _YYModelPropertyMeta *meta = [self new];
+ meta->_name = propertyInfo.name;
+ meta->_type = propertyInfo.type;
+ meta->_info = propertyInfo;
+ meta->_genericCls = generic;
+
+ if ((meta->_type & YYEncodingTypeMask) == YYEncodingTypeObject) {
+ meta->_nsType = YYClassGetNSType(propertyInfo.cls);
+ } else {
+ meta->_isCNumber = YYEncodingTypeIsCNumber(meta->_type);
+ }
+ if ((meta->_type & YYEncodingTypeMask) == YYEncodingTypeStruct) {
+ /*
+ It seems that NSKeyedUnarchiver cannot decode NSValue except these structs:
+ */
+ static NSSet *types = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ NSMutableSet *set = [NSMutableSet new];
+ // 32 bit
+ [set addObject:@"{CGSize=ff}"];
+ [set addObject:@"{CGPoint=ff}"];
+ [set addObject:@"{CGRect={CGPoint=ff}{CGSize=ff}}"];
+ [set addObject:@"{CGAffineTransform=ffffff}"];
+ [set addObject:@"{UIEdgeInsets=ffff}"];
+ [set addObject:@"{UIOffset=ff}"];
+ // 64 bit
+ [set addObject:@"{CGSize=dd}"];
+ [set addObject:@"{CGPoint=dd}"];
+ [set addObject:@"{CGRect={CGPoint=dd}{CGSize=dd}}"];
+ [set addObject:@"{CGAffineTransform=dddddd}"];
+ [set addObject:@"{UIEdgeInsets=dddd}"];
+ [set addObject:@"{UIOffset=dd}"];
+ types = set;
+ });
+ if ([types containsObject:propertyInfo.typeEncoding]) {
+ meta->_isStructAvailableForKeyedArchiver = YES;
+ }
+ }
+ meta->_cls = propertyInfo.cls;
+
+ if (generic) {
+ meta->_hasCustomClassFromDictionary = [generic respondsToSelector:@selector(modelCustomClassForDictionary:)];
+ } else if (meta->_cls && meta->_nsType == YYEncodingTypeNSUnknown) {
+ meta->_hasCustomClassFromDictionary = [meta->_cls respondsToSelector:@selector(modelCustomClassForDictionary:)];
+ }
+
+ if (propertyInfo.getter) {
+ if ([classInfo.cls instancesRespondToSelector:propertyInfo.getter]) {
+ meta->_getter = propertyInfo.getter;
+ }
+ }
+ if (propertyInfo.setter) {
+ if ([classInfo.cls instancesRespondToSelector:propertyInfo.setter]) {
+ meta->_setter = propertyInfo.setter;
+ }
+ }
+
+ if (meta->_getter && meta->_setter) {
+ /*
+ KVC invalid type:
+ long double
+ pointer (such as SEL/CoreFoundation object)
+ */
+ switch (meta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeBool:
+ case YYEncodingTypeInt8:
+ case YYEncodingTypeUInt8:
+ case YYEncodingTypeInt16:
+ case YYEncodingTypeUInt16:
+ case YYEncodingTypeInt32:
+ case YYEncodingTypeUInt32:
+ case YYEncodingTypeInt64:
+ case YYEncodingTypeUInt64:
+ case YYEncodingTypeFloat:
+ case YYEncodingTypeDouble:
+ case YYEncodingTypeObject:
+ case YYEncodingTypeClass:
+ case YYEncodingTypeBlock:
+ case YYEncodingTypeStruct:
+ case YYEncodingTypeUnion: {
+ meta->_isKVCCompatible = YES;
+ } break;
+ default: break;
+ }
+ }
+
+ return meta;
+}
+@end
+
+
+/// A class info in object model.
+@interface _YYModelMeta : NSObject {
+ @package
+ YYClassInfo *_classInfo;
+ /// Key:mapped key and key path, Value:_YYModelPropertyMeta.
+ NSDictionary *_mapper;
+ /// Array<_YYModelPropertyMeta>, all property meta of this model.
+ NSArray *_allPropertyMetas;
+ /// Array<_YYModelPropertyMeta>, property meta which is mapped to a key path.
+ NSArray *_keyPathPropertyMetas;
+ /// Array<_YYModelPropertyMeta>, property meta which is mapped to multi keys.
+ NSArray *_multiKeysPropertyMetas;
+ /// The number of mapped key (and key path), same to _mapper.count.
+ NSUInteger _keyMappedCount;
+ /// Model class type.
+ YYEncodingNSType _nsType;
+
+ BOOL _hasCustomWillTransformFromDictionary;
+ BOOL _hasCustomTransformFromDictionary;
+ BOOL _hasCustomTransformToDictionary;
+ BOOL _hasCustomClassFromDictionary;
+}
+@end
+
+@implementation _YYModelMeta
+- (instancetype)initWithClass:(Class)cls {
+ YYClassInfo *classInfo = [YYClassInfo classInfoWithClass:cls];
+ if (!classInfo) return nil;
+ self = [super init];
+
+ // Get black list
+ NSSet *blacklist = nil;
+ if ([cls respondsToSelector:@selector(modelPropertyBlacklist)]) {
+ NSArray *properties = [(id<YYModel>)cls modelPropertyBlacklist];
+ if (properties) {
+ blacklist = [NSSet setWithArray:properties];
+ }
+ }
+
+ // Get white list
+ NSSet *whitelist = nil;
+ if ([cls respondsToSelector:@selector(modelPropertyWhitelist)]) {
+ NSArray *properties = [(id<YYModel>)cls modelPropertyWhitelist];
+ if (properties) {
+ whitelist = [NSSet setWithArray:properties];
+ }
+ }
+
+ // Get container property's generic class
+ NSDictionary *genericMapper = nil;
+ if ([cls respondsToSelector:@selector(modelContainerPropertyGenericClass)]) {
+ genericMapper = [(id<YYModel>)cls modelContainerPropertyGenericClass];
+ if (genericMapper) {
+ NSMutableDictionary *tmp = [NSMutableDictionary new];
+ [genericMapper enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
+ if (![key isKindOfClass:[NSString class]]) return;
+ Class meta = object_getClass(obj);
+ if (!meta) return;
+ if (class_isMetaClass(meta)) {
+ tmp[key] = obj;
+ } else if ([obj isKindOfClass:[NSString class]]) {
+ Class cls = NSClassFromString(obj);
+ if (cls) {
+ tmp[key] = cls;
+ }
+ }
+ }];
+ genericMapper = tmp;
+ }
+ }
+
+ // Create all property metas.
+ NSMutableDictionary *allPropertyMetas = [NSMutableDictionary new];
+ YYClassInfo *curClassInfo = classInfo;
+ while (curClassInfo && curClassInfo.superCls != nil) { // recursive parse super class, but ignore root class (NSObject/NSProxy)
+ for (YYClassPropertyInfo *propertyInfo in curClassInfo.propertyInfos.allValues) {
+ if (!propertyInfo.name) continue;
+ if (blacklist && [blacklist containsObject:propertyInfo.name]) continue;
+ if (whitelist && ![whitelist containsObject:propertyInfo.name]) continue;
+ _YYModelPropertyMeta *meta = [_YYModelPropertyMeta metaWithClassInfo:classInfo
+ propertyInfo:propertyInfo
+ generic:genericMapper[propertyInfo.name]];
+ if (!meta || !meta->_name) continue;
+ if (!meta->_getter || !meta->_setter) continue;
+ if (allPropertyMetas[meta->_name]) continue;
+ allPropertyMetas[meta->_name] = meta;
+ }
+ curClassInfo = curClassInfo.superClassInfo;
+ }
+ if (allPropertyMetas.count) _allPropertyMetas = allPropertyMetas.allValues.copy;
+
+ // create mapper
+ NSMutableDictionary *mapper = [NSMutableDictionary new];
+ NSMutableArray *keyPathPropertyMetas = [NSMutableArray new];
+ NSMutableArray *multiKeysPropertyMetas = [NSMutableArray new];
+
+ if ([cls respondsToSelector:@selector(modelCustomPropertyMapper)]) {
+ NSDictionary *customMapper = [(id <YYModel>)cls modelCustomPropertyMapper];
+ [customMapper enumerateKeysAndObjectsUsingBlock:^(NSString *propertyName, NSString *mappedToKey, BOOL *stop) {
+ _YYModelPropertyMeta *propertyMeta = allPropertyMetas[propertyName];
+ if (!propertyMeta) return;
+ [allPropertyMetas removeObjectForKey:propertyName];
+
+ if ([mappedToKey isKindOfClass:[NSString class]]) {
+ if (mappedToKey.length == 0) return;
+
+ propertyMeta->_mappedToKey = mappedToKey;
+ NSArray *keyPath = [mappedToKey componentsSeparatedByString:@"."];
+ for (NSString *onePath in keyPath) {
+ if (onePath.length == 0) {
+ NSMutableArray *tmp = keyPath.mutableCopy;
+ [tmp removeObject:@""];
+ keyPath = tmp;
+ break;
+ }
+ }
+ if (keyPath.count > 1) {
+ propertyMeta->_mappedToKeyPath = keyPath;
+ [keyPathPropertyMetas addObject:propertyMeta];
+ }
+ propertyMeta->_next = mapper[mappedToKey] ?: nil;
+ mapper[mappedToKey] = propertyMeta;
+
+ } else if ([mappedToKey isKindOfClass:[NSArray class]]) {
+
+ NSMutableArray *mappedToKeyArray = [NSMutableArray new];
+ for (NSString *oneKey in ((NSArray *)mappedToKey)) {
+ if (![oneKey isKindOfClass:[NSString class]]) continue;
+ if (oneKey.length == 0) continue;
+
+ NSArray *keyPath = [oneKey componentsSeparatedByString:@"."];
+ if (keyPath.count > 1) {
+ [mappedToKeyArray addObject:keyPath];
+ } else {
+ [mappedToKeyArray addObject:oneKey];
+ }
+
+ if (!propertyMeta->_mappedToKey) {
+ propertyMeta->_mappedToKey = oneKey;
+ propertyMeta->_mappedToKeyPath = keyPath.count > 1 ? keyPath : nil;
+ }
+ }
+ if (!propertyMeta->_mappedToKey) return;
+
+ propertyMeta->_mappedToKeyArray = mappedToKeyArray;
+ [multiKeysPropertyMetas addObject:propertyMeta];
+
+ propertyMeta->_next = mapper[mappedToKey] ?: nil;
+ mapper[mappedToKey] = propertyMeta;
+ }
+ }];
+ }
+
+ [allPropertyMetas enumerateKeysAndObjectsUsingBlock:^(NSString *name, _YYModelPropertyMeta *propertyMeta, BOOL *stop) {
+ propertyMeta->_mappedToKey = name;
+ propertyMeta->_next = mapper[name] ?: nil;
+ mapper[name] = propertyMeta;
+ }];
+
+ if (mapper.count) _mapper = mapper;
+ if (keyPathPropertyMetas) _keyPathPropertyMetas = keyPathPropertyMetas;
+ if (multiKeysPropertyMetas) _multiKeysPropertyMetas = multiKeysPropertyMetas;
+
+ _classInfo = classInfo;
+ _keyMappedCount = _allPropertyMetas.count;
+ _nsType = YYClassGetNSType(cls);
+ _hasCustomWillTransformFromDictionary = ([cls instancesRespondToSelector:@selector(modelCustomWillTransformFromDictionary:)]);
+ _hasCustomTransformFromDictionary = ([cls instancesRespondToSelector:@selector(modelCustomTransformFromDictionary:)]);
+ _hasCustomTransformToDictionary = ([cls instancesRespondToSelector:@selector(modelCustomTransformToDictionary:)]);
+ _hasCustomClassFromDictionary = ([cls respondsToSelector:@selector(modelCustomClassForDictionary:)]);
+
+ return self;
+}
+
+/// Returns the cached model class meta
++ (instancetype)metaWithClass:(Class)cls {
+ if (!cls) return nil;
+ static CFMutableDictionaryRef cache;
+ static dispatch_once_t onceToken;
+ static dispatch_semaphore_t lock;
+ dispatch_once(&onceToken, ^{
+ cache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ lock = dispatch_semaphore_create(1);
+ });
+ dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
+ _YYModelMeta *meta = CFDictionaryGetValue(cache, (__bridge const void *)(cls));
+ dispatch_semaphore_signal(lock);
+ if (!meta || meta->_classInfo.needUpdate) {
+ meta = [[_YYModelMeta alloc] initWithClass:cls];
+ if (meta) {
+ dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
+ CFDictionarySetValue(cache, (__bridge const void *)(cls), (__bridge const void *)(meta));
+ dispatch_semaphore_signal(lock);
+ }
+ }
+ return meta;
+}
+
+@end
+
+
+/**
+ Get number from property.
+ @discussion Caller should hold strong reference to the parameters before this function returns.
+ @param model Should not be nil.
+ @param meta Should not be nil, meta.isCNumber should be YES, meta.getter should not be nil.
+ @return A number object, or nil if failed.
+ */
+static force_inline NSNumber *ModelCreateNumberFromProperty(__unsafe_unretained id model,
+ __unsafe_unretained _YYModelPropertyMeta *meta) {
+ switch (meta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeBool: {
+ return @(((bool (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeInt8: {
+ return @(((int8_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeUInt8: {
+ return @(((uint8_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeInt16: {
+ return @(((int16_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeUInt16: {
+ return @(((uint16_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeInt32: {
+ return @(((int32_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeUInt32: {
+ return @(((uint32_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeInt64: {
+ return @(((int64_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeUInt64: {
+ return @(((uint64_t (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter));
+ }
+ case YYEncodingTypeFloat: {
+ float num = ((float (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
+ if (isnan(num) || isinf(num)) return nil;
+ return @(num);
+ }
+ case YYEncodingTypeDouble: {
+ double num = ((double (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
+ if (isnan(num) || isinf(num)) return nil;
+ return @(num);
+ }
+ case YYEncodingTypeLongDouble: {
+ double num = ((long double (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
+ if (isnan(num) || isinf(num)) return nil;
+ return @(num);
+ }
+ default: return nil;
+ }
+}
+
+/**
+ Set number to property.
+ @discussion Caller should hold strong reference to the parameters before this function returns.
+ @param model Should not be nil.
+ @param num Can be nil.
+ @param meta Should not be nil, meta.isCNumber should be YES, meta.setter should not be nil.
+ */
+static force_inline void ModelSetNumberToProperty(__unsafe_unretained id model,
+ __unsafe_unretained NSNumber *num,
+ __unsafe_unretained _YYModelPropertyMeta *meta) {
+ switch (meta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeBool: {
+ ((void (*)(id, SEL, bool))(void *) objc_msgSend)((id)model, meta->_setter, num.boolValue);
+ } break;
+ case YYEncodingTypeInt8: {
+ ((void (*)(id, SEL, int8_t))(void *) objc_msgSend)((id)model, meta->_setter, (int8_t)num.charValue);
+ } break;
+ case YYEncodingTypeUInt8: {
+ ((void (*)(id, SEL, uint8_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint8_t)num.unsignedCharValue);
+ } break;
+ case YYEncodingTypeInt16: {
+ ((void (*)(id, SEL, int16_t))(void *) objc_msgSend)((id)model, meta->_setter, (int16_t)num.shortValue);
+ } break;
+ case YYEncodingTypeUInt16: {
+ ((void (*)(id, SEL, uint16_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint16_t)num.unsignedShortValue);
+ } break;
+ case YYEncodingTypeInt32: {
+ ((void (*)(id, SEL, int32_t))(void *) objc_msgSend)((id)model, meta->_setter, (int32_t)num.intValue);
+ }
+ case YYEncodingTypeUInt32: {
+ ((void (*)(id, SEL, uint32_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint32_t)num.unsignedIntValue);
+ } break;
+ case YYEncodingTypeInt64: {
+ if ([num isKindOfClass:[NSDecimalNumber class]]) {
+ ((void (*)(id, SEL, int64_t))(void *) objc_msgSend)((id)model, meta->_setter, (int64_t)num.stringValue.longLongValue);
+ } else {
+ ((void (*)(id, SEL, uint64_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint64_t)num.longLongValue);
+ }
+ } break;
+ case YYEncodingTypeUInt64: {
+ if ([num isKindOfClass:[NSDecimalNumber class]]) {
+ ((void (*)(id, SEL, int64_t))(void *) objc_msgSend)((id)model, meta->_setter, (int64_t)num.stringValue.longLongValue);
+ } else {
+ ((void (*)(id, SEL, uint64_t))(void *) objc_msgSend)((id)model, meta->_setter, (uint64_t)num.unsignedLongLongValue);
+ }
+ } break;
+ case YYEncodingTypeFloat: {
+ float f = num.floatValue;
+ if (isnan(f) || isinf(f)) f = 0;
+ ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)model, meta->_setter, f);
+ } break;
+ case YYEncodingTypeDouble: {
+ double d = num.doubleValue;
+ if (isnan(d) || isinf(d)) d = 0;
+ ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)model, meta->_setter, d);
+ } break;
+ case YYEncodingTypeLongDouble: {
+ long double d = num.doubleValue;
+ if (isnan(d) || isinf(d)) d = 0;
+ ((void (*)(id, SEL, long double))(void *) objc_msgSend)((id)model, meta->_setter, (long double)d);
+ } // break; commented for code coverage in next line
+ default: break;
+ }
+}
+
+/**
+ Set value to model with a property meta.
+
+ @discussion Caller should hold strong reference to the parameters before this function returns.
+
+ @param model Should not be nil.
+ @param value Should not be nil, but can be NSNull.
+ @param meta Should not be nil, and meta->_setter should not be nil.
+ */
+static void ModelSetValueForProperty(__unsafe_unretained id model,
+ __unsafe_unretained id value,
+ __unsafe_unretained _YYModelPropertyMeta *meta) {
+ if (meta->_isCNumber) {
+ NSNumber *num = YYNSNumberCreateFromID(value);
+ ModelSetNumberToProperty(model, num, meta);
+ if (num != nil) [num class]; // hold the number
+ } else if (meta->_nsType) {
+ if (value == (id)kCFNull) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)nil);
+ } else {
+ switch (meta->_nsType) {
+ case YYEncodingTypeNSString:
+ case YYEncodingTypeNSMutableString: {
+ if ([value isKindOfClass:[NSString class]]) {
+ if (meta->_nsType == YYEncodingTypeNSString) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, ((NSString *)value).mutableCopy);
+ }
+ } else if ([value isKindOfClass:[NSNumber class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ (meta->_nsType == YYEncodingTypeNSString) ?
+ ((NSNumber *)value).stringValue :
+ ((NSNumber *)value).stringValue.mutableCopy);
+ } else if ([value isKindOfClass:[NSData class]]) {
+ NSMutableString *string = [[NSMutableString alloc] initWithData:value encoding:NSUTF8StringEncoding];
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, string);
+ } else if ([value isKindOfClass:[NSURL class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ (meta->_nsType == YYEncodingTypeNSString) ?
+ ((NSURL *)value).absoluteString :
+ ((NSURL *)value).absoluteString.mutableCopy);
+ } else if ([value isKindOfClass:[NSAttributedString class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ (meta->_nsType == YYEncodingTypeNSString) ?
+ ((NSAttributedString *)value).string :
+ ((NSAttributedString *)value).string.mutableCopy);
+ }
+ } break;
+
+ case YYEncodingTypeNSValue:
+ case YYEncodingTypeNSNumber:
+ case YYEncodingTypeNSDecimalNumber: {
+ if (meta->_nsType == YYEncodingTypeNSNumber) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, YYNSNumberCreateFromID(value));
+ } else if (meta->_nsType == YYEncodingTypeNSDecimalNumber) {
+ if ([value isKindOfClass:[NSDecimalNumber class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else if ([value isKindOfClass:[NSNumber class]]) {
+ NSDecimalNumber *decNum = [NSDecimalNumber decimalNumberWithDecimal:[((NSNumber *)value) decimalValue]];
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, decNum);
+ } else if ([value isKindOfClass:[NSString class]]) {
+ NSDecimalNumber *decNum = [NSDecimalNumber decimalNumberWithString:value];
+ NSDecimal dec = decNum.decimalValue;
+ if (dec._length == 0 && dec._isNegative) {
+ decNum = nil; // NaN
+ }
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, decNum);
+ }
+ } else { // YYEncodingTypeNSValue
+ if ([value isKindOfClass:[NSValue class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ }
+ }
+ } break;
+
+ case YYEncodingTypeNSData:
+ case YYEncodingTypeNSMutableData: {
+ if ([value isKindOfClass:[NSData class]]) {
+ if (meta->_nsType == YYEncodingTypeNSData) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else {
+ NSMutableData *data = ((NSData *)value).mutableCopy;
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, data);
+ }
+ } else if ([value isKindOfClass:[NSString class]]) {
+ NSData *data = [(NSString *)value dataUsingEncoding:NSUTF8StringEncoding];
+ if (meta->_nsType == YYEncodingTypeNSMutableData) {
+ data = ((NSData *)data).mutableCopy;
+ }
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, data);
+ }
+ } break;
+
+ case YYEncodingTypeNSDate: {
+ if ([value isKindOfClass:[NSDate class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else if ([value isKindOfClass:[NSString class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, YYNSDateFromString(value));
+ }
+ } break;
+
+ case YYEncodingTypeNSURL: {
+ if ([value isKindOfClass:[NSURL class]]) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else if ([value isKindOfClass:[NSString class]]) {
+ NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
+ NSString *str = [value stringByTrimmingCharactersInSet:set];
+ if (str.length == 0) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, nil);
+ } else {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, [[NSURL alloc] initWithString:str]);
+ }
+ }
+ } break;
+
+ case YYEncodingTypeNSArray:
+ case YYEncodingTypeNSMutableArray: {
+ if (meta->_genericCls) {
+ NSArray *valueArr = nil;
+ if ([value isKindOfClass:[NSArray class]]) valueArr = value;
+ else if ([value isKindOfClass:[NSSet class]]) valueArr = ((NSSet *)value).allObjects;
+ if (valueArr) {
+ NSMutableArray *objectArr = [NSMutableArray new];
+ for (id one in valueArr) {
+ if ([one isKindOfClass:meta->_genericCls]) {
+ [objectArr addObject:one];
+ } else if ([one isKindOfClass:[NSDictionary class]]) {
+ Class cls = meta->_genericCls;
+ if (meta->_hasCustomClassFromDictionary) {
+ cls = [cls modelCustomClassForDictionary:one];
+ if (!cls) cls = meta->_genericCls; // for xcode code coverage
+ }
+ NSObject *newOne = [cls new];
+ [newOne yy_modelSetWithDictionary:one];
+ if (newOne) [objectArr addObject:newOne];
+ }
+ }
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, objectArr);
+ }
+ } else {
+ if ([value isKindOfClass:[NSArray class]]) {
+ if (meta->_nsType == YYEncodingTypeNSArray) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ ((NSArray *)value).mutableCopy);
+ }
+ } else if ([value isKindOfClass:[NSSet class]]) {
+ if (meta->_nsType == YYEncodingTypeNSArray) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, ((NSSet *)value).allObjects);
+ } else {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ ((NSSet *)value).allObjects.mutableCopy);
+ }
+ }
+ }
+ } break;
+
+ case YYEncodingTypeNSDictionary:
+ case YYEncodingTypeNSMutableDictionary: {
+ if ([value isKindOfClass:[NSDictionary class]]) {
+ if (meta->_genericCls) {
+ NSMutableDictionary *dic = [NSMutableDictionary new];
+ [((NSDictionary *)value) enumerateKeysAndObjectsUsingBlock:^(NSString *oneKey, id oneValue, BOOL *stop) {
+ if ([oneValue isKindOfClass:[NSDictionary class]]) {
+ Class cls = meta->_genericCls;
+ if (meta->_hasCustomClassFromDictionary) {
+ cls = [cls modelCustomClassForDictionary:oneValue];
+ if (!cls) cls = meta->_genericCls; // for xcode code coverage
+ }
+ NSObject *newOne = [cls new];
+ [newOne yy_modelSetWithDictionary:(id)oneValue];
+ if (newOne) dic[oneKey] = newOne;
+ }
+ }];
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, dic);
+ } else {
+ if (meta->_nsType == YYEncodingTypeNSDictionary) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, value);
+ } else {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ ((NSDictionary *)value).mutableCopy);
+ }
+ }
+ }
+ } break;
+
+ case YYEncodingTypeNSSet:
+ case YYEncodingTypeNSMutableSet: {
+ NSSet *valueSet = nil;
+ if ([value isKindOfClass:[NSArray class]]) valueSet = [NSMutableSet setWithArray:value];
+ else if ([value isKindOfClass:[NSSet class]]) valueSet = ((NSSet *)value);
+
+ if (meta->_genericCls) {
+ NSMutableSet *set = [NSMutableSet new];
+ for (id one in valueSet) {
+ if ([one isKindOfClass:meta->_genericCls]) {
+ [set addObject:one];
+ } else if ([one isKindOfClass:[NSDictionary class]]) {
+ Class cls = meta->_genericCls;
+ if (meta->_hasCustomClassFromDictionary) {
+ cls = [cls modelCustomClassForDictionary:one];
+ if (!cls) cls = meta->_genericCls; // for xcode code coverage
+ }
+ NSObject *newOne = [cls new];
+ [newOne yy_modelSetWithDictionary:one];
+ if (newOne) [set addObject:newOne];
+ }
+ }
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, set);
+ } else {
+ if (meta->_nsType == YYEncodingTypeNSSet) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, valueSet);
+ } else {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model,
+ meta->_setter,
+ ((NSSet *)valueSet).mutableCopy);
+ }
+ }
+ } // break; commented for code coverage in next line
+
+ default: break;
+ }
+ }
+ } else {
+ BOOL isNull = (value == (id)kCFNull);
+ switch (meta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeObject: {
+ Class cls = meta->_genericCls ?: meta->_cls;
+ if (isNull) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)nil);
+ } else if ([value isKindOfClass:cls] || !cls) {
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)value);
+ } else if ([value isKindOfClass:[NSDictionary class]]) {
+ NSObject *one = nil;
+ if (meta->_getter) {
+ one = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, meta->_getter);
+ }
+ if (one) {
+ [one yy_modelSetWithDictionary:value];
+ } else {
+ if (meta->_hasCustomClassFromDictionary) {
+ cls = [cls modelCustomClassForDictionary:value] ?: cls;
+ }
+ one = [cls new];
+ [one yy_modelSetWithDictionary:value];
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, meta->_setter, (id)one);
+ }
+ }
+ } break;
+
+ case YYEncodingTypeClass: {
+ if (isNull) {
+ ((void (*)(id, SEL, Class))(void *) objc_msgSend)((id)model, meta->_setter, (Class)NULL);
+ } else {
+ Class cls = nil;
+ if ([value isKindOfClass:[NSString class]]) {
+ cls = NSClassFromString(value);
+ if (cls) {
+ ((void (*)(id, SEL, Class))(void *) objc_msgSend)((id)model, meta->_setter, (Class)cls);
+ }
+ } else {
+ cls = object_getClass(value);
+ if (cls) {
+ if (class_isMetaClass(cls)) {
+ ((void (*)(id, SEL, Class))(void *) objc_msgSend)((id)model, meta->_setter, (Class)value);
+ }
+ }
+ }
+ }
+ } break;
+
+ case YYEncodingTypeSEL: {
+ if (isNull) {
+ ((void (*)(id, SEL, SEL))(void *) objc_msgSend)((id)model, meta->_setter, (SEL)NULL);
+ } else if ([value isKindOfClass:[NSString class]]) {
+ SEL sel = NSSelectorFromString(value);
+ if (sel) ((void (*)(id, SEL, SEL))(void *) objc_msgSend)((id)model, meta->_setter, (SEL)sel);
+ }
+ } break;
+
+ case YYEncodingTypeBlock: {
+ if (isNull) {
+ ((void (*)(id, SEL, void (^)()))(void *) objc_msgSend)((id)model, meta->_setter, (void (^)())NULL);
+ } else if ([value isKindOfClass:YYNSBlockClass()]) {
+ ((void (*)(id, SEL, void (^)()))(void *) objc_msgSend)((id)model, meta->_setter, (void (^)())value);
+ }
+ } break;
+
+ case YYEncodingTypeStruct:
+ case YYEncodingTypeUnion:
+ case YYEncodingTypeCArray: {
+ if ([value isKindOfClass:[NSValue class]]) {
+ const char *valueType = ((NSValue *)value).objCType;
+ const char *metaType = meta->_info.typeEncoding.UTF8String;
+ if (valueType && metaType && strcmp(valueType, metaType) == 0) {
+ [model setValue:value forKey:meta->_name];
+ }
+ }
+ } break;
+
+ case YYEncodingTypePointer:
+ case YYEncodingTypeCString: {
+ if (isNull) {
+ ((void (*)(id, SEL, void *))(void *) objc_msgSend)((id)model, meta->_setter, (void *)NULL);
+ } else if ([value isKindOfClass:[NSValue class]]) {
+ NSValue *nsValue = value;
+ if (nsValue.objCType && strcmp(nsValue.objCType, "^v") == 0) {
+ ((void (*)(id, SEL, void *))(void *) objc_msgSend)((id)model, meta->_setter, nsValue.pointerValue);
+ }
+ }
+ } // break; commented for code coverage in next line
+
+ default: break;
+ }
+ }
+}
+
+
+typedef struct {
+ void *modelMeta; ///< _YYModelMeta
+ void *model; ///< id (self)
+ void *dictionary; ///< NSDictionary (json)
+} ModelSetContext;
+
+/**
+ Apply function for dictionary, to set the key-value pair to model.
+
+ @param _key should not be nil, NSString.
+ @param _value should not be nil.
+ @param _context _context.modelMeta and _context.model should not be nil.
+ */
+static void ModelSetWithDictionaryFunction(const void *_key, const void *_value, void *_context) {
+ ModelSetContext *context = _context;
+ __unsafe_unretained _YYModelMeta *meta = (__bridge _YYModelMeta *)(context->modelMeta);
+ __unsafe_unretained _YYModelPropertyMeta *propertyMeta = [meta->_mapper objectForKey:(__bridge id)(_key)];
+ __unsafe_unretained id model = (__bridge id)(context->model);
+ while (propertyMeta) {
+ if (propertyMeta->_setter) {
+ ModelSetValueForProperty(model, (__bridge __unsafe_unretained id)_value, propertyMeta);
+ }
+ propertyMeta = propertyMeta->_next;
+ };
+}
+
+/**
+ Apply function for model property meta, to set dictionary to model.
+
+ @param _propertyMeta should not be nil, _YYModelPropertyMeta.
+ @param _context _context.model and _context.dictionary should not be nil.
+ */
+static void ModelSetWithPropertyMetaArrayFunction(const void *_propertyMeta, void *_context) {
+ ModelSetContext *context = _context;
+ __unsafe_unretained NSDictionary *dictionary = (__bridge NSDictionary *)(context->dictionary);
+ __unsafe_unretained _YYModelPropertyMeta *propertyMeta = (__bridge _YYModelPropertyMeta *)(_propertyMeta);
+ if (!propertyMeta->_setter) return;
+ id value = nil;
+
+ if (propertyMeta->_mappedToKeyArray) {
+ value = YYValueForMultiKeys(dictionary, propertyMeta->_mappedToKeyArray);
+ } else if (propertyMeta->_mappedToKeyPath) {
+ value = YYValueForKeyPath(dictionary, propertyMeta->_mappedToKeyPath);
+ } else {
+ value = [dictionary objectForKey:propertyMeta->_mappedToKey];
+ }
+
+ if (value) {
+ __unsafe_unretained id model = (__bridge id)(context->model);
+ ModelSetValueForProperty(model, value, propertyMeta);
+ }
+}
+
+/**
+ Returns a valid JSON object (NSArray/NSDictionary/NSString/NSNumber/NSNull),
+ or nil if an error occurs.
+
+ @param model Model, can be nil.
+ @return JSON object, nil if an error occurs.
+ */
+static id ModelToJSONObjectRecursive(NSObject *model) {
+ if (!model || model == (id)kCFNull) return model;
+ if ([model isKindOfClass:[NSString class]]) return model;
+ if ([model isKindOfClass:[NSNumber class]]) return model;
+ if ([model isKindOfClass:[NSDictionary class]]) {
+ if ([NSJSONSerialization isValidJSONObject:model]) return model;
+ NSMutableDictionary *newDic = [NSMutableDictionary new];
+ [((NSDictionary *)model) enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
+ NSString *stringKey = [key isKindOfClass:[NSString class]] ? key : key.description;
+ if (!stringKey) return;
+ id jsonObj = ModelToJSONObjectRecursive(obj);
+ if (!jsonObj) jsonObj = (id)kCFNull;
+ newDic[stringKey] = jsonObj;
+ }];
+ return newDic;
+ }
+ if ([model isKindOfClass:[NSSet class]]) {
+ NSArray *array = ((NSSet *)model).allObjects;
+ if ([NSJSONSerialization isValidJSONObject:array]) return array;
+ NSMutableArray *newArray = [NSMutableArray new];
+ for (id obj in array) {
+ if ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSNumber class]]) {
+ [newArray addObject:obj];
+ } else {
+ id jsonObj = ModelToJSONObjectRecursive(obj);
+ if (jsonObj && jsonObj != (id)kCFNull) [newArray addObject:jsonObj];
+ }
+ }
+ return newArray;
+ }
+ if ([model isKindOfClass:[NSArray class]]) {
+ if ([NSJSONSerialization isValidJSONObject:model]) return model;
+ NSMutableArray *newArray = [NSMutableArray new];
+ for (id obj in (NSArray *)model) {
+ if ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSNumber class]]) {
+ [newArray addObject:obj];
+ } else {
+ id jsonObj = ModelToJSONObjectRecursive(obj);
+ if (jsonObj && jsonObj != (id)kCFNull) [newArray addObject:jsonObj];
+ }
+ }
+ return newArray;
+ }
+ if ([model isKindOfClass:[NSURL class]]) return ((NSURL *)model).absoluteString;
+ if ([model isKindOfClass:[NSAttributedString class]]) return ((NSAttributedString *)model).string;
+ if ([model isKindOfClass:[NSDate class]]) return [YYISODateFormatter() stringFromDate:(id)model];
+ if ([model isKindOfClass:[NSData class]]) return nil;
+
+
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:[model class]];
+ if (!modelMeta || modelMeta->_keyMappedCount == 0) return nil;
+ NSMutableDictionary *result = [[NSMutableDictionary alloc] initWithCapacity:64];
+ __unsafe_unretained NSMutableDictionary *dic = result; // avoid retain and release in block
+ [modelMeta->_mapper enumerateKeysAndObjectsUsingBlock:^(NSString *propertyMappedKey, _YYModelPropertyMeta *propertyMeta, BOOL *stop) {
+ if (!propertyMeta->_getter) return;
+
+ id value = nil;
+ if (propertyMeta->_isCNumber) {
+ value = ModelCreateNumberFromProperty(model, propertyMeta);
+ } else if (propertyMeta->_nsType) {
+ id v = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, propertyMeta->_getter);
+ value = ModelToJSONObjectRecursive(v);
+ } else {
+ switch (propertyMeta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeObject: {
+ id v = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, propertyMeta->_getter);
+ value = ModelToJSONObjectRecursive(v);
+ if (value == (id)kCFNull) value = nil;
+ } break;
+ case YYEncodingTypeClass: {
+ Class v = ((Class (*)(id, SEL))(void *) objc_msgSend)((id)model, propertyMeta->_getter);
+ value = v ? NSStringFromClass(v) : nil;
+ } break;
+ case YYEncodingTypeSEL: {
+ SEL v = ((SEL (*)(id, SEL))(void *) objc_msgSend)((id)model, propertyMeta->_getter);
+ value = v ? NSStringFromSelector(v) : nil;
+ } break;
+ default: break;
+ }
+ }
+ if (!value) return;
+
+ if (propertyMeta->_mappedToKeyPath) {
+ NSMutableDictionary *superDic = dic;
+ NSMutableDictionary *subDic = nil;
+ for (NSUInteger i = 0, max = propertyMeta->_mappedToKeyPath.count; i < max; i++) {
+ NSString *key = propertyMeta->_mappedToKeyPath[i];
+ if (i + 1 == max) { // end
+ if (!superDic[key]) superDic[key] = value;
+ break;
+ }
+
+ subDic = superDic[key];
+ if (subDic) {
+ if ([subDic isKindOfClass:[NSDictionary class]]) {
+ subDic = subDic.mutableCopy;
+ superDic[key] = subDic;
+ } else {
+ break;
+ }
+ } else {
+ subDic = [NSMutableDictionary new];
+ superDic[key] = subDic;
+ }
+ superDic = subDic;
+ subDic = nil;
+ }
+ } else {
+ if (!dic[propertyMeta->_mappedToKey]) {
+ dic[propertyMeta->_mappedToKey] = value;
+ }
+ }
+ }];
+
+ if (modelMeta->_hasCustomTransformToDictionary) {
+ BOOL suc = [((id<YYModel>)model) modelCustomTransformToDictionary:dic];
+ if (!suc) return nil;
+ }
+ return result;
+}
+
+/// Add indent to string (exclude first line)
+static NSMutableString *ModelDescriptionAddIndent(NSMutableString *desc, NSUInteger indent) {
+ for (NSUInteger i = 0, max = desc.length; i < max; i++) {
+ unichar c = [desc characterAtIndex:i];
+ if (c == '\n') {
+ for (NSUInteger j = 0; j < indent; j++) {
+ [desc insertString:@" " atIndex:i + 1];
+ }
+ i += indent * 4;
+ max += indent * 4;
+ }
+ }
+ return desc;
+}
+
+/// Generate a description string
+static NSString *ModelDescription(NSObject *model) {
+ static const int kDescMaxLength = 100;
+ if (!model) return @"<nil>";
+ if (model == (id)kCFNull) return @"<null>";
+ if (![model isKindOfClass:[NSObject class]]) return [NSString stringWithFormat:@"%@",model];
+
+
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:model.class];
+ switch (modelMeta->_nsType) {
+ case YYEncodingTypeNSString: case YYEncodingTypeNSMutableString: {
+ return [NSString stringWithFormat:@"\"%@\"",model];
+ }
+
+ case YYEncodingTypeNSValue:
+ case YYEncodingTypeNSData: case YYEncodingTypeNSMutableData: {
+ NSString *tmp = model.description;
+ if (tmp.length > kDescMaxLength) {
+ tmp = [tmp substringToIndex:kDescMaxLength];
+ tmp = [tmp stringByAppendingString:@"..."];
+ }
+ return tmp;
+ }
+
+ case YYEncodingTypeNSNumber:
+ case YYEncodingTypeNSDecimalNumber:
+ case YYEncodingTypeNSDate:
+ case YYEncodingTypeNSURL: {
+ return [NSString stringWithFormat:@"%@",model];
+ }
+
+ case YYEncodingTypeNSSet: case YYEncodingTypeNSMutableSet: {
+ model = ((NSSet *)model).allObjects;
+ } // no break
+
+ case YYEncodingTypeNSArray: case YYEncodingTypeNSMutableArray: {
+ NSArray *array = (id)model;
+ NSMutableString *desc = [NSMutableString new];
+ if (array.count == 0) {
+ return [desc stringByAppendingString:@"[]"];
+ } else {
+ [desc appendFormat:@"[\n"];
+ for (NSUInteger i = 0, max = array.count; i < max; i++) {
+ NSObject *obj = array[i];
+ [desc appendString:@" "];
+ [desc appendString:ModelDescriptionAddIndent(ModelDescription(obj).mutableCopy, 1)];
+ [desc appendString:(i + 1 == max) ? @"\n" : @";\n"];
+ }
+ [desc appendString:@"]"];
+ return desc;
+ }
+ }
+ case YYEncodingTypeNSDictionary: case YYEncodingTypeNSMutableDictionary: {
+ NSDictionary *dic = (id)model;
+ NSMutableString *desc = [NSMutableString new];
+ if (dic.count == 0) {
+ return [desc stringByAppendingString:@"{}"];
+ } else {
+ NSArray *keys = dic.allKeys;
+
+ [desc appendFormat:@"{\n"];
+ for (NSUInteger i = 0, max = keys.count; i < max; i++) {
+ NSString *key = keys[i];
+ NSObject *value = dic[key];
+ [desc appendString:@" "];
+ [desc appendFormat:@"%@ = %@",key, ModelDescriptionAddIndent(ModelDescription(value).mutableCopy, 1)];
+ [desc appendString:(i + 1 == max) ? @"\n" : @";\n"];
+ }
+ [desc appendString:@"}"];
+ }
+ return desc;
+ }
+
+ default: {
+ NSMutableString *desc = [NSMutableString new];
+ [desc appendFormat:@"<%@: %p>", model.class, model];
+ if (modelMeta->_allPropertyMetas.count == 0) return desc;
+
+ // sort property names
+ NSArray *properties = [modelMeta->_allPropertyMetas
+ sortedArrayUsingComparator:^NSComparisonResult(_YYModelPropertyMeta *p1, _YYModelPropertyMeta *p2) {
+ return [p1->_name compare:p2->_name];
+ }];
+
+ [desc appendFormat:@" {\n"];
+ for (NSUInteger i = 0, max = properties.count; i < max; i++) {
+ _YYModelPropertyMeta *property = properties[i];
+ NSString *propertyDesc;
+ if (property->_isCNumber) {
+ NSNumber *num = ModelCreateNumberFromProperty(model, property);
+ propertyDesc = num.stringValue;
+ } else {
+ switch (property->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeObject: {
+ id v = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, property->_getter);
+ propertyDesc = ModelDescription(v);
+ if (!propertyDesc) propertyDesc = @"<nil>";
+ } break;
+ case YYEncodingTypeClass: {
+ id v = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, property->_getter);
+ propertyDesc = ((NSObject *)v).description;
+ if (!propertyDesc) propertyDesc = @"<nil>";
+ } break;
+ case YYEncodingTypeSEL: {
+ SEL sel = ((SEL (*)(id, SEL))(void *) objc_msgSend)((id)model, property->_getter);
+ if (sel) propertyDesc = NSStringFromSelector(sel);
+ else propertyDesc = @"<NULL>";
+ } break;
+ case YYEncodingTypeBlock: {
+ id block = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, property->_getter);
+ propertyDesc = block ? ((NSObject *)block).description : @"<nil>";
+ } break;
+ case YYEncodingTypeCArray: case YYEncodingTypeCString: case YYEncodingTypePointer: {
+ void *pointer = ((void* (*)(id, SEL))(void *) objc_msgSend)((id)model, property->_getter);
+ propertyDesc = [NSString stringWithFormat:@"%p",pointer];
+ } break;
+ case YYEncodingTypeStruct: case YYEncodingTypeUnion: {
+ NSValue *value = [model valueForKey:property->_name];
+ propertyDesc = value ? value.description : @"{unknown}";
+ } break;
+ default: propertyDesc = @"<unknown>";
+ }
+ }
+
+ propertyDesc = ModelDescriptionAddIndent(propertyDesc.mutableCopy, 1);
+ [desc appendFormat:@" %@ = %@",property->_name, propertyDesc];
+ [desc appendString:(i + 1 == max) ? @"\n" : @";\n"];
+ }
+ [desc appendFormat:@"}"];
+ return desc;
+ }
+ }
+}
+
+
+@implementation NSObject (YYModel)
+
++ (NSDictionary *)_yy_dictionaryWithJSON:(id)json {
+ if (!json || json == (id)kCFNull) return nil;
+ NSDictionary *dic = nil;
+ NSData *jsonData = nil;
+ if ([json isKindOfClass:[NSDictionary class]]) {
+ dic = json;
+ } else if ([json isKindOfClass:[NSString class]]) {
+ jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
+ } else if ([json isKindOfClass:[NSData class]]) {
+ jsonData = json;
+ }
+ if (jsonData) {
+ dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
+ if (![dic isKindOfClass:[NSDictionary class]]) dic = nil;
+ }
+ return dic;
+}
+
++ (instancetype)yy_modelWithJSON:(id)json {
+ NSDictionary *dic = [self _yy_dictionaryWithJSON:json];
+ return [self yy_modelWithDictionary:dic];
+}
+
++ (instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary {
+ if (!dictionary || dictionary == (id)kCFNull) return nil;
+ if (![dictionary isKindOfClass:[NSDictionary class]]) return nil;
+
+ Class cls = [self class];
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls];
+ if (modelMeta->_hasCustomClassFromDictionary) {
+ cls = [cls modelCustomClassForDictionary:dictionary] ?: cls;
+ }
+
+ NSObject *one = [cls new];
+ if ([one yy_modelSetWithDictionary:dictionary]) return one;
+ return nil;
+}
+
+- (BOOL)yy_modelSetWithJSON:(id)json {
+ NSDictionary *dic = [NSObject _yy_dictionaryWithJSON:json];
+ return [self yy_modelSetWithDictionary:dic];
+}
+
+- (BOOL)yy_modelSetWithDictionary:(NSDictionary *)dic {
+ if (!dic || dic == (id)kCFNull) return NO;
+ if (![dic isKindOfClass:[NSDictionary class]]) return NO;
+
+
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:object_getClass(self)];
+ if (modelMeta->_keyMappedCount == 0) return NO;
+
+ if (modelMeta->_hasCustomWillTransformFromDictionary) {
+ dic = [((id<YYModel>)self) modelCustomWillTransformFromDictionary:dic];
+ if (![dic isKindOfClass:[NSDictionary class]]) return NO;
+ }
+
+ ModelSetContext context = {0};
+ context.modelMeta = (__bridge void *)(modelMeta);
+ context.model = (__bridge void *)(self);
+ context.dictionary = (__bridge void *)(dic);
+
+
+ if (modelMeta->_keyMappedCount >= CFDictionaryGetCount((CFDictionaryRef)dic)) {
+ CFDictionaryApplyFunction((CFDictionaryRef)dic, ModelSetWithDictionaryFunction, &context);
+ if (modelMeta->_keyPathPropertyMetas) {
+ CFArrayApplyFunction((CFArrayRef)modelMeta->_keyPathPropertyMetas,
+ CFRangeMake(0, CFArrayGetCount((CFArrayRef)modelMeta->_keyPathPropertyMetas)),
+ ModelSetWithPropertyMetaArrayFunction,
+ &context);
+ }
+ if (modelMeta->_multiKeysPropertyMetas) {
+ CFArrayApplyFunction((CFArrayRef)modelMeta->_multiKeysPropertyMetas,
+ CFRangeMake(0, CFArrayGetCount((CFArrayRef)modelMeta->_multiKeysPropertyMetas)),
+ ModelSetWithPropertyMetaArrayFunction,
+ &context);
+ }
+ } else {
+ CFArrayApplyFunction((CFArrayRef)modelMeta->_allPropertyMetas,
+ CFRangeMake(0, modelMeta->_keyMappedCount),
+ ModelSetWithPropertyMetaArrayFunction,
+ &context);
+ }
+
+ if (modelMeta->_hasCustomTransformFromDictionary) {
+ return [((id<YYModel>)self) modelCustomTransformFromDictionary:dic];
+ }
+ return YES;
+}
+
+- (id)yy_modelToJSONObject {
+ /*
+ Apple said:
+ The top level object is an NSArray or NSDictionary.
+ All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.
+ All dictionary keys are instances of NSString.
+ Numbers are not NaN or infinity.
+ */
+ id jsonObject = ModelToJSONObjectRecursive(self);
+ if ([jsonObject isKindOfClass:[NSArray class]]) return jsonObject;
+ if ([jsonObject isKindOfClass:[NSDictionary class]]) return jsonObject;
+ return nil;
+}
+
+- (NSData *)yy_modelToJSONData {
+ id jsonObject = [self yy_modelToJSONObject];
+ if (!jsonObject) return nil;
+ return [NSJSONSerialization dataWithJSONObject:jsonObject options:0 error:NULL];
+}
+
+- (NSString *)yy_modelToJSONString {
+ NSData *jsonData = [self yy_modelToJSONData];
+ if (jsonData.length == 0) return nil;
+ return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+}
+
+- (id)yy_modelCopy{
+ if (self == (id)kCFNull) return self;
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:self.class];
+ if (modelMeta->_nsType) return [self copy];
+
+ NSObject *one = [self.class new];
+ for (_YYModelPropertyMeta *propertyMeta in modelMeta->_allPropertyMetas) {
+ if (!propertyMeta->_getter || !propertyMeta->_setter) continue;
+
+ if (propertyMeta->_isCNumber) {
+ switch (propertyMeta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeBool: {
+ bool num = ((bool (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, bool))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeInt8:
+ case YYEncodingTypeUInt8: {
+ uint8_t num = ((bool (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, uint8_t))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeInt16:
+ case YYEncodingTypeUInt16: {
+ uint16_t num = ((uint16_t (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, uint16_t))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeInt32:
+ case YYEncodingTypeUInt32: {
+ uint32_t num = ((uint32_t (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, uint32_t))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeInt64:
+ case YYEncodingTypeUInt64: {
+ uint64_t num = ((uint64_t (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, uint64_t))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeFloat: {
+ float num = ((float (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeDouble: {
+ double num = ((double (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } break;
+ case YYEncodingTypeLongDouble: {
+ long double num = ((long double (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, long double))(void *) objc_msgSend)((id)one, propertyMeta->_setter, num);
+ } // break; commented for code coverage in next line
+ default: break;
+ }
+ } else {
+ switch (propertyMeta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeObject:
+ case YYEncodingTypeClass:
+ case YYEncodingTypeBlock: {
+ id value = ((id (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)one, propertyMeta->_setter, value);
+ } break;
+ case YYEncodingTypeSEL:
+ case YYEncodingTypePointer:
+ case YYEncodingTypeCString: {
+ size_t value = ((size_t (*)(id, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_getter);
+ ((void (*)(id, SEL, size_t))(void *) objc_msgSend)((id)one, propertyMeta->_setter, value);
+ } break;
+ case YYEncodingTypeStruct:
+ case YYEncodingTypeUnion: {
+ @try {
+ NSValue *value = [self valueForKey:NSStringFromSelector(propertyMeta->_getter)];
+ if (value) {
+ [one setValue:value forKey:propertyMeta->_name];
+ }
+ } @catch (NSException *exception) {}
+ } // break; commented for code coverage in next line
+ default: break;
+ }
+ }
+ }
+ return one;
+}
+
+- (void)yy_modelEncodeWithCoder:(NSCoder *)aCoder {
+ if (!aCoder) return;
+ if (self == (id)kCFNull) {
+ [((id<NSCoding>)self)encodeWithCoder:aCoder];
+ return;
+ }
+
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:self.class];
+ if (modelMeta->_nsType) {
+ [((id<NSCoding>)self)encodeWithCoder:aCoder];
+ return;
+ }
+
+ for (_YYModelPropertyMeta *propertyMeta in modelMeta->_allPropertyMetas) {
+ if (!propertyMeta->_getter) return;
+
+ if (propertyMeta->_isCNumber) {
+ NSNumber *value = ModelCreateNumberFromProperty(self, propertyMeta);
+ if (value != nil) [aCoder encodeObject:value forKey:propertyMeta->_name];
+ } else {
+ switch (propertyMeta->_type & YYEncodingTypeMask) {
+ case YYEncodingTypeObject: {
+ id value = ((id (*)(id, SEL))(void *)objc_msgSend)((id)self, propertyMeta->_getter);
+ if (value && (propertyMeta->_nsType || [value respondsToSelector:@selector(encodeWithCoder:)])) {
+ if ([value isKindOfClass:[NSValue class]]) {
+ if ([value isKindOfClass:[NSNumber class]]) {
+ [aCoder encodeObject:value forKey:propertyMeta->_name];
+ }
+ } else {
+ [aCoder encodeObject:value forKey:propertyMeta->_name];
+ }
+ }
+ } break;
+ case YYEncodingTypeSEL: {
+ SEL value = ((SEL (*)(id, SEL))(void *)objc_msgSend)((id)self, propertyMeta->_getter);
+ if (value) {
+ NSString *str = NSStringFromSelector(value);
+ [aCoder encodeObject:str forKey:propertyMeta->_name];
+ }
+ } break;
+ case YYEncodingTypeStruct:
+ case YYEncodingTypeUnion: {
+ if (propertyMeta->_isKVCCompatible && propertyMeta->_isStructAvailableForKeyedArchiver) {
+ @try {
+ NSValue *value = [self valueForKey:NSStringFromSelector(propertyMeta->_getter)];
+ [aCoder encodeObject:value forKey:propertyMeta->_name];
+ } @catch (NSException *exception) {}
+ }
+ } break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
+
+- (id)yy_modelInitWithCoder:(NSCoder *)aDecoder {
+ if (!aDecoder) return self;
+ if (self == (id)kCFNull) return self;
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:self.class];
+ if (modelMeta->_nsType) return self;
+
+ for (_YYModelPropertyMeta *propertyMeta in modelMeta->_allPropertyMetas) {
+ if (!propertyMeta->_setter) continue;
+
+ if (propertyMeta->_isCNumber) {
+ NSNumber *value = [aDecoder decodeObjectForKey:propertyMeta->_name];
+ if ([value isKindOfClass:[NSNumber class]]) {
+ ModelSetNumberToProperty(self, value, propertyMeta);
+ [value class];
+ }
+ } else {
+ YYEncodingType type = propertyMeta->_type & YYEncodingTypeMask;
+ switch (type) {
+ case YYEncodingTypeObject: {
+ id value = [aDecoder decodeObjectForKey:propertyMeta->_name];
+ ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)self, propertyMeta->_setter, value);
+ } break;
+ case YYEncodingTypeSEL: {
+ NSString *str = [aDecoder decodeObjectForKey:propertyMeta->_name];
+ if ([str isKindOfClass:[NSString class]]) {
+ SEL sel = NSSelectorFromString(str);
+ ((void (*)(id, SEL, SEL))(void *) objc_msgSend)((id)self, propertyMeta->_setter, sel);
+ }
+ } break;
+ case YYEncodingTypeStruct:
+ case YYEncodingTypeUnion: {
+ if (propertyMeta->_isKVCCompatible) {
+ @try {
+ NSValue *value = [aDecoder decodeObjectForKey:propertyMeta->_name];
+ if (value) [self setValue:value forKey:propertyMeta->_name];
+ } @catch (NSException *exception) {}
+ }
+ } break;
+
+ default:
+ break;
+ }
+ }
+ }
+ return self;
+}
+
+- (NSUInteger)yy_modelHash {
+ if (self == (id)kCFNull) return [self hash];
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:self.class];
+ if (modelMeta->_nsType) return [self hash];
+
+ NSUInteger value = 0;
+ NSUInteger count = 0;
+ for (_YYModelPropertyMeta *propertyMeta in modelMeta->_allPropertyMetas) {
+ if (!propertyMeta->_isKVCCompatible) continue;
+ value ^= [[self valueForKey:NSStringFromSelector(propertyMeta->_getter)] hash];
+ count++;
+ }
+ if (count == 0) value = (long)((__bridge void *)self);
+ return value;
+}
+
+- (BOOL)yy_modelIsEqual:(id)model {
+ if (self == model) return YES;
+ if (![model isMemberOfClass:self.class]) return NO;
+ _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:self.class];
+ if (modelMeta->_nsType) return [self isEqual:model];
+ if ([self hash] != [model hash]) return NO;
+
+ for (_YYModelPropertyMeta *propertyMeta in modelMeta->_allPropertyMetas) {
+ if (!propertyMeta->_isKVCCompatible) continue;
+ id this = [self valueForKey:NSStringFromSelector(propertyMeta->_getter)];
+ id that = [model valueForKey:NSStringFromSelector(propertyMeta->_getter)];
+ if (this == that) continue;
+ if (this == nil || that == nil) return NO;
+ if (![this isEqual:that]) return NO;
+ }
+ return YES;
+}
+
+- (NSString *)yy_modelDescription {
+ return ModelDescription(self);
+}
+
+@end
+
+
+
+@implementation NSArray (YYModel)
+
++ (NSArray *)yy_modelArrayWithClass:(Class)cls json:(id)json {
+ if (!json) return nil;
+ NSArray *arr = nil;
+ NSData *jsonData = nil;
+ if ([json isKindOfClass:[NSArray class]]) {
+ arr = json;
+ } else if ([json isKindOfClass:[NSString class]]) {
+ jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
+ } else if ([json isKindOfClass:[NSData class]]) {
+ jsonData = json;
+ }
+ if (jsonData) {
+ arr = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
+ if (![arr isKindOfClass:[NSArray class]]) arr = nil;
+ }
+ return [self yy_modelArrayWithClass:cls array:arr];
+}
+
++ (NSArray *)yy_modelArrayWithClass:(Class)cls array:(NSArray *)arr {
+ if (!cls || !arr) return nil;
+ NSMutableArray *result = [NSMutableArray new];
+ for (NSDictionary *dic in arr) {
+ if (![dic isKindOfClass:[NSDictionary class]]) continue;
+ NSObject *obj = [cls yy_modelWithDictionary:dic];
+ if (obj) [result addObject:obj];
+ }
+ return result;
+}
+
+@end
+
+
+@implementation NSDictionary (YYModel)
+
++ (NSDictionary *)yy_modelDictionaryWithClass:(Class)cls json:(id)json {
+ if (!json) return nil;
+ NSDictionary *dic = nil;
+ NSData *jsonData = nil;
+ if ([json isKindOfClass:[NSDictionary class]]) {
+ dic = json;
+ } else if ([json isKindOfClass:[NSString class]]) {
+ jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
+ } else if ([json isKindOfClass:[NSData class]]) {
+ jsonData = json;
+ }
+ if (jsonData) {
+ dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
+ if (![dic isKindOfClass:[NSDictionary class]]) dic = nil;
+ }
+ return [self yy_modelDictionaryWithClass:cls dictionary:dic];
+}
+
++ (NSDictionary *)yy_modelDictionaryWithClass:(Class)cls dictionary:(NSDictionary *)dic {
+ if (!cls || !dic) return nil;
+ NSMutableDictionary *result = [NSMutableDictionary new];
+ for (NSString *key in dic.allKeys) {
+ if (![key isKindOfClass:[NSString class]]) continue;
+ NSObject *obj = [cls yy_modelWithDictionary:dic[key]];
+ if (obj) result[key] = obj;
+ }
+ return result;
+}
+
+@end
diff --git a/EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.h b/EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.h
new file mode 100644
index 0000000..6b87458
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.h
@@ -0,0 +1,200 @@
+//
+// YYClassInfo.h
+// YYModel <https://github.com/ibireme/YYModel>
+//
+// Created by ibireme on 15/5/9.
+// Copyright (c) 2015 ibireme.
+//
+// This source code is licensed under the MIT-style license found in the
+// LICENSE file in the root directory of this source tree.
+//
+
+#import <Foundation/Foundation.h>
+#import <objc/runtime.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ Type encoding's type.
+ */
+typedef NS_OPTIONS(NSUInteger, YYEncodingType) {
+ YYEncodingTypeMask = 0xFF, ///< mask of type value
+ YYEncodingTypeUnknown = 0, ///< unknown
+ YYEncodingTypeVoid = 1, ///< void
+ YYEncodingTypeBool = 2, ///< bool
+ YYEncodingTypeInt8 = 3, ///< char / BOOL
+ YYEncodingTypeUInt8 = 4, ///< unsigned char
+ YYEncodingTypeInt16 = 5, ///< short
+ YYEncodingTypeUInt16 = 6, ///< unsigned short
+ YYEncodingTypeInt32 = 7, ///< int
+ YYEncodingTypeUInt32 = 8, ///< unsigned int
+ YYEncodingTypeInt64 = 9, ///< long long
+ YYEncodingTypeUInt64 = 10, ///< unsigned long long
+ YYEncodingTypeFloat = 11, ///< float
+ YYEncodingTypeDouble = 12, ///< double
+ YYEncodingTypeLongDouble = 13, ///< long double
+ YYEncodingTypeObject = 14, ///< id
+ YYEncodingTypeClass = 15, ///< Class
+ YYEncodingTypeSEL = 16, ///< SEL
+ YYEncodingTypeBlock = 17, ///< block
+ YYEncodingTypePointer = 18, ///< void*
+ YYEncodingTypeStruct = 19, ///< struct
+ YYEncodingTypeUnion = 20, ///< union
+ YYEncodingTypeCString = 21, ///< char*
+ YYEncodingTypeCArray = 22, ///< char[10] (for example)
+
+ YYEncodingTypeQualifierMask = 0xFF00, ///< mask of qualifier
+ YYEncodingTypeQualifierConst = 1 << 8, ///< const
+ YYEncodingTypeQualifierIn = 1 << 9, ///< in
+ YYEncodingTypeQualifierInout = 1 << 10, ///< inout
+ YYEncodingTypeQualifierOut = 1 << 11, ///< out
+ YYEncodingTypeQualifierBycopy = 1 << 12, ///< bycopy
+ YYEncodingTypeQualifierByref = 1 << 13, ///< byref
+ YYEncodingTypeQualifierOneway = 1 << 14, ///< oneway
+
+ YYEncodingTypePropertyMask = 0xFF0000, ///< mask of property
+ YYEncodingTypePropertyReadonly = 1 << 16, ///< readonly
+ YYEncodingTypePropertyCopy = 1 << 17, ///< copy
+ YYEncodingTypePropertyRetain = 1 << 18, ///< retain
+ YYEncodingTypePropertyNonatomic = 1 << 19, ///< nonatomic
+ YYEncodingTypePropertyWeak = 1 << 20, ///< weak
+ YYEncodingTypePropertyCustomGetter = 1 << 21, ///< getter=
+ YYEncodingTypePropertyCustomSetter = 1 << 22, ///< setter=
+ YYEncodingTypePropertyDynamic = 1 << 23, ///< @dynamic
+};
+
+/**
+ Get the type from a Type-Encoding string.
+
+ @discussion See also:
+ https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
+ https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html
+
+ @param typeEncoding A Type-Encoding string.
+ @return The encoding type.
+ */
+YYEncodingType YYEncodingGetType(const char *typeEncoding);
+
+
+/**
+ Instance variable information.
+ */
+@interface YYClassIvarInfo : NSObject
+@property (nonatomic, assign, readonly) Ivar ivar; ///< ivar opaque struct
+@property (nonatomic, strong, readonly) NSString *name; ///< Ivar's name
+@property (nonatomic, assign, readonly) ptrdiff_t offset; ///< Ivar's offset
+@property (nonatomic, strong, readonly) NSString *typeEncoding; ///< Ivar's type encoding
+@property (nonatomic, assign, readonly) YYEncodingType type; ///< Ivar's type
+
+/**
+ Creates and returns an ivar info object.
+
+ @param ivar ivar opaque struct
+ @return A new object, or nil if an error occurs.
+ */
+- (instancetype)initWithIvar:(Ivar)ivar;
+@end
+
+
+/**
+ Method information.
+ */
+@interface YYClassMethodInfo : NSObject
+@property (nonatomic, assign, readonly) Method method; ///< method opaque struct
+@property (nonatomic, strong, readonly) NSString *name; ///< method name
+@property (nonatomic, assign, readonly) SEL sel; ///< method's selector
+@property (nonatomic, assign, readonly) IMP imp; ///< method's implementation
+@property (nonatomic, strong, readonly) NSString *typeEncoding; ///< method's parameter and return types
+@property (nonatomic, strong, readonly) NSString *returnTypeEncoding; ///< return value's type
+@property (nullable, nonatomic, strong, readonly) NSArray<NSString *> *argumentTypeEncodings; ///< array of arguments' type
+
+/**
+ Creates and returns a method info object.
+
+ @param method method opaque struct
+ @return A new object, or nil if an error occurs.
+ */
+- (instancetype)initWithMethod:(Method)method;
+@end
+
+
+/**
+ Property information.
+ */
+@interface YYClassPropertyInfo : NSObject
+@property (nonatomic, assign, readonly) objc_property_t property; ///< property's opaque struct
+@property (nonatomic, strong, readonly) NSString *name; ///< property's name
+@property (nonatomic, assign, readonly) YYEncodingType type; ///< property's type
+@property (nonatomic, strong, readonly) NSString *typeEncoding; ///< property's encoding value
+@property (nonatomic, strong, readonly) NSString *ivarName; ///< property's ivar name
+@property (nullable, nonatomic, assign, readonly) Class cls; ///< may be nil
+@property (nullable, nonatomic, strong, readonly) NSArray<NSString *> *protocols; ///< may nil
+@property (nonatomic, assign, readonly) SEL getter; ///< getter (nonnull)
+@property (nonatomic, assign, readonly) SEL setter; ///< setter (nonnull)
+
+/**
+ Creates and returns a property info object.
+
+ @param property property opaque struct
+ @return A new object, or nil if an error occurs.
+ */
+- (instancetype)initWithProperty:(objc_property_t)property;
+@end
+
+
+/**
+ Class information for a class.
+ */
+@interface YYClassInfo : NSObject
+@property (nonatomic, assign, readonly) Class cls; ///< class object
+@property (nullable, nonatomic, assign, readonly) Class superCls; ///< super class object
+@property (nullable, nonatomic, assign, readonly) Class metaCls; ///< class's meta class object
+@property (nonatomic, readonly) BOOL isMeta; ///< whether this class is meta class
+@property (nonatomic, strong, readonly) NSString *name; ///< class name
+@property (nullable, nonatomic, strong, readonly) YYClassInfo *superClassInfo; ///< super class's class info
+@property (nullable, nonatomic, strong, readonly) NSDictionary<NSString *, YYClassIvarInfo *> *ivarInfos; ///< ivars
+@property (nullable, nonatomic, strong, readonly) NSDictionary<NSString *, YYClassMethodInfo *> *methodInfos; ///< methods
+@property (nullable, nonatomic, strong, readonly) NSDictionary<NSString *, YYClassPropertyInfo *> *propertyInfos; ///< properties
+
+/**
+ If the class is changed (for example: you add a method to this class with
+ 'class_addMethod()'), you should call this method to refresh the class info cache.
+
+ After called this method, `needUpdate` will returns `YES`, and you should call
+ 'classInfoWithClass' or 'classInfoWithClassName' to get the updated class info.
+ */
+- (void)setNeedUpdate;
+
+/**
+ If this method returns `YES`, you should stop using this instance and call
+ `classInfoWithClass` or `classInfoWithClassName` to get the updated class info.
+
+ @return Whether this class info need update.
+ */
+- (BOOL)needUpdate;
+
+/**
+ Get the class info of a specified Class.
+
+ @discussion This method will cache the class info and super-class info
+ at the first access to the Class. This method is thread-safe.
+
+ @param cls A class.
+ @return A class info, or nil if an error occurs.
+ */
++ (nullable instancetype)classInfoWithClass:(Class)cls;
+
+/**
+ Get the class info of a specified Class.
+
+ @discussion This method will cache the class info and super-class info
+ at the first access to the Class. This method is thread-safe.
+
+ @param className A class name.
+ @return A class info, or nil if an error occurs.
+ */
++ (nullable instancetype)classInfoWithClassName:(NSString *)className;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.m b/EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.m
new file mode 100644
index 0000000..16df6d9
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Venders/YYModel/YYClassInfo.m
@@ -0,0 +1,362 @@
+//
+// YYClassInfo.m
+// YYModel <https://github.com/ibireme/YYModel>
+//
+// Created by ibireme on 15/5/9.
+// Copyright (c) 2015 ibireme.
+//
+// This source code is licensed under the MIT-style license found in the
+// LICENSE file in the root directory of this source tree.
+//
+
+#import "YYClassInfo.h"
+#import <objc/runtime.h>
+
+YYEncodingType YYEncodingGetType(const char *typeEncoding) {
+ char *type = (char *)typeEncoding;
+ if (!type) return YYEncodingTypeUnknown;
+ size_t len = strlen(type);
+ if (len == 0) return YYEncodingTypeUnknown;
+
+ YYEncodingType qualifier = 0;
+ bool prefix = true;
+ while (prefix) {
+ switch (*type) {
+ case 'r': {
+ qualifier |= YYEncodingTypeQualifierConst;
+ type++;
+ } break;
+ case 'n': {
+ qualifier |= YYEncodingTypeQualifierIn;
+ type++;
+ } break;
+ case 'N': {
+ qualifier |= YYEncodingTypeQualifierInout;
+ type++;
+ } break;
+ case 'o': {
+ qualifier |= YYEncodingTypeQualifierOut;
+ type++;
+ } break;
+ case 'O': {
+ qualifier |= YYEncodingTypeQualifierBycopy;
+ type++;
+ } break;
+ case 'R': {
+ qualifier |= YYEncodingTypeQualifierByref;
+ type++;
+ } break;
+ case 'V': {
+ qualifier |= YYEncodingTypeQualifierOneway;
+ type++;
+ } break;
+ default: { prefix = false; } break;
+ }
+ }
+
+ len = strlen(type);
+ if (len == 0) return YYEncodingTypeUnknown | qualifier;
+
+ switch (*type) {
+ case 'v': return YYEncodingTypeVoid | qualifier;
+ case 'B': return YYEncodingTypeBool | qualifier;
+ case 'c': return YYEncodingTypeInt8 | qualifier;
+ case 'C': return YYEncodingTypeUInt8 | qualifier;
+ case 's': return YYEncodingTypeInt16 | qualifier;
+ case 'S': return YYEncodingTypeUInt16 | qualifier;
+ case 'i': return YYEncodingTypeInt32 | qualifier;
+ case 'I': return YYEncodingTypeUInt32 | qualifier;
+ case 'l': return YYEncodingTypeInt32 | qualifier;
+ case 'L': return YYEncodingTypeUInt32 | qualifier;
+ case 'q': return YYEncodingTypeInt64 | qualifier;
+ case 'Q': return YYEncodingTypeUInt64 | qualifier;
+ case 'f': return YYEncodingTypeFloat | qualifier;
+ case 'd': return YYEncodingTypeDouble | qualifier;
+ case 'D': return YYEncodingTypeLongDouble | qualifier;
+ case '#': return YYEncodingTypeClass | qualifier;
+ case ':': return YYEncodingTypeSEL | qualifier;
+ case '*': return YYEncodingTypeCString | qualifier;
+ case '^': return YYEncodingTypePointer | qualifier;
+ case '[': return YYEncodingTypeCArray | qualifier;
+ case '(': return YYEncodingTypeUnion | qualifier;
+ case '{': return YYEncodingTypeStruct | qualifier;
+ case '@': {
+ if (len == 2 && *(type + 1) == '?')
+ return YYEncodingTypeBlock | qualifier;
+ else
+ return YYEncodingTypeObject | qualifier;
+ }
+ default: return YYEncodingTypeUnknown | qualifier;
+ }
+}
+
+@implementation YYClassIvarInfo
+
+- (instancetype)initWithIvar:(Ivar)ivar {
+ if (!ivar) return nil;
+ self = [super init];
+ _ivar = ivar;
+ const char *name = ivar_getName(ivar);
+ if (name) {
+ _name = [NSString stringWithUTF8String:name];
+ }
+ _offset = ivar_getOffset(ivar);
+ const char *typeEncoding = ivar_getTypeEncoding(ivar);
+ if (typeEncoding) {
+ _typeEncoding = [NSString stringWithUTF8String:typeEncoding];
+ _type = YYEncodingGetType(typeEncoding);
+ }
+ return self;
+}
+
+@end
+
+@implementation YYClassMethodInfo
+
+- (instancetype)initWithMethod:(Method)method {
+ if (!method) return nil;
+ self = [super init];
+ _method = method;
+ _sel = method_getName(method);
+ _imp = method_getImplementation(method);
+ const char *name = sel_getName(_sel);
+ if (name) {
+ _name = [NSString stringWithUTF8String:name];
+ }
+ const char *typeEncoding = method_getTypeEncoding(method);
+ if (typeEncoding) {
+ _typeEncoding = [NSString stringWithUTF8String:typeEncoding];
+ }
+ char *returnType = method_copyReturnType(method);
+ if (returnType) {
+ _returnTypeEncoding = [NSString stringWithUTF8String:returnType];
+ free(returnType);
+ }
+ unsigned int argumentCount = method_getNumberOfArguments(method);
+ if (argumentCount > 0) {
+ NSMutableArray *argumentTypes = [NSMutableArray new];
+ for (unsigned int i = 0; i < argumentCount; i++) {
+ char *argumentType = method_copyArgumentType(method, i);
+ NSString *type = argumentType ? [NSString stringWithUTF8String:argumentType] : nil;
+ [argumentTypes addObject:type ? type : @""];
+ if (argumentType) free(argumentType);
+ }
+ _argumentTypeEncodings = argumentTypes;
+ }
+ return self;
+}
+
+@end
+
+@implementation YYClassPropertyInfo
+
+- (instancetype)initWithProperty:(objc_property_t)property {
+ if (!property) return nil;
+ self = [super init];
+ _property = property;
+ const char *name = property_getName(property);
+ if (name) {
+ _name = [NSString stringWithUTF8String:name];
+ }
+
+ YYEncodingType type = 0;
+ unsigned int attrCount;
+ objc_property_attribute_t *attrs = property_copyAttributeList(property, &attrCount);
+ for (unsigned int i = 0; i < attrCount; i++) {
+ switch (attrs[i].name[0]) {
+ case 'T': { // Type encoding
+ if (attrs[i].value) {
+ _typeEncoding = [NSString stringWithUTF8String:attrs[i].value];
+ type = YYEncodingGetType(attrs[i].value);
+
+ if ((type & YYEncodingTypeMask) == YYEncodingTypeObject && _typeEncoding.length) {
+ NSScanner *scanner = [NSScanner scannerWithString:_typeEncoding];
+ if (![scanner scanString:@"@\"" intoString:NULL]) continue;
+
+ NSString *clsName = nil;
+ if ([scanner scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString:@"\"<"] intoString:&clsName]) {
+ if (clsName.length) _cls = objc_getClass(clsName.UTF8String);
+ }
+
+ NSMutableArray *protocols = nil;
+ while ([scanner scanString:@"<" intoString:NULL]) {
+ NSString* protocol = nil;
+ if ([scanner scanUpToString:@">" intoString: &protocol]) {
+ if (protocol.length) {
+ if (!protocols) protocols = [NSMutableArray new];
+ [protocols addObject:protocol];
+ }
+ }
+ [scanner scanString:@">" intoString:NULL];
+ }
+ _protocols = protocols;
+ }
+ }
+ } break;
+ case 'V': { // Instance variable
+ if (attrs[i].value) {
+ _ivarName = [NSString stringWithUTF8String:attrs[i].value];
+ }
+ } break;
+ case 'R': {
+ type |= YYEncodingTypePropertyReadonly;
+ } break;
+ case 'C': {
+ type |= YYEncodingTypePropertyCopy;
+ } break;
+ case '&': {
+ type |= YYEncodingTypePropertyRetain;
+ } break;
+ case 'N': {
+ type |= YYEncodingTypePropertyNonatomic;
+ } break;
+ case 'D': {
+ type |= YYEncodingTypePropertyDynamic;
+ } break;
+ case 'W': {
+ type |= YYEncodingTypePropertyWeak;
+ } break;
+ case 'G': {
+ type |= YYEncodingTypePropertyCustomGetter;
+ if (attrs[i].value) {
+ _getter = NSSelectorFromString([NSString stringWithUTF8String:attrs[i].value]);
+ }
+ } break;
+ case 'S': {
+ type |= YYEncodingTypePropertyCustomSetter;
+ if (attrs[i].value) {
+ _setter = NSSelectorFromString([NSString stringWithUTF8String:attrs[i].value]);
+ }
+ } // break; commented for code coverage in next line
+ default: break;
+ }
+ }
+ if (attrs) {
+ free(attrs);
+ attrs = NULL;
+ }
+
+ _type = type;
+ if (_name.length) {
+ if (!_getter) {
+ _getter = NSSelectorFromString(_name);
+ }
+ if (!_setter) {
+ _setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:", [_name substringToIndex:1].uppercaseString, [_name substringFromIndex:1]]);
+ }
+ }
+ return self;
+}
+
+@end
+
+@implementation YYClassInfo {
+ BOOL _needUpdate;
+}
+
+- (instancetype)initWithClass:(Class)cls {
+ if (!cls) return nil;
+ self = [super init];
+ _cls = cls;
+ _superCls = class_getSuperclass(cls);
+ _isMeta = class_isMetaClass(cls);
+ if (!_isMeta) {
+ _metaCls = objc_getMetaClass(class_getName(cls));
+ }
+ _name = NSStringFromClass(cls);
+ [self _update];
+
+ _superClassInfo = [self.class classInfoWithClass:_superCls];
+ return self;
+}
+
+- (void)_update {
+ _ivarInfos = nil;
+ _methodInfos = nil;
+ _propertyInfos = nil;
+
+ Class cls = self.cls;
+ unsigned int methodCount = 0;
+ Method *methods = class_copyMethodList(cls, &methodCount);
+ if (methods) {
+ NSMutableDictionary *methodInfos = [NSMutableDictionary new];
+ _methodInfos = methodInfos;
+ for (unsigned int i = 0; i < methodCount; i++) {
+ YYClassMethodInfo *info = [[YYClassMethodInfo alloc] initWithMethod:methods[i]];
+ if (info.name) methodInfos[info.name] = info;
+ }
+ free(methods);
+ }
+ unsigned int propertyCount = 0;
+ objc_property_t *properties = class_copyPropertyList(cls, &propertyCount);
+ if (properties) {
+ NSMutableDictionary *propertyInfos = [NSMutableDictionary new];
+ _propertyInfos = propertyInfos;
+ for (unsigned int i = 0; i < propertyCount; i++) {
+ YYClassPropertyInfo *info = [[YYClassPropertyInfo alloc] initWithProperty:properties[i]];
+ if (info.name) propertyInfos[info.name] = info;
+ }
+ free(properties);
+ }
+
+ unsigned int ivarCount = 0;
+ Ivar *ivars = class_copyIvarList(cls, &ivarCount);
+ if (ivars) {
+ NSMutableDictionary *ivarInfos = [NSMutableDictionary new];
+ _ivarInfos = ivarInfos;
+ for (unsigned int i = 0; i < ivarCount; i++) {
+ YYClassIvarInfo *info = [[YYClassIvarInfo alloc] initWithIvar:ivars[i]];
+ if (info.name) ivarInfos[info.name] = info;
+ }
+ free(ivars);
+ }
+
+ if (!_ivarInfos) _ivarInfos = @{};
+ if (!_methodInfos) _methodInfos = @{};
+ if (!_propertyInfos) _propertyInfos = @{};
+
+ _needUpdate = NO;
+}
+
+- (void)setNeedUpdate {
+ _needUpdate = YES;
+}
+
+- (BOOL)needUpdate {
+ return _needUpdate;
+}
+
++ (instancetype)classInfoWithClass:(Class)cls {
+ if (!cls) return nil;
+ static CFMutableDictionaryRef classCache;
+ static CFMutableDictionaryRef metaCache;
+ static dispatch_once_t onceToken;
+ static dispatch_semaphore_t lock;
+ dispatch_once(&onceToken, ^{
+ classCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ metaCache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+ lock = dispatch_semaphore_create(1);
+ });
+ dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
+ YYClassInfo *info = CFDictionaryGetValue(class_isMetaClass(cls) ? metaCache : classCache, (__bridge const void *)(cls));
+ if (info && info->_needUpdate) {
+ [info _update];
+ }
+ dispatch_semaphore_signal(lock);
+ if (!info) {
+ info = [[YYClassInfo alloc] initWithClass:cls];
+ if (info) {
+ dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
+ CFDictionarySetValue(info.isMeta ? metaCache : classCache, (__bridge const void *)(cls), (__bridge const void *)(info));
+ dispatch_semaphore_signal(lock);
+ }
+ }
+ return info;
+}
+
++ (instancetype)classInfoWithClassName:(NSString *)className {
+ Class cls = NSClassFromString(className);
+ return [self classInfoWithClass:cls];
+}
+
+@end
diff --git a/EZSDK/EZSDK/EZ/Venders/YYModel/YYModel.h b/EZSDK/EZSDK/EZ/Venders/YYModel/YYModel.h
new file mode 100644
index 0000000..e1154ee
--- /dev/null
+++ b/EZSDK/EZSDK/EZ/Venders/YYModel/YYModel.h
@@ -0,0 +1,22 @@
+//
+// YYModel.h
+// YYModel <https://github.com/ibireme/YYModel>
+//
+// Created by ibireme on 15/5/10.
+// Copyright (c) 2015 ibireme.
+//
+// This source code is licensed under the MIT-style license found in the
+// LICENSE file in the root directory of this source tree.
+//
+
+#import <Foundation/Foundation.h>
+
+#if __has_include(<YYModel/YYModel.h>)
+FOUNDATION_EXPORT double YYModelVersionNumber;
+FOUNDATION_EXPORT const unsigned char YYModelVersionString[];
+#import <YYModel/NSObject+YYModel.h>
+#import <YYModel/YYClassInfo.h>
+#else
+#import "NSObject+YYModel.h"
+#import "YYClassInfo.h"
+#endif
diff --git a/EZSDK/EZSDK/EZDeviceInfo.h b/EZSDK/EZSDK/EZDeviceInfo.h
new file mode 100644
index 0000000..60a8460
--- /dev/null
+++ b/EZSDK/EZSDK/EZDeviceInfo.h
@@ -0,0 +1,55 @@
+//
+// EZDeviceInfo.h
+// EzvizOpenSDK
+//
+// Created by DeJohn Dong on 15/9/16.
+// Copyright (c) 2015骞� Ezviz. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+/// 姝ょ被涓鸿澶囦俊鎭璞�
+@interface EZDeviceInfo : NSObject
+
+/// 璁惧鍏宠仈鐨勯�氶亾淇℃伅
+@property (nonatomic, strong) NSArray *cameraInfo;
+/// 璁惧鍏宠仈鐨勯�氶亾鏁伴噺
+@property (nonatomic) NSInteger cameraNum;
+/// 鍏锋湁闃叉姢鑳藉姏鐨勮澶囧竷鎾ら槻鐘舵�侊細0-鐫$湢锛�8-鍦ㄥ锛�16-澶栧嚭锛屾櫘閫欼PC甯冩挙闃茬姸鎬侊細0-鎾ら槻锛�1-甯冮槻
+@property (nonatomic) NSInteger defence;
+/// 璁惧鍏宠仈鐨勬帰娴嬪櫒鏁伴噺
+@property (nonatomic) NSInteger detectorNum;
+/// 璁惧鍏宠仈鐨勬帰娴嬪櫒淇℃伅
+@property (nonatomic, strong) NSArray *detectorInfo;
+/// 璁惧鍥剧墖
+@property (nonatomic, copy) NSString *deviceCover;
+/// 璁惧鍚嶇О
+@property (nonatomic, copy) NSString *deviceName;
+/// 璁惧搴忓垪鍙�
+@property (nonatomic, copy) NSString *deviceSerial;
+/// 璁惧绫诲瀷
+@property (nonatomic, copy) NSString *deviceType;
+/// 璁惧鐗堟湰鍙�
+@property (nonatomic, copy) NSString *deviceVersion;
+/// 璁惧鏄惁寮�鍚姞瀵�
+@property (nonatomic) BOOL isEncrypt;
+/// 璁惧鐘舵�侊紝1-鍦ㄧ嚎锛�2-涓嶅湪绾�
+@property (nonatomic) NSInteger status;
+/// 鏄惁鏀寔瀵硅 0-涓嶆敮鎸佸璁诧紝1-鏀寔鍏ㄥ弻宸ュ璁诧紝3-鏀寔鍗婂弻宸ュ璁�
+@property (nonatomic) NSInteger isSupportTalk;
+/// 鏄惁鏀寔浜戝彴鎺у埗
+@property (nonatomic) BOOL isSupportPTZ;
+/// 鏄惁鏀寔鏀惧ぇ
+@property (nonatomic) BOOL isSupportZoom;
+///鏄惁鏀寔鎻愮ず闊冲紑鍏�
+@property (nonatomic) BOOL isSupportAudioOnOff;
+/// 鏄惁鏀寔涓績闀滃儚缈昏浆
+@property (nonatomic) BOOL isSupportMirrorCenter;
+/// 鏄惁鏀寔澹版尝閰嶇綉
+@property (nonatomic) BOOL isSupportSoundWave;
+/// 璁惧澶х被
+@property (nonatomic,copy) NSString *category;
+/// 娣诲姞鏃堕棿
+@property (nonatomic,strong) NSDate *addTime;
+
+@end
diff --git a/EZSDK/EZSDK/EZSDK.h b/EZSDK/EZSDK/EZSDK.h
index 9325728..9a39d58 100644
--- a/EZSDK/EZSDK/EZSDK.h
+++ b/EZSDK/EZSDK/EZSDK.h
@@ -9,46 +9,53 @@
#import "EZDeviceInfo.h"
@interface EZSDK : NSObject
+///sharedInstance
++ (instancetype)sharedInstance;
+
/**
鍒濆鍖朣DK
浼犲叆鍥藉唴鐗坘ey 鍜屾捣澶栫増globalAppKey
*/
-+ (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey;
+- (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey;
/**
璁剧疆SDK鐨刟ccessToken
*/
-+(void)setEZAccessToken:(NSString *) accessToken;
+- (void)setEZAccessToken:(NSString *) accessToken;
/**
璁剧疆HDLSDK鐨刟ccessToken
*/
-+(void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *) refreshToken;
+- (void)setHDlAccessToken:(NSString *)accessToken refreshToken:(NSString *) refreshToken;
/**
璁剧疆SDK鐨勬渤涓滄帴鍙g殑requestHttpsHost鍜屽钩鍙� 鏍囪瘑锛�1.on+(榛樿) 2.evoyo
*/
-+(void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId;
+- (void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId;
/**
鐩存帴璺宠浆鍒拌悿鐭虫憚鍍忓ご鍒楄〃
*/
-+(void)go2EZvizMonitor;
+- (void)go2EZvizMonitor;
/**
璺宠浆娣诲姞娣诲姞璁惧
*/
-+(void)addEzvizMonitor;
+- (void)addEzvizMonitor;
/**
鏌ョ湅瑙嗛鐩戞帶鐩存挱
*/
-+(void)Play:(EZDeviceInfo*)deviceInfo;
+- (void)Play:(EZDeviceInfo*)deviceInfo;
/// 鎸囧畾搴忓垪鍙� 鏌ョ湅瑙嗛鐩戞帶鐩存挱
/// @param deviceSerial 搴忓垪鍙�
-+(void)PlayWithDeviceSerial:(NSString *)deviceSerial;
+- (void)PlayWithDeviceSerial:(NSString *)deviceSerial;
/**
鎵撳紑鎽勫儚澶磋缃〉闈�
*/
-+(void)setting:(EZDeviceInfo*)deviceInfo;
+- (void)setting:(EZDeviceInfo*)deviceInfo;
/**
鍥炴斁鎾斁鍘嗗彶
*/
-+(void)playBackVideo:(EZDeviceInfo*)deviceInfo;
+- (void)playBackVideo:(EZDeviceInfo*)deviceInfo;
+
+////鏌ョ湅鍛婅淇℃伅
+//- (void)goToEZMessagePhotoVC:(EZAlarmInfo*)alarmInfo;
+
@end
diff --git a/EZSDK/EZSDK/EZSDK.m b/EZSDK/EZSDK/EZSDK.m
index cfb414f..f8d0607 100644
--- a/EZSDK/EZSDK/EZSDK.m
+++ b/EZSDK/EZSDK/EZSDK.m
@@ -18,12 +18,24 @@
#import "EZPlaybackViewController.h"
#import "EZDeviceTableViewController.h"
#import "EZHCNetDeviceSDK.h"
-
+#import "EZMessagePhotoViewController.h"
@implementation EZSDK
+
+///
++ (instancetype)sharedInstance{
+ static EZSDK *instance = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ if (!instance) {
+ instance = [[EZSDK alloc] init];
+ }
+ });
+ return instance;
+}
static BOOL isHavelibInit=NO;
@@ -31,7 +43,7 @@
鍒濆鍖朣DK
浼犲叆鍥藉唴鐗坘ey 鍜屾捣澶栫増globalAppKey
*/
-+ (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey
+- (BOOL)initLibWithAppKey:(NSString *)appKey globalAppKey:(NSString *)globalAppKey
{
if (!isHavelibInit) {
@@ -57,7 +69,7 @@
/**
璁剧疆SDK鐨刟ccessToken
*/
-+(void)setEZAccessToken:(NSString *) accessToken
+-(void)setEZAccessToken:(NSString *) accessToken
{
[[GlobalKit shareKit] setAccessToken:accessToken];
[EZOPENSDK setAccessToken:accessToken];
@@ -66,7 +78,7 @@
/**
璁剧疆HDLSDK鐨刟ccessToken
*/
-+(void)setHDlAccessToken:(NSString *) accessToken refreshToken:(NSString *) refreshToken
+-(void)setHDlAccessToken:(NSString *) accessToken refreshToken:(NSString *) refreshToken
{
[[GlobalKit shareKit] setHdlAccessToken:accessToken];
[[GlobalKit shareKit] setHdlRefreshToken:refreshToken];
@@ -74,14 +86,14 @@
/**
璁剧疆SDK鐨勬渤涓滄帴鍙g殑requestHttpsHost鍜屽钩鍙� 鏍囪瘑锛�1.on+(榛樿) 2.evoyo
*/
-+(void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId{
+-(void)setRequestHttpsHostAndPlatform:(NSString *) requestHttpsHost platform:(int)platform homeId:(NSString *)homeId{
[[GlobalKit shareKit] setGlobalRequestHttpsHost:requestHttpsHost];
[[GlobalKit shareKit] setHdlPlatform:platform];
[[GlobalKit shareKit] setHdlHomeId:homeId];
}
//鑾峰彇褰撳墠灞忓箷鏄剧ず鐨剉iewcontroller (杩欓噷闈㈣幏鍙栫殑鐩稿綋浜巖ootViewController)
-+(UINavigationController *)getCurrentVC
+-(UINavigationController *)getCurrentVC
{
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
@@ -104,7 +116,7 @@
/**
鐩存帴璺宠浆鍒拌悿鐭虫憚鍍忓ご鍒楄〃
*/
-+(void)go2EZvizMonitor
+-(void)go2EZvizMonitor
{
// NSLog(@"go2EZvizMonitor");
//鑾峰彇EZMain鐨剆troyboard鏂囦欢
@@ -121,7 +133,7 @@
/**
璺宠浆娣诲姞娣诲姞璁惧
*/
-+(void)addEzvizMonitor
+-(void)addEzvizMonitor
{
// NSLog(@"娣诲姞鎽勫儚澶�");
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
@@ -139,7 +151,7 @@
/**
鏌ョ湅瑙嗛鐩戞帶鐩存挱
*/
-+(void)Play:(EZDeviceInfo*)deviceInfo
+-(void)Play:(EZDeviceInfo*)deviceInfo
{
UIStoryboard *addDeviceStoryBoard = [UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
EZLivePlayViewController *rootViewController = [addDeviceStoryBoard instantiateViewControllerWithIdentifier:@"EZLivePlayViewController"];
@@ -155,7 +167,7 @@
/// 鎸囧畾搴忓垪鍙锋挱鏀�
/// @param deviceSerial 搴忓垪鍙�
-+(void)PlayWithDeviceSerial:(NSString *)deviceSerial{
+-(void)PlayWithDeviceSerial:(NSString *)deviceSerial{
//鑾峰彇璁惧鍒楄〃鎺ュ彛
[EZOpenSDK getDeviceInfo:deviceSerial completion:^(EZDeviceInfo *deviceInfo, NSError *error) {
if(error)
@@ -172,7 +184,7 @@
/**
鎵撳紑鎽勫儚澶磋缃〉闈�
*/
-+(void)setting:(EZDeviceInfo*)deviceInfo
+-(void)setting:(EZDeviceInfo*)deviceInfo
{
UIStoryboard *settingStoryBoard=[UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
EZSettingViewController *settingVC=[settingStoryBoard instantiateViewControllerWithIdentifier:@"EZSettingViewController"];
@@ -184,7 +196,7 @@
/**
鍥炴斁鎾斁鍘嗗彶
*/
-+(void)playBackVideo:(EZDeviceInfo*)deviceInfo
+-(void)playBackVideo:(EZDeviceInfo*)deviceInfo
{
UIStoryboard *playBackStoryBoard=[UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
EZPlaybackViewController *playBackVC=[playBackStoryBoard instantiateViewControllerWithIdentifier:@"EZPlaybackViewController"];
@@ -193,7 +205,17 @@
[[self getCurrentVC] pushViewController:playBackVC animated:YES];
}
-
+////
+//-(void)goToEZMessagePhotoVC:(EZAlarmInfo*)alarmInfo{
+// UIStoryboard *addDeviceStoryBoard = [UIStoryboard storyboardWithName:@"EZMain" bundle:nil];
+// EZMessagePhotoViewController *rootViewController = [addDeviceStoryBoard instantiateViewControllerWithIdentifier:@"EZMessagePhotoViewController"];
+// // NSLog(@"play--iphone--rootViewController");
+// rootViewController.info = alarmInfo;
+//// NSLog(@"play--iphone--deviceName -%@",rootViewController.deviceInfo.deviceName);
+//// rootViewController.cameraIndex=0;
+// [[self getCurrentVC] setNavigationBarHidden:NO];
+// [[self getCurrentVC] pushViewController:rootViewController animated:YES];
+//}
//+(void)MonitorPushMessage:(NSString *)MonitorType ID:(NSString *)ID
//{
// [CommonList login];
--
Gitblit v1.8.0