You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
754 lines
28 KiB
754 lines
28 KiB
// |
|
// APIManager.m |
|
// LekangGuard |
|
// |
|
// Created by ecell on 2022/10/10. |
|
// |
|
|
|
#import "APIManager.h" |
|
#import "APRequestSerializer.h" |
|
#import "AppDelegate.h" |
|
|
|
//#ifdef DEBUG |
|
//测试环境 |
|
NSString *const dHostUrl = @"http://lb-mi23utxo-em1lnrk4gizs2pu8.clb.ap-nanjing.tencentclb.com:8822"; |
|
//#else |
|
////正式环境 |
|
//NSString *const dHostUrl = @"http://lb-mi23utxo-em1lnrk4gizs2pu8.clb.ap-nanjing.tencentclb.com:8822"; |
|
//#endif |
|
|
|
|
|
NSString *const sRelogin = @"sRelogin"; |
|
NSString *const sLoginKey = @"sLoginModel"; |
|
NSString *const sDeviceKey = @"sDeviceModel"; |
|
NSString *const sUserKey = @"sUserModel"; |
|
NSString *const sDeviceListKey = @"sDeviceListKey"; |
|
|
|
NSString *const kErrorDomain = @"kErrorDomain"; |
|
NSInteger const kErrorException = 500; |
|
|
|
|
|
@implementation APIManager |
|
|
|
+ (instancetype)sharedManager |
|
{ |
|
static dispatch_once_t onceToken; |
|
static APIManager *apitance; |
|
dispatch_once(&onceToken, ^{ |
|
apitance = [[APIManager alloc] init]; |
|
apitance.cache = [YYCache cacheWithName:@"hx_cache_data"]; |
|
if ([apitance.cache containsObjectForKey:sLoginKey]) |
|
{ |
|
id object = [apitance.cache objectForKey:sLoginKey]; |
|
if ([object isKindOfClass:LoginModel.class]) |
|
{ |
|
apitance.loginModel = object; |
|
} |
|
} |
|
if ([apitance.cache containsObjectForKey:sDeviceKey]) |
|
{ |
|
id object = [apitance.cache objectForKey:sDeviceKey]; |
|
if ([object isKindOfClass:DeviceModel.class]) |
|
{ |
|
apitance.deviceModel = object; |
|
} |
|
} |
|
if ([apitance.cache containsObjectForKey:sUserKey]) |
|
{ |
|
id object = [apitance.cache objectForKey:sUserKey]; |
|
if ([object isKindOfClass:MyUserMsgModel.class]) |
|
{ |
|
apitance.userModel = object; |
|
} |
|
} |
|
if ([apitance.cache containsObjectForKey:sDeviceListKey]) |
|
{ |
|
id object = [apitance.cache objectForKey:sDeviceListKey]; |
|
if ([object isKindOfClass:NSMutableArray.class]) |
|
{ |
|
apitance.deviceList = object; |
|
} |
|
} |
|
}); |
|
return apitance; |
|
} |
|
|
|
/// 清除数据 |
|
- (void)clearUserInfo |
|
{ |
|
if ([self.cache containsObjectForKey:sLoginKey]) |
|
{ |
|
[self.cache removeObjectForKey:sLoginKey]; |
|
self.loginModel.isLogin = NO; |
|
self.loginModel = nil; |
|
self.laloModel = nil; |
|
} |
|
if ([self.cache containsObjectForKey:sDeviceKey]) |
|
{ |
|
[self.cache removeObjectForKey:sDeviceKey]; |
|
self.deviceModel = nil; |
|
} |
|
if ([self.cache containsObjectForKey:sUserKey]) |
|
{ |
|
[self.cache removeObjectForKey:sUserKey]; |
|
self.userModel = nil; |
|
} |
|
NSLog(@"%@",self.loginModel); |
|
} |
|
|
|
/// 解绑清除设备数据 |
|
- (void)cleardeviceInfo |
|
{ |
|
if ([self.cache containsObjectForKey:sDeviceKey]) |
|
{ |
|
[self.cache removeObjectForKey:sDeviceKey]; |
|
self.deviceModel = nil; |
|
self.laloModel = nil; |
|
} |
|
NSLog(@"%@",self.loginModel); |
|
} |
|
|
|
#pragma mark- POST请求 |
|
/// POST请求 |
|
/// @param URL 接口名 |
|
/// @param parameters 接口传参 |
|
/// @param isJson 是否是json |
|
/// @param resultClass 返回数据类型模型 |
|
- (RACSignal *)APPOST:(NSString *)URL |
|
parameters:(id )parameters |
|
isJson:(BOOL)isJson |
|
resultClass:(Class __nullable)resultClass |
|
{ |
|
if ([resultClass isSubclassOfClass:LoginModel.class]) |
|
{ |
|
return [[self APHTTPWithMethod:MSRequestMethodPOST URL:URL isJson:isJson parameters:parameters resultClass:resultClass] doNext:^(LoginModel *model) { |
|
model.isLogin = YES; |
|
self.loginModel = model; |
|
[self.cache setObject:model forKey:sLoginKey]; |
|
|
|
}]; |
|
} |
|
else |
|
return [self APHTTPWithMethod:MSRequestMethodPOST URL:URL isJson:isJson parameters:parameters resultClass:resultClass]; |
|
} |
|
|
|
#pragma mark- GET请求 |
|
/// GET请求 |
|
/// @param URL 接口名 |
|
/// @param parameters 接口传参 |
|
/// @param resultClass 返回数据类型模型 |
|
- (RACSignal *)APGET:(NSString *)URL |
|
parameters:(NSDictionary *)parameters |
|
resultClass:(Class __nullable)resultClass |
|
{ |
|
if ([resultClass isSubclassOfClass:LatestLocationModel.class]) |
|
{ |
|
return [[self APHTTPWithMethod:MSRequestMethodGET URL:URL isJson:NO parameters:parameters resultClass:resultClass] doNext:^(LatestLocationModel *model) { |
|
self.laloModel = model; |
|
}]; |
|
} |
|
else if ([resultClass isSubclassOfClass:MyUserMsgModel.class]) |
|
{ |
|
return [[self APHTTPWithMethod:MSRequestMethodGET URL:URL isJson:NO parameters:parameters resultClass:resultClass] doNext:^(MyUserMsgModel *model) { |
|
self.userModel = model; |
|
[self.cache setObject:model forKey:sUserKey]; |
|
}]; |
|
} |
|
else if ([URL isEqualToString:BindDevice_URL]) |
|
{ |
|
return [[self APHTTPWithMethod:MSRequestMethodGET URL:URL isJson:NO parameters:parameters resultClass:resultClass] doNext:^(NSArray *arr) { |
|
[self.deviceList removeAllObjects]; |
|
NSMutableArray *devArr = [NSMutableArray new]; |
|
for (NSDictionary *dic in arr) |
|
{ |
|
DeviceModel *model = [DeviceModel yy_modelWithJSON:dic]; |
|
[devArr addObject:model]; |
|
} |
|
self.deviceList = devArr; |
|
[self.cache setObject:devArr forKey:sDeviceListKey]; |
|
}]; |
|
} |
|
else |
|
return [self APHTTPWithMethod:MSRequestMethodGET URL:URL isJson:NO parameters:parameters resultClass:resultClass]; |
|
} |
|
|
|
|
|
#pragma mark- DELETE请求 |
|
/// DELETE请求 |
|
/// @param URL 接口名 |
|
/// @param parameters 接口传参 |
|
/// @param resultClass 返回数据类型模型 |
|
- (RACSignal *)APDELETE:(NSString *)URL |
|
parameters:(NSDictionary *)parameters |
|
resultClass:(Class __nullable)resultClass |
|
{ |
|
return [self APHTTPWithMethod:MSRequestMethodDELETE URL:URL isJson:NO parameters:parameters resultClass:resultClass]; |
|
} |
|
|
|
|
|
#pragma mark- 自定义请求方式 |
|
/// 自定义请求方式 |
|
/// @param method 请求类型 |
|
/// @param URL 接口名称 |
|
/// @param isJson 是否是json |
|
/// @param parameters 接口传参 |
|
/// @param resultClass 返回数据类型模型 |
|
- (RACSignal *)APHTTPWithMethod:(MSRequestMethod)method |
|
URL:(NSString *)URL |
|
isJson:(BOOL)isJson |
|
parameters:(id)parameters |
|
resultClass:(Class)resultClass |
|
{ |
|
|
|
[MSNetwork openLog]; |
|
[MSNetwork setBaseURL:dHostUrl]; |
|
[MSNetwork setRequestSerializer: MSRequestSerializerHTTP]; |
|
if (isJson) |
|
{ |
|
[MSNetwork setRequestSerializer: MSRequestSerializerJSON]; |
|
} |
|
|
|
[MSNetwork setHeader:[self setHttpHeader]]; |
|
// NSString * url = [[NSString stringWithFormat:@"%@",URL] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; |
|
RACSignal *requestSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
|
|
|
[MSNetwork HTTPWithMethod:method url:[NSString stringWithFormat:@"%@",URL] parameters:parameters headers:nil cachePolicy:MSCachePolicyOnlyNetNoCache success:^(id _Nonnull responseObject) { |
|
|
|
[subscriber sendNext:responseObject]; |
|
[subscriber sendCompleted]; |
|
|
|
} failure:^(NSError * _Nonnull error) { |
|
[subscriber sendError:error]; |
|
|
|
}]; |
|
|
|
return [RACDisposable disposableWithBlock:^{ |
|
NSLog(@"6 订阅流程结束,可清理资源"); |
|
}]; |
|
|
|
}]; |
|
|
|
void (^extraHandlerSingal)(id value) = ^(RACTuple * value) { |
|
|
|
}; |
|
return [[[requestSignal catch:^RACSignal *(NSError *error) { |
|
NSData *data = error.userInfo[@"com.alamofire.serialization.response.error.data"]; |
|
if (data) { |
|
NSLog(@"error = %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); |
|
} |
|
[UICommon HidenLoading]; |
|
return [RACSignal error:error]; |
|
}] flattenMap:^RACSignal *(id _Nullable data) { |
|
|
|
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) |
|
{ |
|
|
|
[UICommon HidenLoading]; |
|
//@strongify(self); |
|
NSString *status = F(@"%@", data[@"code"]); |
|
id resultObj = data[@"data"]; |
|
if ([status isKindOfClass:[NSString class]] && [status isEqualToString:@"200"]) |
|
{ |
|
//如果传递的class是PYBaseModel的子类,才解析成对象,否则不做处理 |
|
if (resultObj && resultClass && [resultClass isSubclassOfClass:BaseModel.class]) |
|
{ |
|
if ([resultObj isKindOfClass:[NSArray class]]) |
|
{ |
|
resultObj = [NSArray yy_modelArrayWithClass:resultClass json:resultObj]; |
|
} |
|
// else if ([resultObj isKindOfClass:[NSDictionary class]]) |
|
// { |
|
// resultObj = [NSDictionary yy_modelDictionaryWithClass:resultClass json:resultObj]; |
|
// } |
|
else |
|
{ |
|
resultObj = [resultClass yy_modelWithJSON:resultObj]; |
|
} |
|
} |
|
else |
|
{ //未传递classl对象,数据不解析,有些接口直接返回基础类型,这里不需要转换 |
|
if ([resultObj isKindOfClass:NSNull.class]) |
|
{ |
|
resultObj = nil; |
|
} |
|
} |
|
if (resultObj) |
|
{ |
|
//[self.cache setObject:resultObj forKey:[self cacheKeyWithParameters:parameters apiName:url]]; |
|
} |
|
// NSLog(@"resultObj = %@",resultObj); |
|
[subscriber sendNext:resultObj]; |
|
} |
|
else |
|
{ |
|
//有网络 |
|
NSString *content = data[@"msg"]; |
|
NSString *message = [content isNotBlank] ? content : @""; |
|
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : message,@"detail":status}; |
|
//其他错误 |
|
NSError *error = [NSError errorWithDomain:kErrorDomain code:kErrorException userInfo:userInfo]; |
|
[subscriber sendError:error]; |
|
|
|
} |
|
[subscriber sendCompleted]; |
|
if ([status isEqualToString:@"401"]) |
|
{ |
|
[MSNetwork cancelAllRequest]; |
|
[[NSNotificationCenter defaultCenter] postNotificationName:sRelogin object:nil]; |
|
} |
|
// else if ([status isEqualToString:@"401"]) |
|
// { |
|
// [MSNetwork cancelAllRequest]; |
|
// [[NSNotificationCenter defaultCenter] postNotificationName:hRelogin object:nil]; |
|
// } |
|
return nil; |
|
}]; |
|
}] doNext:extraHandlerSingal]; |
|
} |
|
|
|
|
|
|
|
/// 下载文件 |
|
/// @param url url |
|
/// @param path 下载目标路径 |
|
- (RACSignal *)downloadWithURL:(NSString *)url filePath:(NSString *)path |
|
{ |
|
[MSNetwork openLog]; |
|
RACSignal *requestSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
|
[MSNetwork downloadWithURL:url fileDir:path progress:^(NSProgress * _Nonnull progress) { |
|
} success:^(NSString * _Nonnull path) { |
|
[UICommon HidenLoading]; |
|
[subscriber sendNext:path]; |
|
[subscriber sendCompleted]; |
|
|
|
} failure:^(NSError * _Nonnull error) { |
|
[subscriber sendError:error]; |
|
[UICommon HidenLoading]; |
|
}]; |
|
|
|
return [RACDisposable disposableWithBlock:^{ |
|
NSLog(@"6 订阅流程结束,可清理资源"); |
|
}]; |
|
|
|
}]; |
|
|
|
void (^extraHandlerSingal)(id value) = ^(RACTuple * value) { |
|
|
|
}; |
|
return [[[requestSignal catch:^RACSignal *(NSError *error) { |
|
NSData *data = error.userInfo[@"com.alamofire.serialization.response.error.data"]; |
|
if (data) { |
|
NSLog(@"error = %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); |
|
} |
|
[UICommon HidenLoading]; |
|
return [RACSignal error:error]; |
|
}] flattenMap:^RACSignal *(id _Nullable data) { |
|
|
|
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) |
|
{ |
|
[UICommon HidenLoading]; |
|
[subscriber sendNext:data]; |
|
return nil; |
|
}]; |
|
}] doNext:extraHandlerSingal]; |
|
} |
|
|
|
|
|
/// 上传图片文件 |
|
/// @param url 接口名 |
|
/// @param parameters 参数 |
|
/// @param images 图片数组 |
|
- (RACSignal *)uploadImageWithURL:(NSString *)url |
|
parameters:(NSDictionary *)parameters |
|
images:(NSArray * __nullable)images |
|
{ |
|
[MSNetwork openLog]; |
|
RACSignal *requestSignal; |
|
|
|
requestSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
|
[MSNetwork uploadImageURL:[NSString stringWithFormat:@"%@%@",dHostUrl,url] parameters:parameters headers:[self setHttpHeader] images:images name:@"file" fileName:@"image" imageScale:0.3 imageType:@"png" progress:^(NSProgress * _Nonnull progress) { |
|
|
|
} success:^(id _Nonnull responseObject) { |
|
[UICommon HidenLoading]; |
|
[subscriber sendNext:responseObject]; |
|
[subscriber sendCompleted]; |
|
} failure:^(NSError * _Nonnull error) { |
|
[UICommon HidenLoading]; |
|
[UICommon MessageErrorText:F(@"上传错误:%@",error)]; |
|
}]; |
|
|
|
|
|
return [RACDisposable disposableWithBlock:^{ |
|
NSLog(@"6 订阅流程结束,可清理资源"); |
|
}]; |
|
|
|
}]; |
|
|
|
|
|
void (^extraHandlerSingal)(id value) = ^(RACTuple * value) { |
|
|
|
}; |
|
return [[[requestSignal catch:^RACSignal *(NSError *error) { |
|
NSData *data = error.userInfo[@"com.alamofire.serialization.response.error.data"]; |
|
if (data) { |
|
NSLog(@"error = %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); |
|
} |
|
[UICommon HidenLoading]; |
|
return [RACSignal error:error]; |
|
}] flattenMap:^RACSignal *(id _Nullable data) { |
|
|
|
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) |
|
{ |
|
|
|
[UICommon HidenLoading]; |
|
//@strongify(self); |
|
NSString *status = F(@"%@", data[@"code"]); |
|
id resultObj = data[@"data"]; |
|
if ([status isKindOfClass:[NSString class]] && [status isEqualToString:@"200"]) |
|
{ |
|
[subscriber sendNext:resultObj]; |
|
} |
|
else |
|
{ |
|
//有网络 |
|
NSString *content = data[@"msg"]; |
|
NSString *message = [content isNotBlank] ? content : @""; |
|
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : message,@"detail":status}; |
|
//其他错误 |
|
NSError *error = [NSError errorWithDomain:kErrorDomain code:kErrorException userInfo:userInfo]; |
|
[subscriber sendError:error]; |
|
|
|
} |
|
[subscriber sendCompleted]; |
|
if ([status isEqualToString:@"401"]) { |
|
[[NSNotificationCenter defaultCenter] postNotificationName:sRelogin object:nil]; |
|
} |
|
return nil; |
|
}]; |
|
}] doNext:extraHandlerSingal]; |
|
} |
|
|
|
/// 上传文件 |
|
/// @param url 接口名 |
|
/// @param parameters 参数 |
|
/// @param filePath 文件路径 |
|
/// @param fileData 文件 |
|
- (RACSignal *)uploadFileWithURL:(NSString *)url |
|
parameters:(NSDictionary *)parameters |
|
filePath:(NSString *)filePath |
|
fileData:(NSData *)fileData |
|
{ |
|
[MSNetwork openLog]; |
|
RACSignal *requestSignal; |
|
if (filePath.length > 0) |
|
{ |
|
requestSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
|
[MSNetwork uploadFileWithURL:[NSString stringWithFormat:@"%@%@",dHostUrl,url] parameters:parameters headers:[self setHttpHeader] name:@"file" filePath:filePath progress:^(NSProgress * _Nonnull progress) { |
|
|
|
} success:^(id _Nonnull responseObject) { |
|
[UICommon HidenLoading]; |
|
[subscriber sendNext:responseObject]; |
|
[subscriber sendCompleted]; |
|
} failure:^(NSError * _Nonnull error) { |
|
[UICommon HidenLoading]; |
|
[UICommon MessageErrorText:F(@"上传错误:%@",error)]; |
|
|
|
}]; |
|
|
|
return [RACDisposable disposableWithBlock:^{ |
|
NSLog(@"6 订阅流程结束,可清理资源"); |
|
}]; |
|
|
|
}]; |
|
} |
|
// else |
|
// { |
|
// requestSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
|
// [MSNetwork uploadImageURL:[NSString stringWithFormat:@"%@%@",dHostUrl,url] parameters:parameters headers:[self setHttpHeader] images:@[] name:@"file" fileName:@"image" imageScale:0.5 imageType:@"png" progress:^(NSProgress * _Nonnull progress) { |
|
// |
|
// } success:^(id _Nonnull responseObject) { |
|
// |
|
// } failure:^(NSError * _Nonnull error) { |
|
// |
|
// }]; |
|
// [MSNetwork uploadFileDataWithURL:[NSString stringWithFormat:@"%@%@",dHostUrl,url] parameters:parameters headers:[self setHttpHeader] name:@"file" fileData:fileData progress:^(NSProgress * _Nonnull progress) { |
|
// |
|
// } success:^(id _Nonnull responseObject) { |
|
// [UICommon HidenLoading]; |
|
// [subscriber sendNext:responseObject]; |
|
// [subscriber sendCompleted]; |
|
// } failure:^(NSError * _Nonnull error) { |
|
// [UICommon HidenLoading]; |
|
// [UICommon MessageErrorText:F(@"上传错误:%@",error)]; |
|
// |
|
// }]; |
|
// |
|
// return [RACDisposable disposableWithBlock:^{ |
|
// NSLog(@"6 订阅流程结束,可清理资源"); |
|
// }]; |
|
// |
|
// }]; |
|
// } |
|
|
|
void (^extraHandlerSingal)(id value) = ^(RACTuple * value) { |
|
|
|
}; |
|
return [[[requestSignal catch:^RACSignal *(NSError *error) { |
|
NSData *data = error.userInfo[@"com.alamofire.serialization.response.error.data"]; |
|
if (data) { |
|
NSLog(@"error = %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); |
|
} |
|
[UICommon HidenLoading]; |
|
return [RACSignal error:error]; |
|
}] flattenMap:^RACSignal *(id _Nullable data) { |
|
|
|
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) |
|
{ |
|
|
|
[UICommon HidenLoading]; |
|
//@strongify(self); |
|
NSString *status = F(@"%@", data[@"code"]); |
|
id resultObj = data[@"data"]; |
|
if ([status isKindOfClass:[NSString class]] && [status isEqualToString:@"200"]) |
|
{ |
|
[subscriber sendNext:resultObj]; |
|
} |
|
else |
|
{ |
|
//有网络 |
|
NSString *content = data[@"msg"]; |
|
NSString *message = [content isNotBlank] ? content : @""; |
|
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : message,@"detail":status}; |
|
//其他错误 |
|
NSError *error = [NSError errorWithDomain:kErrorDomain code:kErrorException userInfo:userInfo]; |
|
[subscriber sendError:error]; |
|
|
|
} |
|
[subscriber sendCompleted]; |
|
if ([status isEqualToString:@"401"]) { |
|
[[NSNotificationCenter defaultCenter] postNotificationName:sRelogin object:nil]; |
|
} |
|
return nil; |
|
}]; |
|
}] doNext:extraHandlerSingal]; |
|
} |
|
|
|
|
|
#pragma mark- 设置网络请求头部视图 |
|
/// 设置网络请求头部视图 |
|
- (NSMutableDictionary *)setHttpHeader |
|
{ |
|
NSMutableDictionary *header = [NSMutableDictionary dictionary]; |
|
if (self.loginModel && [self.loginModel.Authorization isNotBlank]) |
|
{ |
|
[header setValue:self.loginModel.Authorization forKey:@"Authorization"]; |
|
/// 当前登陆的用户ID |
|
[header setValue:self.loginModel.openid forKey:@"openid"]; |
|
} |
|
else |
|
{ |
|
[header setValue:@"0" forKey:@"Authorization"]; |
|
/// 当前登陆的用户ID |
|
[header setValue:@"0" forKey:@"openid"]; |
|
|
|
} |
|
/// 请求时间 |
|
long long timestamp = [[NSDate date] timeIntervalSince1970] * 1000; |
|
[header setValue:F(@"%lld", timestamp) forKey:@"timestamp"]; |
|
/// bundleId |
|
NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; |
|
[header setValue:bundleId forKey:@"package"]; |
|
/// 设备id |
|
[header setObject:[UIDevice currentDevice].identifierForVendor.UUIDString forKey:@"deviceId"]; |
|
/// 设备类型 |
|
[header setValue:@"MOBILE" forKey:@"deviceType"]; |
|
/// 设备型号 |
|
[header setValue:[[UIDevice currentDevice] model] forKey:@"deviceModel"]; |
|
/// 系统版本 |
|
[header setValue:[UIDevice currentDevice].systemVersion forKey:@"osVersion"]; |
|
/// 系统类型 |
|
[header setValue:@"IOS" forKey:@"osType"]; |
|
/// 必传 |
|
[header setValue:@"APP" forKey:@"loginChannel"]; |
|
/// 版本 |
|
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; |
|
[header setValue:version forKey:@"appVersion"]; |
|
/// 发布渠道 |
|
#ifdef DEBUG |
|
[header setValue:@"develop" forKey:@"version"]; |
|
#else |
|
[header setValue:@"produce" forKey:@"version"]; |
|
#endif |
|
|
|
|
|
NSString *deviceTokens = [UserDefaults objectForKey:DeviceTokenKey]; |
|
/// APNS Token |
|
[header setValue:STRINGHASVALUE(deviceTokens) ? deviceTokens : @"" forKey:@"deviceToken"]; |
|
|
|
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; |
|
NSArray *array = [language componentsSeparatedByString:@"-"]; |
|
NSString *currentLanguage = array[0]; |
|
NSString *current = [currentLanguage isEqualToString:@"en"] ? F(@"%@_US", currentLanguage) : F(@"%@_CN", currentLanguage); |
|
[header setValue:current forKey:@"Accept-Language"]; |
|
|
|
return header; |
|
} |
|
|
|
|
|
|
|
/// 使用body传数据 |
|
- (RACSignal *)PostBodyWithApi:(NSString *)api json:(id)json |
|
{ |
|
RACSignal *requestSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
|
NSString*requestUrl = api; |
|
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; |
|
NSMutableURLRequest *request = [self GetRequest:requestUrl]; |
|
// 设置body |
|
NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; |
|
[request setHTTPBody:data]; |
|
AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer]; |
|
responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",nil]; |
|
manager.responseSerializer = responseSerializer; |
|
|
|
NSLog(@"\r头部请求参数:%@",request); |
|
[[manager dataTaskWithRequest:request uploadProgress:^(NSProgress * _Nonnull uploadProgress) { |
|
|
|
} downloadProgress:^(NSProgress * _Nonnull downloadProgress) { |
|
|
|
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { |
|
|
|
if (error) |
|
{ |
|
[subscriber sendError:error]; |
|
} |
|
else |
|
{ |
|
[subscriber sendNext:responseObject]; |
|
[subscriber sendCompleted]; |
|
} |
|
|
|
}] resume]; |
|
|
|
return [RACDisposable disposableWithBlock:^{ |
|
NSLog(@"6 订阅流程结束,可清理资源"); |
|
}]; |
|
}]; |
|
|
|
void (^extraHandlerSingal)(id value) = ^(RACTuple * value) { |
|
|
|
}; |
|
return [[[requestSignal catch:^RACSignal *(NSError *error) { |
|
NSData *data = error.userInfo[@"com.alamofire.serialization.response.error.data"]; |
|
if (data) { |
|
NSLog(@"error = %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); |
|
} |
|
[UICommon HidenLoading]; |
|
return [RACSignal error:error]; |
|
}] flattenMap:^RACSignal *(id _Nullable data) { |
|
|
|
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) |
|
{ |
|
|
|
[UICommon HidenLoading]; |
|
NSDictionary *dictFromData = [NSJSONSerialization JSONObjectWithData:data |
|
options:NSJSONReadingAllowFragments |
|
error:nil]; |
|
NSLog(@"--->%@",dictFromData); |
|
//@strongify(self); |
|
NSString *status = F(@"%@", dictFromData[@"code"]); |
|
id resultObj = dictFromData[@"data"]; |
|
if ([status isKindOfClass:[NSString class]] && [status isEqualToString:@"200"]) |
|
{ |
|
[subscriber sendNext:resultObj]; |
|
} |
|
else |
|
{ |
|
//有网络 |
|
NSString *content = dictFromData[@"msg"]; |
|
NSString *message = [content isNotBlank] ? content : @""; |
|
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : message,@"code":status}; |
|
//其他错误 |
|
NSError *error = [NSError errorWithDomain:kErrorDomain code:kErrorException userInfo:userInfo]; |
|
[subscriber sendError:error]; |
|
|
|
} |
|
[subscriber sendCompleted]; |
|
if ([status isEqualToString:@"401"]) { |
|
[[NSNotificationCenter defaultCenter] postNotificationName:sRelogin object:nil]; |
|
} |
|
return nil; |
|
}]; |
|
}] doNext:extraHandlerSingal]; |
|
} |
|
|
|
|
|
- (NSMutableURLRequest *)GetRequest:(NSString *)URL |
|
{ |
|
NSString *reURL = F(@"%@%@", dHostUrl,URL); |
|
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:reURL parameters:nil error:nil]; |
|
request.timeoutInterval = 30; |
|
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; |
|
if (self.loginModel && [self.loginModel.Authorization isNotBlank]) |
|
{ |
|
[request setValue:self.loginModel.Authorization forHTTPHeaderField:@"Authorization"]; |
|
/// 当前登陆的用户ID |
|
[request setValue:self.loginModel.openid forHTTPHeaderField:@"openid"]; |
|
} |
|
else |
|
{ |
|
[request setValue:@"0" forHTTPHeaderField:@"Authorization"]; |
|
/// 当前登陆的用户ID |
|
[request setValue:@"0" forHTTPHeaderField:@"openid"]; |
|
|
|
} |
|
/// 请求时间 |
|
long long timestamp = [[NSDate date] timeIntervalSince1970] * 1000; |
|
[request setValue:F(@"%lld", timestamp) forHTTPHeaderField:@"timestamp"]; |
|
/// bundleId |
|
NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; |
|
[request setValue:bundleId forHTTPHeaderField:@"package"]; |
|
/// 设备id |
|
[request setValue:[UIDevice currentDevice].identifierForVendor.UUIDString forHTTPHeaderField:@"deviceId"]; |
|
/// 设备类型 |
|
[request setValue:@"MOBILE" forHTTPHeaderField:@"deviceType"]; |
|
/// 设备型号 |
|
[request setValue:[[UIDevice currentDevice] model] forHTTPHeaderField:@"deviceModel"]; |
|
/// 系统版本 |
|
[request setValue:[UIDevice currentDevice].systemVersion forHTTPHeaderField:@"osVersion"]; |
|
/// 系统类型 |
|
[request setValue:@"IOS" forHTTPHeaderField:@"osType"]; |
|
/// 必传 |
|
[request setValue:@"APP" forHTTPHeaderField:@"loginChannel"]; |
|
/// 版本 |
|
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; |
|
[request setValue:version forHTTPHeaderField:@"appVersion"]; |
|
/// 发布渠道 |
|
#ifdef DEBUG |
|
[request setValue:@"develop" forHTTPHeaderField:@"version"]; |
|
#else |
|
[request setValue:@"produce" forHTTPHeaderField:@"version"]; |
|
#endif |
|
|
|
|
|
NSString *deviceTokens = [UserDefaults objectForKey:DeviceTokenKey]; |
|
/// APNS Token |
|
[request setValue:STRINGHASVALUE(deviceTokens) ? deviceTokens : @"" forHTTPHeaderField:@"deviceToken"]; |
|
|
|
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; |
|
NSArray *array = [language componentsSeparatedByString:@"-"]; |
|
NSString *currentLanguage = array[0]; |
|
NSString *current = [currentLanguage isEqualToString:@"en"] ? F(@"%@_US", currentLanguage) : F(@"%@_CN", currentLanguage); |
|
[request setValue:current forHTTPHeaderField:@"Accept-Language"]; |
|
|
|
return request; |
|
} |
|
|
|
- (NSMutableArray *)deviceList |
|
{ |
|
if (!_deviceList)_deviceList = [NSMutableArray new]; |
|
return _deviceList; |
|
} |
|
|
|
|
|
@end |
|
|
|
|