From ebb236e47cc1232227792960b9e33788f91208ec Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Tue, 1 Mar 2022 16:07:20 -0800 Subject: [PATCH] [AltServer] Improves ALTServerErrorIncompatibleDeveloperDisk error message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uses NSError’s debug description, if available, to populate error alerts. --- AltServer/AppDelegate.swift | 17 ++++++++++++-- AltServer/Devices/ALTDeviceManager.mm | 1 + Shared/Categories/NSError+ALTServerError.m | 26 ++++++++++++++++++++++ Shared/Extensions/NSError+AltStore.swift | 6 +++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/AltServer/AppDelegate.swift b/AltServer/AppDelegate.swift index 1449b2f0..58943f99 100644 --- a/AltServer/AppDelegate.swift +++ b/AltServer/AppDelegate.swift @@ -319,7 +319,12 @@ private extension AppDelegate if let errorFailure = nsError.localizedFailure { - if let failureReason = nsError.localizedFailureReason + if let debugDescription = nsError.localizedDebugDescription + { + alert.messageText = errorFailure + messageComponents.append(debugDescription) + } + else if let failureReason = nsError.localizedFailureReason { if nsError.localizedDescription.starts(with: errorFailure) { @@ -352,7 +357,15 @@ private extension AppDelegate else { alert.messageText = localizedFailure - messageComponents.append(nsError.localizedDescription) + + if let debugDescription = nsError.localizedDebugDescription + { + messageComponents.append(debugDescription) + } + else + { + messageComponents.append(nsError.localizedDescription) + } } if let recoverySuggestion = nsError.localizedRecoverySuggestion diff --git a/AltServer/Devices/ALTDeviceManager.mm b/AltServer/Devices/ALTDeviceManager.mm index a1fdc188..ef6bedc7 100644 --- a/AltServer/Devices/ALTDeviceManager.mm +++ b/AltServer/Devices/ALTDeviceManager.mm @@ -1219,6 +1219,7 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT // Connection failed with .unknown error code, so we assume the developer disk is NOT compatible. NSMutableDictionary *userInfo = [@{ ALTOperatingSystemVersionErrorKey: NSStringFromOperatingSystemVersion(altDevice.osVersion), + NSFilePathErrorKey: diskURL.path, NSUnderlyingErrorKey: error, } mutableCopy]; diff --git a/Shared/Categories/NSError+ALTServerError.m b/Shared/Categories/NSError+ALTServerError.m index de6ec319..e22881d5 100644 --- a/Shared/Categories/NSError+ALTServerError.m +++ b/Shared/Categories/NSError+ALTServerError.m @@ -33,6 +33,10 @@ NSErrorUserInfoKey const ALTOperatingSystemVersionErrorKey = @"ALTOperatingSyste { return [error altserver_localizedRecoverySuggestion]; } + else if ([userInfoKey isEqualToString:NSDebugDescriptionErrorKey]) + { + return [error altserver_localizedDebugDescription]; + } return nil; }]; @@ -172,6 +176,28 @@ NSErrorUserInfoKey const ALTOperatingSystemVersionErrorKey = @"ALTOperatingSyste } } +- (nullable NSString *)altserver_localizedDebugDescription +{ + switch ((ALTServerError)self.code) + { + case ALTServerErrorIncompatibleDeveloperDisk: + { + NSString *path = self.userInfo[NSFilePathErrorKey]; + if (path == nil) + { + return nil; + } + + NSString *osVersion = [self altserver_osVersion] ?: NSLocalizedString(@"this device's OS version", @""); + NSString *debugDescription = [NSString stringWithFormat:NSLocalizedString(@"The Developer disk located at\n\n%@\n\nis incompatible with %@.", @""), path, osVersion]; + return debugDescription; + } + + default: + return nil; + } +} + - (NSString *)profileErrorLocalizedDescriptionWithBaseDescription:(NSString *)baseDescription { NSString *localizedDescription = nil; diff --git a/Shared/Extensions/NSError+AltStore.swift b/Shared/Extensions/NSError+AltStore.swift index f3ae0eb1..77096a27 100644 --- a/Shared/Extensions/NSError+AltStore.swift +++ b/Shared/Extensions/NSError+AltStore.swift @@ -16,6 +16,12 @@ extension NSError return localizedFailure } + @objc(alt_localizedDebugDescription) + var localizedDebugDescription: String? { + let debugDescription = (self.userInfo[NSDebugDescriptionErrorKey] as? String) ?? (NSError.userInfoValueProvider(forDomain: self.domain)?(self, NSDebugDescriptionErrorKey) as? String) + return debugDescription + } + @objc(alt_errorWithLocalizedFailure:) func withLocalizedFailure(_ failure: String) -> NSError {