From 5006517bb11b708e866cd649294f851b4c8af07b Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Sat, 25 Feb 2023 00:20:55 -0500 Subject: [PATCH 01/12] wrapper function to add additoinal request data to error objects. begin working on better silentError handling. --- .../MVMCore/Constants/MVMCoreErrorConstants.m | 4 ++ .../MVMCore/LoadHandling/MVMCoreLoadHandler.h | 9 ++++ .../MVMCore/LoadHandling/MVMCoreLoadHandler.m | 21 +++++++-- .../MVMCoreLoadRequestOperation.h | 1 + .../MVMCoreLoadRequestOperation.m | 26 +++++++---- MVMCore/MVMCore/Utility/MVMCoreErrorObject.h | 5 +++ MVMCore/MVMCore/Utility/MVMCoreErrorObject.m | 43 ++++++++----------- 7 files changed, 71 insertions(+), 38 deletions(-) diff --git a/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m b/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m index d626352..e9028ff 100644 --- a/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m +++ b/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m @@ -9,6 +9,10 @@ #import "MVMCoreErrorConstants.h" // Error Domains + +/// Communication breakddowns. NSString * const ErrorDomainSystem = @"ErrorDomainSystem"; +/// Any sort of native error not due to server directivees. NSString * const ErrorDomainNative = @"ErrorDomainNative"; +/// Specific errors defined by the server. NSString * const ErrorDomainServer = @"ErrorDomainServer"; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h index 84de194..93e7404 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h @@ -33,6 +33,15 @@ // Returns the error location for the given requesting object and page type and modules. Important for proper logging. - (nonnull NSString *)errorLocationForRequest:(nonnull id)requestingObject pageType:(nonnull NSString *)pageType modules:(nonnull NSString *)modules; +// Returns an error given a load object and error details. Attaches session data related to the load. Important for proper logging. +- (nonnull MVMCoreErrorObject *)errorForLoadObject:(nonnull MVMCoreLoadObject *)loadObject withTitle:(nullable NSString *)title message:(nullable NSString *)message code:(NSInteger)code domain:(nonnull NSString *)domain; + +// Returns an error given a load object and NSError. Attaches session data related to the load. Important for proper logging. +- (nonnull MVMCoreErrorObject *)errorForLoadObject:(nonnull MVMCoreLoadObject *)loadObject causedBy:(nonnull NSError *)error; + +// Decorates an error object given a load object. +- (nonnull MVMCoreErrorObject *)attachLoadInformation:(nonnull MVMCoreLoadObject *)loadObject toError:(nonnull MVMCoreErrorObject *)error; + #pragma mark - Request Functions. - (void)setHeadersForRequest:(nonnull NSMutableURLRequest *)request requestParameters:(nonnull MVMCoreRequestParameters *)requestParameters; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m index 842d032..e5eb99d 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m @@ -95,9 +95,22 @@ } } +- (nonnull MVMCoreErrorObject *)errorForLoadObject:(MVMCoreLoadObject *)loadObject withTitle:(NSString *)title message:(NSString *)message code:(NSInteger)code domain:(NSString *)domain { + return [self attachLoadInformation:loadObject toError:[[MVMCoreErrorObject alloc] initWithTitle:title messageToLog:message code:code domain:domain location:[self errorLocationForRequest:loadObject]]]; +} + +- (nonnull MVMCoreErrorObject *)errorForLoadObject:(MVMCoreLoadObject *)loadObject causedBy:(NSError *)error { + return [self attachLoadInformation:loadObject toError:[MVMCoreErrorObject createErrorObjectForNSError:error location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]]; +} + +- (nonnull MVMCoreErrorObject *)attachLoadInformation:(MVMCoreLoadObject *)loadObject toError:(MVMCoreErrorObject *)error { + return error; // For now, just exposed for overriding. +} + - (nonnull NSString *)errorLocationForRequest:(nonnull MVMCoreLoadObject *)loadObject { - - return [self errorLocationForRequest:loadObject.delegateObject.loadDelegate pageType:loadObject.requestParameters.pageType modules:[NSString stringWithFormat:@"%@",loadObject.requestParameters.modules]]; + return [self errorLocationForRequest:loadObject.delegateObject.loadDelegate + pageType:loadObject.requestParameters.pageType + modules:[NSString stringWithFormat:@"%@", loadObject.requestParameters.modules]]; } - (nonnull NSString *)errorLocationForRequest:(nonnull id)requestingObject pageType:(nonnull NSString *)pageType modules:(nonnull NSString *)modules { @@ -349,7 +362,7 @@ if (!jsonObject) { // Error serializing json. - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] messageToLog:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] code:ErrorCodeParsingJSON domain:ErrorDomainNative location:locationForError]; + errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] messageToLog:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] code:ErrorCodeParsingJSON domain:ErrorDomainSystem location:locationForError]; } else { // Uncomment to get the raw UTF-8 string response from server before it is parsed. Useful for identifying issues such as duplicate definitions which are removed after parsing. (Also, be careful of parsing tools such as jsoneditoronline.org which will autoresolve some of these issues as well.) @@ -362,7 +375,7 @@ } } else { // Empty response. - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeEmptyResponse domain:ErrorDomainNative location:locationForError]; + errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeEmptyResponse domain:ErrorDomainSystem location:locationForError]; } } else if ([[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(createErrorObjectForRequestNSError:forRequest:location:)]) { diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.h b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.h index 1a9f80a..0afd035 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.h +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.h @@ -22,6 +22,7 @@ @property (nullable, strong, nonatomic) MVMCoreLoadObject *loadObject; @property (nullable, strong, nonatomic) NSDictionary *dataForPage; @property (nullable, strong, nonatomic) DelegateObject *delegateObject; +@property (nullable, nonatomic, readonly) NSURLSessionTask *sessionTask; @property (nullable, nonatomic, readonly) NSString *finalLoadSource; @property (nonatomic) BOOL backgroundLoad; @property (nonatomic, getter=areDependenciesAdded) BOOL dependenciesAdded; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index 48f104c..848d283 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -291,7 +291,7 @@ } else { // Error json not correct format. - MVMCoreErrorObject *errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainNative location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + MVMCoreErrorObject *errorObject = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainSystem]; [MVMCoreLoadRequestOperation loadAbortedWithError:errorObject loadObject:loadObject]; } } else { @@ -498,6 +498,7 @@ if (error.errorScreenError && !error.nativeDrivenErrorScreen && loadObject.pageType.length == 0) { error.logError = YES; error.errorScreenError = NO; + error.silentError = NO; error.location = [NSString stringWithFormat:@"%li-%@",(long)ErrorCodeNoErrorPageSent,error.location]; [MVMCoreLoadRequestOperation handleError:error loadObject:loadObject showAlertForErrorIfApplicable:YES]; [MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:nil errorObject:error]; @@ -571,7 +572,8 @@ } else if ([ValueTypeErrorScreen isEqualToString:type]) { // Error Screen, abort the load and handle the screen if necessary - MVMCoreErrorObject *error = [MVMCoreErrorObject createErrorObjectForErrorInfo:loadObject.responseInfoMap location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + MVMCoreErrorObject *error = [[MVMCoreLoadHandler sharedGlobal] attachLoadInformation:loadObject toError:[MVMCoreErrorObject createErrorObjectForErrorInfo:loadObject.responseInfoMap location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]]; + [MVMCoreLoadRequestOperation loadAbortedWithError:error loadObject:loadObject]; } else { @@ -582,7 +584,7 @@ } else { // Check for controller specific errors. BOOL shouldContinue; - MVMCoreErrorObject *error = [MVMCoreErrorObject createErrorObjectForErrorInfo:loadObject.responseInfoMap location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + MVMCoreErrorObject *error = [[MVMCoreLoadHandler sharedGlobal] attachLoadInformation:loadObject toError:[MVMCoreErrorObject createErrorObjectForErrorInfo:loadObject.responseInfoMap location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]]; if ([loadObject.delegateObject.loadDelegate respondsToSelector:@selector(checkForDelegateSpecificErrors:loadObject:completionHandler:)]) { shouldContinue = [loadObject.delegateObject.loadDelegate checkForDelegateSpecificErrors:error loadObject:loadObject completionHandler:completionHandler]; } else { @@ -614,16 +616,22 @@ } if (obj && [obj isKindOfClass:[NSDictionary class]]) { - NSDictionary *responseInfo = [obj dict:KeyResponseInfo]; if (![ValueTypeSuccess isEqualToString:[responseInfo string:KeyType]]) { - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[responseInfo stringForKey:KeyErrorHeading] message:[responseInfo stringForKey:KeyUserMessage] messageToLog:[responseInfo stringForKey:KeyMessage] code:[[responseInfo string:KeyCode] integerValue] domain:ErrorDomainServer location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + errorObject = [[MVMCoreLoadHandler sharedGlobal] attachLoadInformation:loadObject toError: + [[MVMCoreErrorObject alloc] + initWithTitle:[responseInfo stringForKey:KeyErrorHeading] + message:[responseInfo stringForKey:KeyUserMessage] + messageToLog:[responseInfo stringForKey:KeyMessage] + code:[[responseInfo string:KeyCode] integerValue] + domain:ErrorDomainServer + location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]]; } // Caches each dictionary from the array. [[MVMCoreCache sharedCache] addModuleToCache:obj module:key queue:nil waitUntilFinished:YES completionBlock:NULL]; } else { - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainNative location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + errorObject = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainSystem]; } if (errorObject) { @@ -666,10 +674,10 @@ if (pageType) { [[MVMCoreCache sharedCache] addPageToCache:obj pageType:pageType queue:nil waitUntilFinished:YES completionBlock:NULL]; } else { - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeNoPageType domain:ErrorDomainNative location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + errorObject = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeNoPageType domain:ErrorDomainNative]; } } else { - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainNative location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + errorObject = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainNative]; } // Logs the error. @@ -713,7 +721,7 @@ } } else { // Couldn't initialize view controller, serious error. - error = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeInitViewController domain:ErrorDomainNative location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]; + error = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeInitViewController domain:ErrorDomainNative]; } [MVMCoreLoadRequestOperation handleShouldContinue:shouldContinue error:error loadObject:loadObject errorBlock:NULL continueBlock:^{ diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h index 86fdda0..b91326e 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h @@ -22,6 +22,11 @@ @property (nullable, strong, nonatomic) NSString *systemDomain; @property (nonatomic) NSInteger code; @property (nonatomic) UIApplicationState applicationState; +@property (nullable, strong, nonatomic) NSString *sessionId; +@property (nullable, strong, nonatomic) NSString *requestId; +@property (nullable, strong, nonatomic) NSString *requestUrl; +@property (nonatomic, assign) NSInteger httpStatusCode; +@property (nonatomic, strong) NSDictionary *serverResponseInfo; // For the crash log. @property (nullable, strong, nonatomic) NSDictionary *crashLog; diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m index 09f76b4..40432d0 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m @@ -28,21 +28,17 @@ self.domain = domain; self.location = location; self.date = [NSDate date]; + self.silentError = YES; // TODO: Hold on this. Messes with server errors. + self.logError = YES; [MVMCoreDispatchUtility performSyncBlockOnMainThread:^{ self.applicationState = [UIApplication sharedApplication].applicationState; }]; - - // We don't log server errors. - if (![domain isEqualToString:ErrorDomainServer]) { - self.logError = YES; - // Native and system errors have an error screen. - if ([[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { - self.errorScreenError = YES; - self.nativeDrivenErrorScreen = YES; - } - } else { - self.logError = NO; + // Native and system errors have an error screen. + if (![domain isEqualToString:ErrorDomainServer] && [[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { + self.errorScreenError = YES; + self.nativeDrivenErrorScreen = YES; + self.silentError = NO; } } return self; @@ -58,20 +54,17 @@ self.domain = domain; self.location = location; self.date = [NSDate date]; + self.silentError = YES; // TODO: Hold on this. Messes with server errors. + self.logError = YES; [MVMCoreDispatchUtility performSyncBlockOnMainThread:^{ self.applicationState = [UIApplication sharedApplication].applicationState; }]; - // We don't log server errors. - if (![domain isEqualToString:ErrorDomainServer]) { - self.logError = YES; - - // Native and system errors have an error screen. - if ([[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { - self.errorScreenError = YES; - self.nativeDrivenErrorScreen = YES; - } - } else { - self.logError = NO; + + // Native and system errors have an error screen. + if (![domain isEqualToString:ErrorDomainServer] && [[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { + self.errorScreenError = YES; + self.nativeDrivenErrorScreen = YES; + self.silentError = NO; } } return self; @@ -91,12 +84,12 @@ NSInteger errorCode = [[errorInfo string:KeyCode] integerValue]; NSString *type = [errorInfo string:KeyType]; if (![ValueTypeSuccess isEqualToString:type]) { - NSString *title = [errorInfo string:KeyErrorHeading] ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle]; NSString *message = [errorInfo string:KeyUserMessage] ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess]; - MVMCoreErrorObject *error = [[MVMCoreErrorObject alloc] initWithTitle:title message:message messageToLog:[errorInfo string:KeyMessage] code:errorCode domain:ErrorDomainServer location:location]; + MVMCoreErrorObject *error = [[MVMCoreErrorObject alloc] initWithTitle:title message:message messageToLog:[errorInfo string:KeyMessage] ?: @"ResponseInfo type is not Success." code:errorCode domain:ErrorDomainServer location:location]; + error.silentError = NO; + error.serverResponseInfo = errorInfo; if ([ValueTypeErrorScreen isEqualToString:type]) { - // If this is a server error screen, there should be no additional alerts... It will be handled by the load handler. error.errorScreenError = YES; } From a74aa6ef2dd882b3b9b7f2a5daebc682e8bd8788 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 27 Feb 2023 14:17:01 -0500 Subject: [PATCH 02/12] Shift logging load errors until after background handling is resolved. --- .../LoadHandling/MVMCoreLoadRequestOperation.m | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index 848d283..e48c6dc 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -439,6 +439,8 @@ NSString *messageStyle = [loadObject.responseInfoMap string:KeyMessageStyle]; if (messageStyle && (!loadObject.operation.backgroundLoad || loadObject.requestParameters.allowAlertsIfBackgroundRequest)) { loadObject.operation.alertToShow = YES; + } else { + error.silentError = YES; } } @@ -750,17 +752,19 @@ return; } - // Logs the error. - if (error.logError) { - [MVMCoreLoggingHandler addErrorToLog:error]; - } - MVMCoreLog(@"Error: %@ %@ %@ %@ %@",[error stringErrorCode], error.domain, error.location,error.messageToDisplay, error.messageToLog); if (showAlertForErrorIfApplicable && (!loadObject.operation.backgroundLoad || loadObject.requestParameters.allowAlertsIfBackgroundRequest) && !loadObject.requestParameters.handleErrorsSilently && !error.silentError && !error.errorScreenError) { // Show alert for error. [MVMCoreLoadRequestOperation createAndShowAlertForLoadObject:loadObject error:error delegateObject:loadObject.operation.delegateObject]; + } else { + error.silentError = YES; + } + + // Logs the error. + if (error.logError) { + [MVMCoreLoggingHandler addErrorToLog:error]; } } From 52883a534b97198914169dc8f50e155669c33ba8 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Tue, 28 Feb 2023 22:08:40 -0500 Subject: [PATCH 03/12] Create MFPerformanceErrorObject for error logging. --- MVMCore/MVMCore/Constants/MVMCoreErrorConstants.h | 3 ++- MVMCore/MVMCore/Utility/MVMCoreErrorObject.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.h b/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.h index de916ed..ef1115d 100644 --- a/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.h +++ b/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.h @@ -40,5 +40,6 @@ typedef NS_ENUM(NSInteger, ErrorCode) { ErrorCodeSSL,//23 ErrorCodeNoViewControllerToPresentOn,//24 ErrorCodeNoErrorPageSent, //25 - ErrorCodeFontNotFound //26 + ErrorCodeFontNotFound, //26 + ErrorCodePoorPerformance //27 }; diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h index b91326e..465dc44 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.h @@ -26,7 +26,7 @@ @property (nullable, strong, nonatomic) NSString *requestId; @property (nullable, strong, nonatomic) NSString *requestUrl; @property (nonatomic, assign) NSInteger httpStatusCode; -@property (nonatomic, strong) NSDictionary *serverResponseInfo; +@property (nullable, strong, nonatomic) NSDictionary *serverResponseInfo; // For the crash log. @property (nullable, strong, nonatomic) NSDictionary *crashLog; From 56857f187b385ce4dbb566de8123cf2328a75b6b Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Thu, 2 Mar 2023 20:26:48 -0500 Subject: [PATCH 04/12] Silence most errors. Push getNativeScreenForRequestError to LoadHandler decoration. Native error screen error message handling. --- .../MVMCore/LoadHandling/MVMCoreLoadHandler.m | 8 ++++++- .../MVMCoreLoadRequestOperation.m | 14 +++++++---- MVMCore/MVMCore/Utility/MVMCoreErrorObject.m | 24 +++---------------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m index e5eb99d..8058ca5 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m @@ -104,7 +104,13 @@ } - (nonnull MVMCoreErrorObject *)attachLoadInformation:(MVMCoreLoadObject *)loadObject toError:(MVMCoreErrorObject *)error { - return error; // For now, just exposed for overriding. + // Native and system errors have an error screen. + if (![error.domain isEqualToString:ErrorDomainServer] && [[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { + error.errorScreenError = YES; + error.nativeDrivenErrorScreen = YES; + error.silentError = NO; + } + return error; } - (nonnull NSString *)errorLocationForRequest:(nonnull MVMCoreLoadObject *)loadObject { diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index e48c6dc..680ce37 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -297,6 +297,7 @@ } else { // Error with the request/response + [[MVMCoreLoadHandler sharedGlobal] attachLoadInformation:loadObject toError:error]; [MVMCoreLoadRequestOperation loadAbortedWithError:error loadObject:loadObject]; } }]; @@ -521,8 +522,12 @@ // Display or finish if (error.errorScreenError || !loadObject.requestParameters.dontDisplayViewController) { + error.silentError = NO; + [MVMCoreLoggingHandler addErrorToLog:error]; [MVMCoreLoadRequestOperation displayViewController:viewController loadObject:loadObject error:error]; } else { + error.silentError = YES; + [MVMCoreLoggingHandler addErrorToLog:error]; [MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:viewController errorObject:error]; } } else if (!loadObject.requestParameters.shouldNotGoToServerOnCacheFail && (loadObject.pageDataFromCache || loadObject.moduleDataFromCache)) { @@ -534,7 +539,8 @@ loadObject.operation.errorForAlertToShow = nil; [loadObject.operation main]; } else { - + error.silentError = YES; + [MVMCoreLoggingHandler addErrorToLog:error]; // Otherwise the request is finished. [MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:nil errorObject:error]; } @@ -759,11 +765,11 @@ // Show alert for error. [MVMCoreLoadRequestOperation createAndShowAlertForLoadObject:loadObject error:error delegateObject:loadObject.operation.delegateObject]; } else { - error.silentError = YES; + error.silentError = !error.errorScreenError && !error.nativeDrivenErrorScreen; } - // Logs the error. - if (error.logError) { + // Logs the error. If its a native driven error screen postpone until the native screen is define with its messaging. + if (error.logError && !error.nativeDrivenErrorScreen) { [MVMCoreLoggingHandler addErrorToLog:error]; } } diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m index 40432d0..2199023 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m @@ -28,18 +28,11 @@ self.domain = domain; self.location = location; self.date = [NSDate date]; - self.silentError = YES; // TODO: Hold on this. Messes with server errors. + self.silentError = YES; self.logError = YES; [MVMCoreDispatchUtility performSyncBlockOnMainThread:^{ self.applicationState = [UIApplication sharedApplication].applicationState; }]; - - // Native and system errors have an error screen. - if (![domain isEqualToString:ErrorDomainServer] && [[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { - self.errorScreenError = YES; - self.nativeDrivenErrorScreen = YES; - self.silentError = NO; - } } return self; } @@ -54,18 +47,11 @@ self.domain = domain; self.location = location; self.date = [NSDate date]; - self.silentError = YES; // TODO: Hold on this. Messes with server errors. + self.silentError = YES; self.logError = YES; [MVMCoreDispatchUtility performSyncBlockOnMainThread:^{ self.applicationState = [UIApplication sharedApplication].applicationState; }]; - - // Native and system errors have an error screen. - if (![domain isEqualToString:ErrorDomainServer] && [[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { - self.errorScreenError = YES; - self.nativeDrivenErrorScreen = YES; - self.silentError = NO; - } } return self; } @@ -104,13 +90,9 @@ if (errorObject) { return errorObject; } - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[error localizedDescription] messageToLog:[error description] code:[error code] domain:ErrorDomainSystem location:location]; + errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[error localizedDescription] messageToLog:[error localizedFailureReason] ?: [error localizedDescription] code:[error code] domain:ErrorDomainSystem location:location]; if ([error.domain isEqualToString:NSURLErrorDomain]) { errorObject.systemDomain = error.domain; - if ([[MVMCoreObject sharedInstance].globalLoadDelegate respondsToSelector:@selector(getNativeScreenForRequestError:requestObject:)]) { - errorObject.errorScreenError = YES; - errorObject.nativeDrivenErrorScreen = YES; - } } return errorObject; } From 3b85ca1ff8aa57449852c7016290106bd79e080c Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Fri, 3 Mar 2023 19:24:33 -0500 Subject: [PATCH 05/12] Track web view navigation failures (timeouts, etc). --- MVMCore/MVMCore/Utility/MVMCoreErrorObject.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m index 2199023..a480f9c 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m @@ -91,9 +91,10 @@ return errorObject; } errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[error localizedDescription] messageToLog:[error localizedFailureReason] ?: [error localizedDescription] code:[error code] domain:ErrorDomainSystem location:location]; - if ([error.domain isEqualToString:NSURLErrorDomain]) { + if ([error.domain isEqualToString:NSURLErrorDomain] || [error.domain isEqualToString:@"WebKitErrorDomain"]) { errorObject.systemDomain = error.domain; } + errorObject.requestUrl = error.userInfo[NSURLErrorFailingURLStringErrorKey]; return errorObject; } From 7a38ecf62b743018b6225f62de87bb8a53d49d78 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 6 Mar 2023 15:58:33 -0500 Subject: [PATCH 06/12] Crash fix for missing UserMessage. Suppress alertToShow dialogs when a native error screen is present. Pipe template parsing description messages to error object. Provide a messageToLog for invalid openURL calls. --- MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h | 1 + MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m | 5 +++++ .../MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m | 3 ++- MVMCore/MVMCore/Utility/MVMCoreErrorObject.m | 8 +++++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h index 93e7404..775bd55 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.h @@ -35,6 +35,7 @@ // Returns an error given a load object and error details. Attaches session data related to the load. Important for proper logging. - (nonnull MVMCoreErrorObject *)errorForLoadObject:(nonnull MVMCoreLoadObject *)loadObject withTitle:(nullable NSString *)title message:(nullable NSString *)message code:(NSInteger)code domain:(nonnull NSString *)domain; +- (nonnull MVMCoreErrorObject *)errorForLoadObject:(nonnull MVMCoreLoadObject *)loadObject withTitle:(nullable NSString *)title message:(nullable NSString *)message messageToLog:(nullable NSString *)messageToLog code:(NSInteger)code domain:(nonnull NSString *)domain; // Returns an error given a load object and NSError. Attaches session data related to the load. Important for proper logging. - (nonnull MVMCoreErrorObject *)errorForLoadObject:(nonnull MVMCoreLoadObject *)loadObject causedBy:(nonnull NSError *)error; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m index 8058ca5..a5f65c1 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m @@ -99,6 +99,10 @@ return [self attachLoadInformation:loadObject toError:[[MVMCoreErrorObject alloc] initWithTitle:title messageToLog:message code:code domain:domain location:[self errorLocationForRequest:loadObject]]]; } +- (nonnull MVMCoreErrorObject *)errorForLoadObject:(MVMCoreLoadObject *)loadObject withTitle:(NSString *)title message:(NSString *)message messageToLog:(NSString *)messageToLog code:(NSInteger)code domain:(NSString *)domain { + return [self attachLoadInformation:loadObject toError:[[MVMCoreErrorObject alloc] initWithTitle:title message:message messageToLog:messageToLog code:code domain:domain location:[self errorLocationForRequest:loadObject]]]; +} + - (nonnull MVMCoreErrorObject *)errorForLoadObject:(MVMCoreLoadObject *)loadObject causedBy:(NSError *)error { return [self attachLoadInformation:loadObject toError:[MVMCoreErrorObject createErrorObjectForNSError:error location:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject]]]; } @@ -109,6 +113,7 @@ error.errorScreenError = YES; error.nativeDrivenErrorScreen = YES; error.silentError = NO; + error.messageToDisplay = error.messageToDisplay ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess]; } return error; } diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index 680ce37..fb6bb64 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -523,10 +523,11 @@ // Display or finish if (error.errorScreenError || !loadObject.requestParameters.dontDisplayViewController) { error.silentError = NO; + loadObject.operation.alertToShow = NO; + loadObject.operation.errorForAlertToShow = nil; [MVMCoreLoggingHandler addErrorToLog:error]; [MVMCoreLoadRequestOperation displayViewController:viewController loadObject:loadObject error:error]; } else { - error.silentError = YES; [MVMCoreLoggingHandler addErrorToLog:error]; [MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:viewController errorObject:error]; } diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m index a480f9c..f6c53bb 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m @@ -90,7 +90,13 @@ if (errorObject) { return errorObject; } - errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[error localizedDescription] messageToLog:[error localizedFailureReason] ?: [error localizedDescription] code:[error code] domain:ErrorDomainSystem location:location]; + errorObject = [[MVMCoreErrorObject alloc] + initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] + message:[error localizedDescription] ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] + messageToLog:[error localizedFailureReason] ?: [error localizedDescription] ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] + code:[error code] + domain:ErrorDomainSystem + location:location]; if ([error.domain isEqualToString:NSURLErrorDomain] || [error.domain isEqualToString:@"WebKitErrorDomain"]) { errorObject.systemDomain = error.domain; } From cb401ee3f082103fb1d4a8fb7ec608da2fca3766 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 6 Mar 2023 17:43:06 -0500 Subject: [PATCH 07/12] Fix prior commit. Allow error alerts if there isn't a full screen error. --- MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index fb6bb64..5ff0ea8 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -523,8 +523,10 @@ // Display or finish if (error.errorScreenError || !loadObject.requestParameters.dontDisplayViewController) { error.silentError = NO; - loadObject.operation.alertToShow = NO; - loadObject.operation.errorForAlertToShow = nil; + if (error.errorScreenError || error.nativeDrivenErrorScreen) { // Suppress alert errors if there is a full screen error. + loadObject.operation.alertToShow = NO; + loadObject.operation.errorForAlertToShow = nil; + } [MVMCoreLoggingHandler addErrorToLog:error]; [MVMCoreLoadRequestOperation displayViewController:viewController loadObject:loadObject error:error]; } else { From 85ebbdf44cd0a44e6f8d646adba1c17fa2468023 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 13 Mar 2023 15:49:12 -0400 Subject: [PATCH 08/12] code review catches --- MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m b/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m index e9028ff..20be6b4 100644 --- a/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m +++ b/MVMCore/MVMCore/Constants/MVMCoreErrorConstants.m @@ -10,9 +10,9 @@ // Error Domains -/// Communication breakddowns. +/// Communication breakdowns. NSString * const ErrorDomainSystem = @"ErrorDomainSystem"; -/// Any sort of native error not due to server directivees. +/// Any sort of native error not due to server directives. NSString * const ErrorDomainNative = @"ErrorDomainNative"; /// Specific errors defined by the server. NSString * const ErrorDomainServer = @"ErrorDomainServer"; From 4799c3fcbba9a79d1e468f7172fa6d0de651ab2e Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 13 Mar 2023 16:13:44 -0400 Subject: [PATCH 09/12] Add image loading failures to error log. --- MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m index c402552..4c121bf 100644 --- a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m +++ b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m @@ -592,6 +592,10 @@ static NSString * const STATIC_CACHE_COMPONENT = @"StaticCache.txt"; //system stores cache based datatask and check cache based on response, //need to manually store cache for response [sharedCache storeCachedResponse:cachedReponse forRequest:request]; + } else if (error) { + [MVMCoreLoggingHandler addErrorToLog:[MVMCoreErrorObject createErrorObjectForNSError:error location:@"MVMCoreCache->downloadImage"]]; + } else { + [MVMCoreLoggingHandler addErrorToLog:[[MVMCoreErrorObject alloc] initWithTitle:nil messageToLog:[NSString stringWithFormat:@"Failed to download image %@", request.URL.absoluteString] code:0 domain:ErrorDomainSystem location:@"MVMCoreCache->downloadImage"]]; } if (isGif) { [self checkImage:nil imageData:data fallbackImage:fallbackImageName completionHandler:completionHandler]; From ab0c13efaf6fd4c63028ae2d67a0a4eb0fcdf726 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 13 Mar 2023 19:45:58 -0400 Subject: [PATCH 10/12] Prevent double logging and double error popup. --- MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.swift b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.swift index 0e751a7..5975af9 100644 --- a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.swift +++ b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.swift @@ -132,6 +132,7 @@ public protocol MVMCoreJSONActionHandlerProtocol: MVMCoreActionHandlerProtocol { @objc open func defaultHandleActionError(_ error: MVMCoreErrorObject, additionalData: [AnyHashable: Any]?) { guard error.logError else { return } MVMCoreLoggingHandler.addError(toLog: error) + error.logError = false // Further attempts to log the same error will be skipped. (Legacy action flow.) } // MARK: - Legacy Holdovers From a07807e6937bf91c3fa267f5c924c4dc2439ff30 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Wed, 15 Mar 2023 09:04:58 -0400 Subject: [PATCH 11/12] code review --- .../LoadHandling/MVMCoreLoadRequestOperation.m | 12 +++++------- MVMCore/MVMCore/Utility/MVMCoreErrorObject.m | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index 5ff0ea8..72659e2 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -440,8 +440,6 @@ NSString *messageStyle = [loadObject.responseInfoMap string:KeyMessageStyle]; if (messageStyle && (!loadObject.operation.backgroundLoad || loadObject.requestParameters.allowAlertsIfBackgroundRequest)) { loadObject.operation.alertToShow = YES; - } else { - error.silentError = YES; } } @@ -521,13 +519,13 @@ if (viewController) { // Display or finish - if (error.errorScreenError || !loadObject.requestParameters.dontDisplayViewController) { + if (error.errorScreenError) { error.silentError = NO; - if (error.errorScreenError || error.nativeDrivenErrorScreen) { // Suppress alert errors if there is a full screen error. - loadObject.operation.alertToShow = NO; - loadObject.operation.errorForAlertToShow = nil; + if (error.nativeDrivenErrorScreen) { + [MVMCoreLoggingHandler addErrorToLog:error]; } - [MVMCoreLoggingHandler addErrorToLog:error]; + [MVMCoreLoadRequestOperation displayViewController:viewController loadObject:loadObject error:error]; + } else if (!loadObject.requestParameters.dontDisplayViewController) { [MVMCoreLoadRequestOperation displayViewController:viewController loadObject:loadObject error:error]; } else { [MVMCoreLoggingHandler addErrorToLog:error]; diff --git a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m index f6c53bb..9b316dd 100644 --- a/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m +++ b/MVMCore/MVMCore/Utility/MVMCoreErrorObject.m @@ -93,7 +93,7 @@ errorObject = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[error localizedDescription] ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] - messageToLog:[error localizedFailureReason] ?: [error localizedDescription] ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] + messageToLog:[error description] code:[error code] domain:ErrorDomainSystem location:location]; From 8ab96097249ce8906cc5129f6d44f867057956f1 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Wed, 15 Mar 2023 13:28:29 -0400 Subject: [PATCH 12/12] code review. remove silentError hard set. --- MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m | 1 - 1 file changed, 1 deletion(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index 72659e2..ee714c3 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -540,7 +540,6 @@ loadObject.operation.errorForAlertToShow = nil; [loadObject.operation main]; } else { - error.silentError = YES; [MVMCoreLoggingHandler addErrorToLog:error]; // Otherwise the request is finished. [MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:nil errorObject:error];