2025-12-25 17:20:24 +08:00
|
|
|
//
|
|
|
|
|
// KBMaiPointReporter.m
|
|
|
|
|
// keyBoard
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#import "KBMaiPointReporter.h"
|
2025-12-26 15:51:27 +08:00
|
|
|
#import "KBLog.h"
|
2025-12-25 17:20:24 +08:00
|
|
|
|
|
|
|
|
NSString * const KBMaiPointErrorDomain = @"KBMaiPointErrorDomain";
|
|
|
|
|
|
2025-12-26 15:51:27 +08:00
|
|
|
#if DEBUG
|
|
|
|
|
static void KBMaiPoint_DebugLogURL(NSURLRequest *request) {
|
|
|
|
|
NSString *url = request.URL.absoluteString ?: @"";
|
|
|
|
|
KBLOG(@"🍃[KBMaiPointReporter] url=%@", url);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void KBMaiPoint_DebugLogError(NSURLResponse *response, NSError *error) {
|
|
|
|
|
if (error) {
|
|
|
|
|
NSString *msg = error.localizedDescription ?: @"(no description)";
|
|
|
|
|
KBLOG(@"🍃[KBMaiPointReporter] error=%@ domain=%@ code=%ld", msg, error.domain ?: @"", (long)error.code);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ([response isKindOfClass:NSHTTPURLResponse.class]) {
|
|
|
|
|
NSInteger statusCode = ((NSHTTPURLResponse *)response).statusCode;
|
|
|
|
|
if (statusCode >= 200 && statusCode < 300) {
|
|
|
|
|
KBLOG(@"🍃[KBMaiPointReporter] status=HTTP_%ld", (long)statusCode);
|
|
|
|
|
} else {
|
|
|
|
|
KBLOG(@"🍃[KBMaiPointReporter] error=HTTP_%ld", (long)statusCode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2025-12-25 17:20:24 +08:00
|
|
|
@implementation KBMaiPointReporter
|
|
|
|
|
|
|
|
|
|
+ (instancetype)sharedReporter {
|
|
|
|
|
static KBMaiPointReporter *reporter = nil;
|
|
|
|
|
static dispatch_once_t onceToken;
|
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
|
reporter = [[KBMaiPointReporter alloc] init];
|
|
|
|
|
});
|
|
|
|
|
return reporter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)reportNewAccountWithType:(NSString *)type
|
|
|
|
|
account:(NSString *)account
|
|
|
|
|
completion:(KBMaiPointReportCompletion)completion {
|
|
|
|
|
NSString *trimmedType = [type stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
|
|
|
NSString *trimmedAccount = [account stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
|
|
|
if (trimmedType.length == 0 || trimmedAccount.length == 0) {
|
|
|
|
|
NSError *error = [NSError errorWithDomain:KBMaiPointErrorDomain
|
|
|
|
|
code:-1
|
|
|
|
|
userInfo:@{NSLocalizedDescriptionKey: @"Invalid parameter"}];
|
|
|
|
|
if (completion) {
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
completion(NO, error);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSDictionary *params = @{
|
|
|
|
|
@"type": trimmedType,
|
|
|
|
|
@"account": trimmedAccount
|
|
|
|
|
};
|
|
|
|
|
[self postPath:KB_MAI_POINT_PATH_NEW_ACCOUNT parameters:params completion:completion];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)postPath:(NSString *)path
|
|
|
|
|
parameters:(NSDictionary *)parameters
|
|
|
|
|
completion:(KBMaiPointReportCompletion)completion {
|
|
|
|
|
if (path.length == 0 || ![parameters isKindOfClass:[NSDictionary class]]) {
|
|
|
|
|
NSError *error = [NSError errorWithDomain:KBMaiPointErrorDomain
|
|
|
|
|
code:-1
|
|
|
|
|
userInfo:@{NSLocalizedDescriptionKey: @"Invalid parameter"}];
|
|
|
|
|
if (completion) {
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
completion(NO, error);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSString *safePath = [path hasPrefix:@"/"] ? path : [@"/" stringByAppendingString:path];
|
|
|
|
|
NSString *urlString = [NSString stringWithFormat:@"%@%@", KB_MAI_POINT_BASE_URL, safePath];
|
|
|
|
|
NSURL *url = [NSURL URLWithString:urlString];
|
|
|
|
|
if (!url) {
|
|
|
|
|
NSError *error = [NSError errorWithDomain:KBMaiPointErrorDomain
|
|
|
|
|
code:-2
|
|
|
|
|
userInfo:@{NSLocalizedDescriptionKey: @"Invalid URL"}];
|
|
|
|
|
if (completion) {
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
completion(NO, error);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSError *jsonError = nil;
|
|
|
|
|
NSData *body = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&jsonError];
|
|
|
|
|
if (jsonError) {
|
|
|
|
|
if (completion) {
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
completion(NO, jsonError);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
|
|
|
|
|
request.HTTPMethod = @"POST";
|
|
|
|
|
request.timeoutInterval = 10.0;
|
|
|
|
|
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
|
|
|
|
|
request.HTTPBody = body;
|
|
|
|
|
|
2025-12-26 15:51:27 +08:00
|
|
|
#if DEBUG
|
|
|
|
|
KBMaiPoint_DebugLogURL(request);
|
|
|
|
|
#endif
|
|
|
|
|
|
2025-12-25 17:20:24 +08:00
|
|
|
NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
|
|
|
|
|
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
|
|
|
|
|
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
|
|
|
|
|
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
|
|
|
|
|
completionHandler:^(NSData *data,
|
|
|
|
|
NSURLResponse *response,
|
|
|
|
|
NSError *error) {
|
|
|
|
|
BOOL success = NO;
|
|
|
|
|
NSError *finalError = error;
|
|
|
|
|
|
|
|
|
|
if (!finalError) {
|
|
|
|
|
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
|
|
|
|
|
NSInteger statusCode = ((NSHTTPURLResponse *)response).statusCode;
|
|
|
|
|
success = (statusCode >= 200 && statusCode < 300);
|
|
|
|
|
if (!success) {
|
|
|
|
|
finalError = [NSError errorWithDomain:KBMaiPointErrorDomain
|
|
|
|
|
code:statusCode
|
|
|
|
|
userInfo:@{NSLocalizedDescriptionKey: @"Invalid response"}];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
finalError = [NSError errorWithDomain:KBMaiPointErrorDomain
|
|
|
|
|
code:-3
|
|
|
|
|
userInfo:@{NSLocalizedDescriptionKey: @"Invalid response"}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-26 15:51:27 +08:00
|
|
|
#if DEBUG
|
|
|
|
|
KBMaiPoint_DebugLogError(response, finalError);
|
|
|
|
|
#endif
|
|
|
|
|
|
2025-12-25 17:20:24 +08:00
|
|
|
if (completion) {
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
completion(success, finalError);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}];
|
|
|
|
|
[task resume];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@end
|