1
This commit is contained in:
@@ -17,6 +17,7 @@ typedef NS_ERROR_ENUM(KBNetworkErrorDomain, KBNetworkError) {
|
||||
KBNetworkErrorInvalidURL = 2,
|
||||
KBNetworkErrorInvalidResponse = 3,
|
||||
KBNetworkErrorDecodeFailed = 4,
|
||||
KBNetworkErrorBusiness = 5, // 服务端返回非成功业务 code
|
||||
};
|
||||
|
||||
/// 简单的 JSON 回调:json 为 NSDictionary/NSArray 或者在非 JSON 情况下返回 NSData
|
||||
|
||||
@@ -4,8 +4,13 @@
|
||||
//
|
||||
|
||||
#import "KBNetworkManager.h"
|
||||
#import <TargetConditionals.h>
|
||||
#import "AFNetworking.h"
|
||||
#import "KBAuthManager.h"
|
||||
#import "KBBizCode.h"
|
||||
// 仅在主 App 内需要的会话管理与 HUD 组件
|
||||
#import "KBUserSessionManager.h"
|
||||
#import "KBHUD.h"
|
||||
|
||||
NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
||||
|
||||
@@ -209,19 +214,37 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
||||
NSString *pretty = [self kb_prettyJSONStringFromObject:json] ?: @"(null)";
|
||||
pretty = [self kb_trimmedString:pretty maxLength:4096];
|
||||
NSInteger status = [response isKindOfClass:NSHTTPURLResponse.class] ? ((NSHTTPURLResponse *)response).statusCode : 0;
|
||||
KBLOG(@"响应成功(JSON)\nURL: %@\n状态: %ld\nContent-Type: %@\n数据: %@",
|
||||
KBLOG(@"\n[KBNetwork] 响应成功(JSON)\nURL: %@\n状态: %ld\nContent-Type: %@\n数据: %@\n",
|
||||
req.URL.absoluteString,
|
||||
(long)status,
|
||||
ct ?: @"",
|
||||
pretty);
|
||||
#endif
|
||||
// 统一解析业务 code:约定后端顶层包含 { code, message, data }
|
||||
if ([json isKindOfClass:NSDictionary.class]) {
|
||||
NSInteger bizCode = KBBizCodeFromJSONObject(json);
|
||||
if (bizCode != NSNotFound && bizCode != KBBizCodeSuccess) {
|
||||
// 非成功业务 code:执行通用处理(如 token 失效)并通过 error 方式回调
|
||||
[self kb_handleBizCode:bizCode json:json response:response];
|
||||
NSString *msg = KBBizMessageFromJSONObject(json) ?: KBLocalized(@"Server error");
|
||||
NSError *bizErr = [NSError errorWithDomain:KBNetworkErrorDomain
|
||||
code:KBNetworkErrorBusiness
|
||||
userInfo:@{
|
||||
NSLocalizedDescriptionKey : msg,
|
||||
@"code" : @(bizCode)
|
||||
}];
|
||||
if (completion) completion(json, response, bizErr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// code 缺失或为成功,按正常成功回调
|
||||
if (completion) completion(json, 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(@"响应成功(Data)\nURL: %@\n状态: %ld\nContent-Type: %@\n数据: %@",
|
||||
KBLOG(@"\n[KBNetwork] 响应成功(Data)\nURL: %@\n状态: %ld\nContent-Type: %@\n数据: %@\n",
|
||||
req.URL.absoluteString,
|
||||
(long)status,
|
||||
ct ?: @"",
|
||||
@@ -251,6 +274,43 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
||||
|
||||
#pragma mark - Private helpers
|
||||
|
||||
/// 处理通用业务 code(token 失效、被踢下线等)
|
||||
- (void)kb_handleBizCode:(NSInteger)bizCode
|
||||
json:(id)json
|
||||
response:(NSURLResponse *)response {
|
||||
// 键盘扩展内暂不做复杂会话管理,交由宿主 App 处理。
|
||||
// 如需支持,可通过 Darwin 通知或 App Group 自行扩展。
|
||||
(void)bizCode;
|
||||
(void)json;
|
||||
(void)response;
|
||||
return;
|
||||
switch (bizCode) {
|
||||
case KBBizCodeTokenInvalid:
|
||||
case KBBizCodeTokenExpired:
|
||||
case KBBizCodeAccountKicked: {
|
||||
// 登录态异常:统一清理本地会话并提示用户重新登录
|
||||
NSString *msg = KBBizMessageFromJSONObject(json);
|
||||
if (msg.length == 0) {
|
||||
msg = KBLocalized(@"Your session has expired. Please sign in again.");
|
||||
}
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
// 清理本地用户会话(Keychain + 用户缓存)
|
||||
[[KBUserSessionManager shared] logout];
|
||||
// 友好提示
|
||||
[KBHUD showInfo:msg];
|
||||
// 广播通知,便于 UI 侧跳转登录页等
|
||||
NSDictionary *info = @{ @"code": @(bizCode),
|
||||
@"message": msg ?: @"" };
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:@"KBUserSessionInvalidNotification"
|
||||
object:nil
|
||||
userInfo:info];
|
||||
});
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)fail:(KBNetworkError)code completion:(KBNetworkCompletion)completion {
|
||||
NSString *msg = KBLocalized(@"Network error");
|
||||
switch (code) {
|
||||
@@ -258,6 +318,7 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
|
||||
case KBNetworkErrorInvalidURL: msg = KBLocalized(@"Invalid URL"); break;
|
||||
case KBNetworkErrorInvalidResponse: msg = KBLocalized(@"Invalid response"); break;
|
||||
case KBNetworkErrorDecodeFailed: msg = KBLocalized(@"Parse failed"); break;
|
||||
case KBNetworkErrorBusiness: msg = KBLocalized(@"Server error"); break;
|
||||
default: break;
|
||||
}
|
||||
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
|
||||
|
||||
Reference in New Issue
Block a user