我尝试在模拟器中设置位置并在 appDelegate.m 中初始化 CTTelephonyNetworkInfo,但没有工作。我通过定义一个新类 APIAgent.m 来修复它:
+ (APIAgent *)manager {
static APIAgent *_manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_manager = [[APIAgent alloc] initWithBaseURL:[NSURL URLWithString:API_URL]];
_manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSMutableIndexSet* codes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(200, 100)];
[codes addIndex: 400];
[codes addIndex: 401];
[codes addIndex: 404];
[codes addIndex: 409];
[codes addIndex: 500];
_manager.responseSerializer.acceptableStatusCodes = codes;
});
return _manager;
}
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
[self setHeaders];
return self;
}
- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters progress:(void (^)(NSProgress *uploadProgress))uploadProgress
complete:(void (^)(NSURLSessionDataTask *task, id responseObject, NSError *error))complete {
return [self GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
if (complete) {
complete(task, responseObject, nil);
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
if (complete) {
complete(task, nil, error);
}
}];
}
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters complete:(void (^)(NSURLSessionDataTask *task, id responseObject, NSError *error))complete {
return [self POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
if (complete) {
complete(task, responseObject, nil);
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
if (complete) {
complete(task, nil, error);
}
}];
}
- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters progress:(void (^)(NSProgress *uploadProgress))uploadProgress
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
self.securityPolicy.allowInvalidCertificates = YES; // self signed certificate
self.securityPolicy.validatesDomainName = NO;
return [super GET:URLString parameters:parameters progress:nil success:success failure:failure];
}
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
progress:(void (^)(NSProgress *uploadProgress))uploadProgress
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
NSMutableDictionary *params = [parameters mutableCopy];
self.securityPolicy.allowInvalidCertificates = YES; // self signed certificate
self.securityPolicy.validatesDomainName = NO;
return [super POST:URLString parameters:params progress:nil success:success failure:failure];
}
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters constructingBodyWithBlock:(void (^)(id<AFMultipartFormData>))block
progress:(void (^)(NSProgress *uploadProgress))uploadProgress
success:(void (^)(NSURLSessionDataTask *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
NSMutableDictionary *params = [parameters mutableCopy];
if (parameters == nil) {
params = [[NSMutableDictionary alloc] init];
} else {
if (parameters[@"postId"] != nil) {
params[@"postId"] = parameters[@"postId"];
}
}
self.securityPolicy.allowInvalidCertificates = YES; // http://stackoverflow.com/questions/27808249/problems-with-ssl-pinning-and-afnetworking-2-5-0-nsurlerrordomain-error-1012
self.securityPolicy.validatesDomainName = NO;
return [super POST:URLString parameters:params constructingBodyWithBlock:block progress:nil success:success failure:failure];
}
- (void)setHeaders {
NSString *time = [NSString stringWithFormat:@"%f", [[[NSDate alloc] init] timeIntervalSince1970]];
AFHTTPRequestSerializer * serializer = self.requestSerializer;
[serializer setValue:time forHTTPHeaderField:@"X-API-TIME"];
[serializer setValue:[UIDevice currentDevice].identifierForVendor.UUIDString forHTTPHeaderField:@"X-UUID"];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSString *preferredLang = [NSLocale preferredLanguages].firstObject;
[serializer setValue:preferredLang forHTTPHeaderField:@"X-USER-LANGUAGE"];
}