JLChen
2021-05-18 a869383e163a18cdedcf587383c1eca043129754
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
//
//  Copyright © 2019 dahua. All rights reserved.
//
 
#import "LCApplicationDataManager.h"
 
 
#define APPID             @"GLOBAL_CONFIG_APPLICATION_APPID"
#define OVERSEAAPPID      @"GLOBAL_CONFIG_APPLICATION_OVERSEA_APPID"
#define APPSECRET         @"GLOBAL_CONFIG_APPLICATION_APPSECRET"
#define OVERSEAAPPSECRET  @"GLOBAL_CONFIG_APPLICATION_OVERSEA_APPSECRET"
#define HOSTAPI           @"GLOBAL_CONFIG_APPLICATION_HOSTAPI"
#define OVERSEAHOSTAPI    @"GLOBAL_CONFIG_APPLICATION_OVERSEA_HOSTAPI"
#define MANAGERTOKEN      @"GLOBAL_AUTH_MANAGER_TOKEN"
#define USERTOKEN         @"GLOBAL_AUTH_USER_TOKEN"
#define EXPIRETIME        @"GLOBAL_AUTH_EXPIRE_TIME"
#define CURRENTMODE       @"GLOBAL_JOINT_CURRENT_MODE"
 
///默认请求基地址
//#define DEFAULTHOSTAPICHN @"https://funcopenapi.lechange.cn:443/openapi" //中国大陆(测试)
//#define DEFAULTHOSTAPIOVS @"https://openapifunc.easy4ip.com:443/openapi" //海外(测试)
#define DEFAULTHOSTAPICHN @"https://openapi.lechange.cn:443" //中国大陆(正式)
#define DEFAULTHOSTAPIOVS @"https://openapi.easy4ip.com:443" //海外(正式)
static NSMutableDictionary *serialCachePool;
//设备信息缓存
static NSMutableDictionary *deviceInfosPool;
 
@implementation LCApplicationDataManager
 
+ (NSString *)appId {
    return (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:[LCApplicationDataManager isChinaMainland]?APPID:OVERSEAAPPID];
}
 
+ (NSString *)appSecret {
    return (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:[LCApplicationDataManager isChinaMainland]?APPSECRET:OVERSEAAPPSECRET];
}
 
+ (NSString *)hostApi {
    //若没有自定义地址直接返回默认地址
    NSString *hostApi = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:[LCApplicationDataManager isChinaMainland]?HOSTAPI:OVERSEAHOSTAPI];
    hostApi = ((hostApi == nil || [hostApi isNull]) ? ([LCApplicationDataManager isChinaMainland] ? DEFAULTHOSTAPICHN : DEFAULTHOSTAPIOVS) : hostApi);
    return hostApi;
}
 
