// // ServerRequest.m // Earthquake Network // // Refactored by Andrea Busi on 25/09/2020. // Copyright © 2020 Earthquake Network. All rights reserved. // #import "ServerRequest.h" #import "Reachability.h" #import "Costanti.h" #import "EQNUtility.h" #import "NSDictionary+EQNExtensions.h" @interface ServerRequest () @property (strong, nonatomic) NSURLSession *session; @property (nonatomic) Reachability *internetReachability; @end @implementation ServerRequest #pragma mark - Singleton + (instancetype)defaultServerConnectionSingleton { static ServerRequest *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; } #pragma mark - Init - (instancetype)init { self = [super init]; if (self) { NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration]; self.session = [NSURLSession sessionWithConfiguration:config]; // registro notifiche rilevamento connessione [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; self.internetReachability = [Reachability reachabilityForInternetConnection]; [self.internetReachability startNotifier]; [self setValue:@([self updateConnectionReachability:self.internetReachability]) forKey:@"isConnect"]; } return self; } #pragma mark - Reachability notifications /// Called by Reachability whenever status changes. - (void)reachabilityChanged:(NSNotification *)notification { if ([notification.object isKindOfClass:[Reachability class]]) { Reachability *curReach = [notification object]; [self setValue:@([self updateConnectionReachability:curReach]) forKey:@"isConnect"]; } } #pragma mark - Private - (BOOL)updateConnectionReachability:(Reachability *)reachability { NetworkStatus netStatus = [reachability currentReachabilityStatus]; switch (netStatus) { case NotReachable: return NO; default: return YES; } } #pragma mark - Public - (void)inviaInformazioniAlServerWithURL:(NSURL *)url richiesta:(EQNTipoChiamata)chiamata success:(successCompletionHandler)onSuccess failure:(errorCompletionHandler)onFailure { if (!self.isConnect) { NSLog(@"[ServerRequest] not connected, return error"); NSError *error = [NSError errorWithDomain:NSMachErrorDomain code:401 userInfo:@{MESSAGGIO : NSLocalizedString(@"manual_error", @"")}]; onFailure(error); // todo Andrea: perchè non viene fatto return? era già così } NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod:@"GET"]; dispatch_async(dispatch_get_main_queue(), ^{ [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; }); NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *)response; if (error) { NSLog(@"[ServerRequest] response error: %@", error.localizedDescription); onFailure(error); return; } NSError *jsonError; id JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; if (!jsonError){ if (EQNDebugPrintResponse) { NSLog(@"[ServerRequest] response json: %@", JSON); } switch (httpResp.statusCode) { case 200: switch (chiamata) { case EQNTipoChiamataPosizione: onSuccess(@"success"); break; case EQNTipoChiamataAlertSimulator: onSuccess([NSString stringWithFormat:@"%@", JSON]); break; default: onSuccess(JSON); break; } dispatch_async(dispatch_get_main_queue(), ^{ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }); } } else { NSString *newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (newStr && (httpResp.statusCode >= 200 && httpResp.statusCode <= 299)) { if (EQNDebugPrintResponse) { NSLog(@"[ServerRequest] response string: %@", newStr); } switch (chiamata) { case EQNTipoChiamataSegnalazioneTerremoto: onSuccess([EQNUtility clearStringMessaggi:newStr]); break; case EQNTipoChiamataRilevamento: onSuccess([EQNUtility clearStringMessaggi:newStr]); break; case EQNTipoChiamataPosizione: case EQNTipoChiamataCalibrazione: case EQNTipoChiamataImpostazioniNotifiche: case EQNTipoChiamataAlertSimulator: case EQNTipoChiamataRegisterSubscription: onSuccess(newStr); default: // don't call the callback break; } } else { NSLog(@"[ServerRequest] Unable to create string with response: %@", [jsonError description]); NSError *error = [NSError errorWithDomain:NSMachErrorDomain code:0 userInfo:@{MESSAGGIO : NSLocalizedString(@"manual_error", @"messaggio errore inserimento credenziali")}]; onFailure(error); dispatch_async(dispatch_get_main_queue(), ^{ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; }); } } }]; [dataTask resume]; } - (void)inviaRicevuta:(NSData *)ricevuta success:(successCompletionHandler)onSuccess failure:(errorCompletionHandler)onFailure { NSString *jsonObjectString = [ricevuta base64EncodedStringWithOptions:0]; NSDictionary *params = @{@"ricevuta" :jsonObjectString}; NSString *parametri = [params eqn_jsonStringWithPrettyPrint:YES]; NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@""]]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [urlRequest addValue:@"application/json" forHTTPHeaderField:@"Accept"]; [urlRequest setHTTPBody:[parametri dataUsingEncoding:NSUTF8StringEncoding]]; NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *)response; if (error) { NSLog(@"[ServerRequest] inviaRicevuta | response error: %@", error.localizedDescription); onFailure(error.userInfo[@"NSLocalizedDescription"]); return; } NSError *jsonError; NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; if (!jsonError) { switch (httpResp.statusCode) { case 200: onSuccess(JSON); break; default: NSLog(@"[ServerRequest] inviaRicevuta | response error, status code: %ld", (long)httpResp.statusCode); break; } } }]; [dataTask resume]; } @end