1
This commit is contained in:
@@ -6,7 +6,8 @@
|
|||||||
#import "KBNetworkManager.h"
|
#import "KBNetworkManager.h"
|
||||||
#import "AFNetworking.h"
|
#import "AFNetworking.h"
|
||||||
#import "KBAuthManager.h"
|
#import "KBAuthManager.h"
|
||||||
|
#import "KBUserSessionManager.h"
|
||||||
|
#import "KBSignUtils.h"
|
||||||
NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
||||||
|
|
||||||
@interface KBNetworkManager ()
|
@interface KBNetworkManager ()
|
||||||
@@ -28,8 +29,11 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
_timeout = 10.0;
|
_timeout = 10.0;
|
||||||
// 默认请求头:Accept 任意类型 + 使用项目多语言管理器设置 Accept-Language
|
// 默认请求头:Accept 任意类型 + 使用项目多语言管理器设置 Accept-Language
|
||||||
NSString *lang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish;
|
NSString *lang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish;
|
||||||
|
NSString *token = [KBUserSessionManager shared].accessToken ? [KBUserSessionManager shared].accessToken : @"";
|
||||||
|
|
||||||
_defaultHeaders = @{
|
_defaultHeaders = @{
|
||||||
@"Accept": @"*/*",
|
@"Accept": @"*/*",
|
||||||
|
@"auth-token" : token,
|
||||||
@"Accept-Language": lang
|
@"Accept-Language": lang
|
||||||
};
|
};
|
||||||
// 设置基础域名,路径可相对该地址拼接
|
// 设置基础域名,路径可相对该地址拼接
|
||||||
@@ -38,12 +42,49 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)getSignWithParare:(NSDictionary *)bodyParams{
|
||||||
|
|
||||||
|
NSString *appId = @"loveKeyboard";
|
||||||
|
NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; // 和服务端保持一致
|
||||||
|
NSString *timestamp = [KBSignUtils currentTimestamp];
|
||||||
|
NSString *nonce = [KBSignUtils generateNonceWithLength:16];
|
||||||
|
// 1. 组装参与签名的所有参数
|
||||||
|
NSMutableDictionary<NSString *, NSString *> *signParams = [NSMutableDictionary dictionary];
|
||||||
|
signParams[@"appId"] = appId;
|
||||||
|
signParams[@"timestamp"] = timestamp;
|
||||||
|
signParams[@"nonce"] = nonce;
|
||||||
|
// 把 body 里的字段也加入签名参数
|
||||||
|
[bodyParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
|
||||||
|
if ([obj isKindOfClass:[NSString class]]) {
|
||||||
|
signParams[key] = obj;
|
||||||
|
} else {
|
||||||
|
signParams[key] = [obj description];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
NSString *sign = [KBSignUtils signWithParams:signParams secret:secret];
|
||||||
|
|
||||||
|
// 将签名相关字段合并进默认请求头
|
||||||
|
NSMutableDictionary<NSString *, NSString *> *headers =
|
||||||
|
[self.defaultHeaders mutableCopy] ?: [NSMutableDictionary dictionary];
|
||||||
|
|
||||||
|
if (sign.length > 0) {
|
||||||
|
headers[@"X-Sign"] = sign;
|
||||||
|
}
|
||||||
|
headers[@"X-App-Id"] = appId;
|
||||||
|
headers[@"X-Timestamp"] = timestamp;
|
||||||
|
headers[@"X-Nonce"] = nonce;
|
||||||
|
|
||||||
|
// 触发 copy 语义,确保对外仍是不可变字典
|
||||||
|
self.defaultHeaders = headers;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Public
|
#pragma mark - Public
|
||||||
|
|
||||||
- (NSURLSessionDataTask *)GET:(NSString *)path
|
- (NSURLSessionDataTask *)GET:(NSString *)path
|
||||||
parameters:(NSDictionary *)parameters
|
parameters:(NSDictionary *)parameters
|
||||||
headers:(NSDictionary<NSString *,NSString *> *)headers
|
headers:(NSDictionary<NSString *,NSString *> *)headers
|
||||||
completion:(KBNetworkCompletion)completion {
|
completion:(KBNetworkCompletion)completion {
|
||||||
|
[self getSignWithParare:parameters];
|
||||||
if (![self ensureEnabled:completion]) return nil;
|
if (![self ensureEnabled:completion]) return nil;
|
||||||
NSString *urlString = [self buildURLStringWithPath:path];
|
NSString *urlString = [self buildURLStringWithPath:path];
|
||||||
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
||||||
@@ -67,6 +108,8 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
jsonBody:(id)jsonBody
|
jsonBody:(id)jsonBody
|
||||||
headers:(NSDictionary<NSString *,NSString *> *)headers
|
headers:(NSDictionary<NSString *,NSString *> *)headers
|
||||||
completion:(KBNetworkCompletion)completion {
|
completion:(KBNetworkCompletion)completion {
|
||||||
|
[self getSignWithParare:jsonBody];
|
||||||
|
|
||||||
if (![self ensureEnabled:completion]) return nil;
|
if (![self ensureEnabled:completion]) return nil;
|
||||||
NSString *urlString = [self buildURLStringWithPath:path];
|
NSString *urlString = [self buildURLStringWithPath:path];
|
||||||
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
||||||
@@ -87,6 +130,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
parameters:(NSDictionary *)parameters
|
parameters:(NSDictionary *)parameters
|
||||||
headers:(NSDictionary<NSString *,NSString *> *)headers
|
headers:(NSDictionary<NSString *,NSString *> *)headers
|
||||||
completion:(KBNetworkDataCompletion)completion {
|
completion:(KBNetworkDataCompletion)completion {
|
||||||
|
[self getSignWithParare:parameters];
|
||||||
if (!self.isEnabled) {
|
if (!self.isEnabled) {
|
||||||
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
|
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
|
||||||
code:KBNetworkErrorDisabled
|
code:KBNetworkErrorDisabled
|
||||||
|
|||||||
@@ -672,6 +672,8 @@
|
|||||||
0477BD942EBAFF4E0055D639 /* Utils */ = {
|
0477BD942EBAFF4E0055D639 /* Utils */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
0498BD832EE1B255006CC1D5 /* KBSignUtils.h */,
|
||||||
|
0498BD842EE1B255006CC1D5 /* KBSignUtils.m */,
|
||||||
);
|
);
|
||||||
path = Utils;
|
path = Utils;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -908,8 +910,6 @@
|
|||||||
0498BD822EE1B246006CC1D5 /* Utils */ = {
|
0498BD822EE1B246006CC1D5 /* Utils */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
0498BD832EE1B255006CC1D5 /* KBSignUtils.h */,
|
|
||||||
0498BD842EE1B255006CC1D5 /* KBSignUtils.m */,
|
|
||||||
);
|
);
|
||||||
path = Utils;
|
path = Utils;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|||||||
@@ -63,9 +63,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)getSignWithParare:(NSDictionary *)bodyParams{
|
- (void)getSignWithParare:(NSDictionary *)bodyParams{
|
||||||
if (bodyParams == nil) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
NSString *appId = @"loveKeyboard";
|
NSString *appId = @"loveKeyboard";
|
||||||
NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; // 和服务端保持一致
|
NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; // 和服务端保持一致
|
||||||
NSString *timestamp = [KBSignUtils currentTimestamp];
|
NSString *timestamp = [KBSignUtils currentTimestamp];
|
||||||
@@ -85,6 +83,19 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
}];
|
}];
|
||||||
NSString *sign = [KBSignUtils signWithParams:signParams secret:secret];
|
NSString *sign = [KBSignUtils signWithParams:signParams secret:secret];
|
||||||
|
|
||||||
|
// 将签名相关字段合并进默认请求头
|
||||||
|
NSMutableDictionary<NSString *, NSString *> *headers =
|
||||||
|
[self.defaultHeaders mutableCopy] ?: [NSMutableDictionary dictionary];
|
||||||
|
|
||||||
|
if (sign.length > 0) {
|
||||||
|
headers[@"X-Sign"] = sign;
|
||||||
|
}
|
||||||
|
headers[@"X-App-Id"] = appId;
|
||||||
|
headers[@"X-Timestamp"] = timestamp;
|
||||||
|
headers[@"X-Nonce"] = nonce;
|
||||||
|
|
||||||
|
// 触发 copy 语义,确保对外仍是不可变字典
|
||||||
|
self.defaultHeaders = headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -97,6 +108,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
autoShowBusinessError:(BOOL)autoShowBusinessError
|
autoShowBusinessError:(BOOL)autoShowBusinessError
|
||||||
completion:(KBNetworkCompletion)completion {
|
completion:(KBNetworkCompletion)completion {
|
||||||
NSLog(@"[KBNetworkManager] GET called, enabled=%d, path=%@", self.isEnabled, path);
|
NSLog(@"[KBNetworkManager] GET called, enabled=%d, path=%@", self.isEnabled, path);
|
||||||
|
[self getSignWithParare:parameters];
|
||||||
if (![self ensureEnabled:completion]) return nil;
|
if (![self ensureEnabled:completion]) return nil;
|
||||||
NSString *urlString = [self buildURLStringWithPath:path];
|
NSString *urlString = [self buildURLStringWithPath:path];
|
||||||
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
||||||
@@ -131,6 +143,8 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
|||||||
parameters:(NSDictionary *)parameters
|
parameters:(NSDictionary *)parameters
|
||||||
headers:(NSDictionary<NSString *,NSString *> *)headers
|
headers:(NSDictionary<NSString *,NSString *> *)headers
|
||||||
completion:(KBNetworkCompletion)completion {
|
completion:(KBNetworkCompletion)completion {
|
||||||
|
[self getSignWithParare:parameters];
|
||||||
|
|
||||||
return [self GET:path
|
return [self GET:path
|
||||||
parameters:parameters
|
parameters:parameters
|
||||||
headers:headers
|
headers:headers
|
||||||
@@ -145,6 +159,7 @@ autoShowBusinessError:YES
|
|||||||
autoShowBusinessError:(BOOL)autoShowBusinessError
|
autoShowBusinessError:(BOOL)autoShowBusinessError
|
||||||
completion:(KBNetworkCompletion)completion {
|
completion:(KBNetworkCompletion)completion {
|
||||||
NSLog(@"[KBNetworkManager] POST called, enabled=%d, path=%@", self.isEnabled, path);
|
NSLog(@"[KBNetworkManager] POST called, enabled=%d, path=%@", self.isEnabled, path);
|
||||||
|
[self getSignWithParare:jsonBody];
|
||||||
if (![self ensureEnabled:completion]) return nil;
|
if (![self ensureEnabled:completion]) return nil;
|
||||||
NSString *urlString = [self buildURLStringWithPath:path];
|
NSString *urlString = [self buildURLStringWithPath:path];
|
||||||
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; }
|
||||||
@@ -176,6 +191,7 @@ autoShowBusinessError:YES
|
|||||||
jsonBody:(id)jsonBody
|
jsonBody:(id)jsonBody
|
||||||
headers:(NSDictionary<NSString *,NSString *> *)headers
|
headers:(NSDictionary<NSString *,NSString *> *)headers
|
||||||
completion:(KBNetworkCompletion)completion {
|
completion:(KBNetworkCompletion)completion {
|
||||||
|
[self getSignWithParare:jsonBody];
|
||||||
return [self POST:path
|
return [self POST:path
|
||||||
jsonBody:jsonBody
|
jsonBody:jsonBody
|
||||||
headers:headers
|
headers:headers
|
||||||
|
|||||||
Reference in New Issue
Block a user