+ (void)setAppIdWith:(NSString *)appId {
    [[NSUserDefaults standardUserDefaults] setObject:appId forKey:[LCApplicationDataManager isChinaMainland]?APPID:OVERSEAAPPID];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
+ (void)setAppSecretWith:(NSString *)appSecret {
    [[NSUserDefaults standardUserDefaults] setObject:appSecret forKey:[LCApplicationDataManager isChinaMainland]?APPSECRET:OVERSEAAPPSECRET];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
+ (void)setHostApiWith:(NSString *)api {
    [[NSUserDefaults standardUserDefaults] setObject:api forKey:[LCApplicationDataManager isChinaMainland]?HOSTAPI:OVERSEAHOSTAPI];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
///保存管理员模式Token
+ (void)setManagerToken:(NSString *)token {
    [[NSUserDefaults standardUserDefaults] setObject:token forKey:MANAGERTOKEN];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:USERTOKEN];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
///保存用户模式Token
+ (void)setUserToken:(NSString *)token {
    [[NSUserDefaults standardUserDefaults] setObject:token forKey:USERTOKEN];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:MANAGERTOKEN];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
///保存Token过期时间
+ (void)setExpireTime:(NSInteger)second {
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:second];
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:EXPIRETIME];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
///获取Token过期时间
+ (BOOL)isVaildToken {
    NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:EXPIRETIME];
    NSInteger now = [date timeIntervalSinceNow];
    if (now > 300) {
        //如果五分钟内不过期则认为是有效的
        return YES;
    }
    return NO;
}
 
///获取当前Token(自动判断当前用户类型)
+ (NSString *)token {
    NSString *managerToken = [[NSUserDefaults standardUserDefaults] objectForKey:MANAGERTOKEN];
    NSString *userToken = [[NSUserDefaults standardUserDefaults] objectForKey:USERTOKEN];
    return managerToken ? managerToken : userToken;
}
 
+ (NSString *)SDKHost {
    
    NSString *host = [NSString stringWithFormat:@"%@/openapi",[LCApplicationDataManager hostApi]];
    NSString *textStr = [[[[[[host componentsSeparatedByString:@"//"] objectAtIndex:1] componentsSeparatedByString:@"/"] objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:0];
    return textStr;
}
 
+ (NSInteger)SDKPort {
//    (([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})?
 
    NSString *host = [LCApplicationDataManager hostApi];
    NSString *regex = @"(:[0-9]{1,4})";
    NSRegularExpression *regular = [[NSRegularExpression alloc]initWithPattern:regex options:NSRegularExpressionDotMatchesLineSeparators error:nil];
    NSArray *resultArray = [regular matchesInString:host options:0 range:NSMakeRange(0, host.length)];
    if (resultArray.count == 0) {
        return [host containsString:@"https"]?443:80;
    }
    NSTextCheckingResult *result = resultArray[0];
    NSString *textStr = [[host substringWithRange:result.range] substringFromIndex:1];
    return [textStr integerValue];
}
 
///当前是否管理员模式
+ (BOOL)isManagerMode {
    NSString *managerToken = [[NSUserDefaults standardUserDefaults] objectForKey:MANAGERTOKEN];
    return managerToken ? YES : NO;
}
 
///存储当前对接模式
+ (void)setCurrentMode:(LCJointModeType)type {
    [[NSUserDefaults standardUserDefaults] setInteger:type forKey:CURRENTMODE];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
 
///是否对接国内版本
+ (BOOL)isChinaMainland {
    LCJointModeType type = [[NSUserDefaults standardUserDefaults] integerForKey:CURRENTMODE];
    return type == LCJointModeChinaMainland ? YES : NO;
}
 
//MARK: - Private Methods
 
#define kRandomLength 32 ///随机数位数
+ (NSString *)serial
{
    //1.UUIDString
    NSString *string = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
 
    //2.时间戳
    NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
    NSString *timeStr = [NSString stringWithFormat:@"%.0f", time];
 
    //3.随机字符串kRandomLength位
    static const NSString *kRandomAlphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    NSMutableString *randomString = [NSMutableString stringWithCapacity:kRandomLength];
    for (int i = 0; i < kRandomLength; i++) {
        [randomString appendFormat:@"%C", [kRandomAlphabet characterAtIndex:arc4random_uniform((u_int32_t)[kRandomAlphabet length])]];
    }
 
    //==> UUIDString去掉最后一项,再拼接上"时间戳"-"随机字符串kRandomLength位"
    NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[string componentsSeparatedByString:@"-"]];
    [array removeLastObject];
    [array addObject:timeStr];
    [array addObject:randomString];
    NSString *serialStr = [array componentsJoinedByString:@"-"];
    //保证5分钟内不重复逻辑,如果数据池中已存在该key则递归调用,否则检查数据池中大于5分钟的key并将其删除,然后将新key存入数据池
    if ([serialCachePool objectForKey:serialStr]) {
        return [LCApplicationDataManager serial];
    }
    NSRecursiveLock *lock = [[NSRecursiveLock alloc] init];
    [lock lock];
    for (NSString *key in serialCachePool) {
        NSDate *date = (NSDate *)[serialCachePool objectForKey:key];
        NSTimeInterval timeInterval = [date timeIntervalSinceNow];
        timeInterval = -timeInterval;
        if (timeInterval > 5) {
            [serialCachePool removeObjectForKey:key];
        }
    }
    [serialCachePool setObject:[NSDate new] forKey:serialStr];
    [lock unlock];
    return serialStr;
}
 
//获取当前时间戳
+ (NSString *)getCurrentTimeStamp {
    return [NSString stringWithFormat:@"%.0f", [[NSDate new] timeIntervalSince1970]];
}
 
+ (NSMutableDictionary *)defaultPool {
    if (!serialCachePool) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            serialCachePool = [NSMutableDictionary dictionary];
        });
    }
    return serialCachePool;
}
 
+ (NSMutableDictionary *)defaultDeviceInfosPool {
    if (!deviceInfosPool) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            deviceInfosPool = [NSMutableDictionary dictionary];
        });
    }
    return deviceInfosPool;
}
 
@end