эта функция является копией другого идентичного, но с другими ключами. с другой стороны, это работает, я не могу понять, почему здесь происходит сбой приложения ..
#pragma mark - ChangePin
- (void) doChangePin: (NSString *) pinUser card: (NSString *) pinCard viewController: (UIViewController *) viewController success:(successSDKType)success failure:(failureSDKType)failure{
self.mcPersonalEnrollmentRequest.mcCardPan = pinCard;
PRLog(@"Pin Inserito: %@", pinUser);
SecurityCryptogram *securityCryptogram = [CryptogramManager getSecurityCriptogramWithPan:pinCard pin:pinUser];
self.mcPersonalEnrollmentRequest.securityCryptogram = securityCryptogram;
self.mcPersonalEnrollmentRequest.mcIdPublicKey = [[ServiceDataManager getInstance] getIdPublicKey];
NSDictionary* dtoReq = [self.mcPersonalEnrollmentRequest getDictionary];
[self.netManager doRequestWithCommand:CMD_STATUS_CHECK dtoReq:dtoReq successCompletion:^(NetworkResponse *successData) {
NSDictionary *resources = (NSDictionary *)[successData res];
McCardEnrolled *mcCardEnrolled = [[McCardEnrolled alloc] initWithResDict:resources];
[[ServiceDataManager getInstance] storeMcCard:mcCardEnrolled];
McCard *mcCard = [mcCardEnrolled getCard];
//We have to go on main thread to pop the controller
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.mcCardEnrollmentSuccessCallback(mcCard);
self.cardEnrollmentViewController.navigationController.navigationBar.translucent = NO;
[self.cardEnrollmentViewController.navigationController popViewControllerAnimated:YES];
self.cardEnrollmentViewController = nil;
self.mcCardEnrollmentSuccessCallback = nil;
self.mcCardEnrollmentFailureCallback = nil;
self.mcCardEnrollmentRequest = nil;
}];
} failureCompletion:^(Result *failureResult) {
//Same of success case. We have to go on main thread to pop the controller
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.mcCardEnrollmentFailureCallback(failureResult);
self.cardEnrollmentViewController.navigationController.navigationBar.translucent = NO;
[self.cardEnrollmentViewController.navigationController popViewControllerAnimated:YES];
self.cardEnrollmentViewController = nil;
self.mcCardEnrollmentSuccessCallback = nil;
self.mcCardEnrollmentFailureCallback = nil;
self.mcCardEnrollmentRequest = nil;
}];
}];
ошибка:
Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: ' *** - [__ NSDictionaryM setObject: forKey:]: объект не может быть nil (ключ: req) '
, которые изменяются следующими объектами или переменными: mcPersonalEnrollmentRequest CMD_STATUS_CHECK, который я воссоздал здесь для этой функции.
- (void) doRequestWithCommand:(NSString*)cmd dtoReq:(NSDictionary*)dtoReq successCompletion:(successCompletionType)success failureCompletion:(failureCompletionType)failure{
PRLog(@"NET-MAN> CMD:%@ - Prepare request with dtoReq: %@",cmd,[dtoReq description]);
NetworkRequest *request = [self prepareRequestForCommand:cmd dtoReq:dtoReq];
PRLog(@"NET-REQ> CMD:%@ - [DEBUG] Request created", cmd);
NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:nil];
NSURLSessionDataTask* task = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
PRLog(@"NET-MAN> CMD:%@ - Received response. Error: %@", cmd, [error description]);
if (!error) {
// Success
NSString *errMsg;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSDictionary *jsonResponse = [PRUtility dictionaryFromJsonData:data];
if(jsonResponse){
PRLog(@"NET-MAN> CMD:%@ - JSON RESPONSE != nil", cmd);
NSDictionary* svcResDict = (NSDictionary*)[jsonResponse objectForKey:DTO_RESPONSE_TAG_SVC];
if(svcResDict && svcResDict != (NSDictionary *)[NSNull null]){
PRLog(@"NET-MAN> CMD:%@ - Trying parsing response.",cmd);
NetworkResponse* networkResponse = [[NetworkResponse alloc] initWithCmd:cmd andNetworkData:svcResDict];
if (networkResponse) {
//Happy flow
PRLog(@"NET-MAN> CMD:%@ - Response created correctly.",cmd);
Result* resultForBadStatusCode = [self errorFromStatusCode:networkResponse.dtoStatus];
!resultForBadStatusCode ? success(networkResponse) : failure(resultForBadStatusCode);
return;
}
else{
errMsg = @"Error while accessing to networkResponse";
}
}
else{
errMsg = @"SVC field not found";
}
}
else{
errMsg = @"Cannot parses response into json";
}
} else {
errMsg = @"Recevied an error [response is not a NSHTTPURLResponse]";
}
Result *errorResponse = [[Result alloc] initGenericErrorWithMalformedNetworkResponse:errMsg];
PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, errMsg);
failure(errorResponse);
} else {
// Fail
Result *errorNetwork = [self errorNetworkFromCode:error.code];
PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, error.description);
failure(errorNetwork);
}
}];
PRLog(@"NET-MAN: CMD:%@ - Doing request...", request.cmd);
[task resume];
}
- (void) doRequestWithCommand:(NSString*)cmd dtoReq:(NSDictionary*)dtoReq successCompletion:(successCompletionType)success failureCompletion:(failureCompletionType)failure{
PRLog(@"NET-MAN> CMD:%@ - Prepare request with dtoReq: %@",cmd,[dtoReq description]);
NetworkRequest *request = [self prepareRequestForCommand:cmd dtoReq:dtoReq];
PRLog(@"NET-REQ> CMD:%@ - [DEBUG] Request created", cmd);
NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:nil];
NSURLSessionDataTask* task = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
PRLog(@"NET-MAN> CMD:%@ - Received response. Error: %@", cmd, [error description]);
if (!error) {
// Success
NSString *errMsg;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSDictionary *jsonResponse = [PRUtility dictionaryFromJsonData:data];
if(jsonResponse){
PRLog(@"NET-MAN> CMD:%@ - JSON RESPONSE != nil", cmd);
NSDictionary* svcResDict = (NSDictionary*)[jsonResponse objectForKey:DTO_RESPONSE_TAG_SVC];
if(svcResDict && svcResDict != (NSDictionary *)[NSNull null]){
PRLog(@"NET-MAN> CMD:%@ - Trying parsing response.",cmd);
NetworkResponse* networkResponse = [[NetworkResponse alloc] initWithCmd:cmd andNetworkData:svcResDict];
if (networkResponse) {
//Happy flow
PRLog(@"NET-MAN> CMD:%@ - Response created correctly.",cmd);
Result* resultForBadStatusCode = [self errorFromStatusCode:networkResponse.dtoStatus];
!resultForBadStatusCode ? success(networkResponse) : failure(resultForBadStatusCode);
return;
}
else{
errMsg = @"Error while accessing to networkResponse";
}
}
else{
errMsg = @"SVC field not found";
}
}
else{
errMsg = @"Cannot parses response into json";
}
} else {
errMsg = @"Recevied an error [response is not a NSHTTPURLResponse]";
}
Result *errorResponse = [[Result alloc] initGenericErrorWithMalformedNetworkResponse:errMsg];
PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, errMsg);
failure(errorResponse);
} else {
// Fail
Result *errorNetwork = [self errorNetworkFromCode:error.code];
PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, error.description);
failure(errorNetwork);
}
}];
PRLog(@"NET-MAN: CMD:%@ - Doing request...", request.cmd);
[task resume];
}
- (NetworkRequest*) prepareRequestForCommand:(NSString*)cmd dtoReq:(NSDictionary*)dtoReq{
NSMutableDictionary* dtoAppRequest = [[NSMutableDictionary alloc] init];
[dtoAppRequest setObject:cmd
forKey:CMD_TAG];
[dtoAppRequest setObject:dtoReq forKey:REQ_TAG];
NetworkRequest *request = [[NetworkRequest alloc] initWithDtoAppRequest:dtoAppRequest
jSessionClient:self.userConfig.jSessionClient
userId:self.userConfig.userId
fiscalCode:self.userConfig.fiscalCode];
[request completeRequestObject];
return request;
}