This commit is contained in:
2025-12-03 13:54:57 +08:00
parent b87998549c
commit c1eb6a3458
11 changed files with 204 additions and 58 deletions

View File

@@ -84,7 +84,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
req.allHTTPHeaderFields ?: @{},
paramStr);
#endif
return [self startAFTaskWithRequest:req completion:completion];
return [self startJSONTaskWithRequest:req completion:completion];
}
- (NSURLSessionDataTask *)POST:(NSString *)path
@@ -113,7 +113,42 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
req.allHTTPHeaderFields ?: @{},
bodyStr);
#endif
return [self startAFTaskWithRequest:req completion:completion];
return [self startJSONTaskWithRequest:req completion:completion];
}
// GET zip
- (NSURLSessionDataTask *)GETData:(NSString *)path
parameters:(NSDictionary *)parameters
headers:(NSDictionary<NSString *,NSString *> *)headers
completion:(KBNetworkDataCompletion)completion {
if (!self.isEnabled) {
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorDisabled
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Network disabled (Full Access may be off)")}];
if (completion) completion(nil, nil, e);
return nil;
}
NSString *urlString = [self buildURLStringWithPath:path];
if (!urlString) {
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorInvalidURL
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid URL")}];
if (completion) completion(nil, nil, e);
return nil;
}
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
serializer.timeoutInterval = self.timeout;
NSError *serror = nil;
NSMutableURLRequest *req = [serializer requestWithMethod:@"GET"
URLString:urlString
parameters:parameters
error:&serror];
if (serror || !req) {
if (completion) completion(nil, nil, serror ?: [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidURL userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid URL")}]);
return nil;
}
[self applyHeaders:headers toMutableRequest:req contentType:nil];
return [self startDataTaskWithRequest:req completion:completion];
}
#pragma mark - Core
@@ -154,7 +189,8 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
[all enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) { [req setValue:obj forHTTPHeaderField:key]; }];
}
- (NSURLSessionDataTask *)startAFTaskWithRequest:(NSURLRequest *)req completion:(KBNetworkCompletion)completion {
- (NSURLSessionDataTask *)startJSONTaskWithRequest:(NSURLRequest *)req
completion:(KBNetworkCompletion)completion {
NSLog(@"[KBNetworkManager] startAFTaskWithRequest: %@", req.URL.absoluteString);
// Content-Type JSON
self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
@@ -178,9 +214,9 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
#if DEBUG
KBLOG(@"无效响应\nURL: %@\n说明: %@", req.URL.absoluteString, KBLocalized(@"未获取到数据"));
#endif
if (completion) completion(nil, response, [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey:KBLocalized(@"No data")}]);
return;
}
if (completion) completion(nil, response, [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey:KBLocalized(@"No data")}]);
return;
}
NSString *ct = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
ct = ((NSHTTPURLResponse *)response).allHeaderFields[@"Content-Type"];
@@ -210,6 +246,12 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
if (completion) completion(nil, response, [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorDecodeFailed userInfo:@{NSLocalizedDescriptionKey:KBLocalized(@"Failed to parse JSON")}]);
return;
}
//
if (![json isKindOfClass:[NSDictionary class]]) {
if (completion) completion(nil, response, [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey:KBLocalized(@"Invalid response")}]);
return;
}
#if DEBUG
NSString *pretty = [self kb_prettyJSONStringFromObject:json] ?: @"(null)";
pretty = [self kb_trimmedString:pretty maxLength:4096];
@@ -220,12 +262,12 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
ct ?: @"",
pretty);
#endif
NSDictionary *dict = (NSDictionary *)json;
// code { code, message, data }
if ([json isKindOfClass:NSDictionary.class]) {
NSInteger bizCode = KBBizCodeFromJSONObject(json);
if (bizCode != NSNotFound && bizCode != KBBizCodeSuccess) {
NSInteger bizCode = KBBizCodeFromJSONObject(dict);
if (bizCode != NSNotFound && bizCode != KBBizCodeSuccess) {
// code token error
[self kb_handleBizCode:bizCode json:json response:response];
[self kb_handleBizCode:bizCode json:dict response:response];
NSString *msg = KBBizMessageFromJSONObject(json) ?: KBLocalized(@"Server error");
NSError *bizErr = [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorBusiness
@@ -233,30 +275,42 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
NSLocalizedDescriptionKey : msg,
@"code" : @(bizCode)
}];
if (completion) completion(json, response, bizErr);
if (completion) completion(dict, response, bizErr);
return;
}
}
// code
if (completion) completion(json, response, nil);
if (completion) completion(dict, response, nil);
} else {
#if DEBUG
NSString *text = [self kb_textFromData:data];
text = [self kb_trimmedString:text maxLength:4096];
NSInteger status = [response isKindOfClass:NSHTTPURLResponse.class] ? ((NSHTTPURLResponse *)response).statusCode : 0;
KBLOG(@"\n[KBNetwork] 响应成功(Data)\nURL: %@\n状态: %ld\nContent-Type: %@\n数据: %@\n",
req.URL.absoluteString,
(long)status,
ct ?: @"",
text);
#endif
if (completion) completion(data, response, nil);
// JSON JSON
if (completion) completion(nil, response, [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey:KBLocalized(@"Invalid response")}]);
}
}];
[task resume];
return task;
}
//
- (NSURLSessionDataTask *)startDataTaskWithRequest:(NSURLRequest *)req
completion:(KBNetworkDataCompletion)completion {
NSLog(@"[KBNetworkManager] startDataTaskWithRequest: %@", req.URL.absoluteString);
self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSURLSessionDataTask *task = [self.manager dataTaskWithRequest:req uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
NSLog(@"[KBNetworkManager] data task finished, error = %@", error);
if (error) {
if (completion) completion(nil, response, error);
return;
}
NSData *data = (NSData *)responseObject;
if (![data isKindOfClass:[NSData class]]) {
if (completion) completion(nil, response, [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey:KBLocalized(@"No data")}]);
return;
}
if (completion) completion(data, response, nil);
}];
[task resume];
return task;
}
#pragma mark - AFHTTPSessionManager
- (AFHTTPSessionManager *)manager {