From 40d9b5aad4ee7e3fc930cfd3c9d09cec79283076 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Thu, 4 Dec 2025 20:57:39 +0800 Subject: [PATCH] 1 --- CustomKeyboard/Network/KBNetworkManager.m | 46 ++++++++++++++++++- .../Utils/KBSignUtils.h | 0 .../Utils/KBSignUtils.m | 0 keyBoard.xcodeproj/project.pbxproj | 4 +- keyBoard/Class/Network/KBNetworkManager.m | 24 ++++++++-- 5 files changed, 67 insertions(+), 7 deletions(-) rename {keyBoard/Class => CustomKeyboard}/Utils/KBSignUtils.h (100%) rename {keyBoard/Class => CustomKeyboard}/Utils/KBSignUtils.m (100%) diff --git a/CustomKeyboard/Network/KBNetworkManager.m b/CustomKeyboard/Network/KBNetworkManager.m index 63dcb41..26903ee 100644 --- a/CustomKeyboard/Network/KBNetworkManager.m +++ b/CustomKeyboard/Network/KBNetworkManager.m @@ -6,7 +6,8 @@ #import "KBNetworkManager.h" #import "AFNetworking.h" #import "KBAuthManager.h" - +#import "KBUserSessionManager.h" +#import "KBSignUtils.h" NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; @interface KBNetworkManager () @@ -28,8 +29,11 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; _timeout = 10.0; // 默认请求头:Accept 任意类型 + 使用项目多语言管理器设置 Accept-Language NSString *lang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish; + NSString *token = [KBUserSessionManager shared].accessToken ? [KBUserSessionManager shared].accessToken : @""; + _defaultHeaders = @{ @"Accept": @"*/*", + @"auth-token" : token, @"Accept-Language": lang }; // 设置基础域名,路径可相对该地址拼接 @@ -38,12 +42,49 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; return self; } +- (void)getSignWithParare:(NSDictionary *)bodyParams{ + + NSString *appId = @"loveKeyboard"; + NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; // 和服务端保持一致 + NSString *timestamp = [KBSignUtils currentTimestamp]; + NSString *nonce = [KBSignUtils generateNonceWithLength:16]; + // 1. 组装参与签名的所有参数 + NSMutableDictionary *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 *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 - (NSURLSessionDataTask *)GET:(NSString *)path parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers completion:(KBNetworkCompletion)completion { + [self getSignWithParare:parameters]; if (![self ensureEnabled:completion]) return nil; NSString *urlString = [self buildURLStringWithPath:path]; if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; } @@ -67,6 +108,8 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; jsonBody:(id)jsonBody headers:(NSDictionary *)headers completion:(KBNetworkCompletion)completion { + [self getSignWithParare:jsonBody]; + if (![self ensureEnabled:completion]) return nil; NSString *urlString = [self buildURLStringWithPath:path]; if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; } @@ -87,6 +130,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers completion:(KBNetworkDataCompletion)completion { + [self getSignWithParare:parameters]; if (!self.isEnabled) { NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorDisabled diff --git a/keyBoard/Class/Utils/KBSignUtils.h b/CustomKeyboard/Utils/KBSignUtils.h similarity index 100% rename from keyBoard/Class/Utils/KBSignUtils.h rename to CustomKeyboard/Utils/KBSignUtils.h diff --git a/keyBoard/Class/Utils/KBSignUtils.m b/CustomKeyboard/Utils/KBSignUtils.m similarity index 100% rename from keyBoard/Class/Utils/KBSignUtils.m rename to CustomKeyboard/Utils/KBSignUtils.m diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index a9db39c..51fc91e 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -672,6 +672,8 @@ 0477BD942EBAFF4E0055D639 /* Utils */ = { isa = PBXGroup; children = ( + 0498BD832EE1B255006CC1D5 /* KBSignUtils.h */, + 0498BD842EE1B255006CC1D5 /* KBSignUtils.m */, ); path = Utils; sourceTree = ""; @@ -908,8 +910,6 @@ 0498BD822EE1B246006CC1D5 /* Utils */ = { isa = PBXGroup; children = ( - 0498BD832EE1B255006CC1D5 /* KBSignUtils.h */, - 0498BD842EE1B255006CC1D5 /* KBSignUtils.m */, ); path = Utils; sourceTree = ""; diff --git a/keyBoard/Class/Network/KBNetworkManager.m b/keyBoard/Class/Network/KBNetworkManager.m index 2be8174..2c93461 100644 --- a/keyBoard/Class/Network/KBNetworkManager.m +++ b/keyBoard/Class/Network/KBNetworkManager.m @@ -63,9 +63,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; } - (void)getSignWithParare:(NSDictionary *)bodyParams{ - if (bodyParams == nil) { - return; - } + NSString *appId = @"loveKeyboard"; NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; // 和服务端保持一致 NSString *timestamp = [KBSignUtils currentTimestamp]; @@ -84,7 +82,20 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; } }]; NSString *sign = [KBSignUtils signWithParams:signParams secret:secret]; - + + // 将签名相关字段合并进默认请求头 + NSMutableDictionary *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 completion:(KBNetworkCompletion)completion { NSLog(@"[KBNetworkManager] GET called, enabled=%d, path=%@", self.isEnabled, path); + [self getSignWithParare:parameters]; if (![self ensureEnabled:completion]) return nil; NSString *urlString = [self buildURLStringWithPath:path]; if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; } @@ -131,6 +143,8 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers completion:(KBNetworkCompletion)completion { + [self getSignWithParare:parameters]; + return [self GET:path parameters:parameters headers:headers @@ -145,6 +159,7 @@ autoShowBusinessError:YES autoShowBusinessError:(BOOL)autoShowBusinessError completion:(KBNetworkCompletion)completion { NSLog(@"[KBNetworkManager] POST called, enabled=%d, path=%@", self.isEnabled, path); + [self getSignWithParare:jsonBody]; if (![self ensureEnabled:completion]) return nil; NSString *urlString = [self buildURLStringWithPath:path]; if (!urlString) { [self fail:KBNetworkErrorInvalidURL completion:completion]; return nil; } @@ -176,6 +191,7 @@ autoShowBusinessError:YES jsonBody:(id)jsonBody headers:(NSDictionary *)headers completion:(KBNetworkCompletion)completion { + [self getSignWithParare:jsonBody]; return [self POST:path jsonBody:jsonBody headers:headers