Skip to content

Commit fc73503

Browse files
authored
Add hardware requirements element (#2797)
The first requirement we support is arm64 which allows updates to mark themselves as Apple silicon only. The message that shows up when users check for updates tells them their Mac is too old and a newer Apple silicon Mac is required for new updates. This introduces a new localizable string. This requirement is also inferred if the minimum system version is >= 27.0 generate_appcast is also updated to handle a new branch for hardwareRequirements element, and for automatically populating it if needed. Fixes #2796
1 parent 3dfee03 commit fc73503

22 files changed

+420
-64
lines changed

Sparkle.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@
180180
7230BCDE2E22E2BC00B71297 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7230BCDD2E22E2BC00B71297 /* Images.xcassets */; };
181181
72316BD31E0DA8430039EFD9 /* SUUnarchiverNotifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 72316BD21E0DA8430039EFD9 /* SUUnarchiverNotifier.m */; };
182182
72316BD41E0DB37E0039EFD9 /* SUUnarchiverNotifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 72316BD21E0DA8430039EFD9 /* SUUnarchiverNotifier.m */; };
183+
723414172EBFB482009727E0 /* testappcast_arm64HardwareRequirement.xml in Resources */ = {isa = PBXBuildFile; fileRef = 723414162EBFB482009727E0 /* testappcast_arm64HardwareRequirement.xml */; };
183184
723ABDDB259A9E8600BDB4FA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 723ABDD9259A9E8600BDB4FA /* InfoPlist.strings */; };
184185
723ABE02259A9E9E00BDB4FA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 723ABE00259A9E9E00BDB4FA /* MainMenu.xib */; };
185186
723ABF1B259D055E00BDB4FA /* SUReleaseNotesView.h in Headers */ = {isa = PBXBuildFile; fileRef = 723ABF1A259D055E00BDB4FA /* SUReleaseNotesView.h */; };
@@ -1082,6 +1083,7 @@
10821083
7230BCDD2E22E2BC00B71297 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
10831084
72316BD11E0DA8430039EFD9 /* SUUnarchiverNotifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SUUnarchiverNotifier.h; path = Autoupdate/SUUnarchiverNotifier.h; sourceTree = SOURCE_ROOT; };
10841085
72316BD21E0DA8430039EFD9 /* SUUnarchiverNotifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SUUnarchiverNotifier.m; path = Autoupdate/SUUnarchiverNotifier.m; sourceTree = SOURCE_ROOT; };
1086+
723414162EBFB482009727E0 /* testappcast_arm64HardwareRequirement.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = testappcast_arm64HardwareRequirement.xml; sourceTree = "<group>"; };
10851087
7235B75E29DFC0120081FE4E /* make-xcframework.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "make-xcframework.sh"; sourceTree = "<group>"; };
10861088
72366CCC2DC2D1FC003CE62B /* Sparkle.private.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = Sparkle.private.modulemap; sourceTree = "<group>"; };
10871089
723ABCD7259A9A9D00BDB4FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Sparkle.strings; sourceTree = "<group>"; };
@@ -1814,6 +1816,7 @@
18141816
725B3A81263FBF0C0041AB8E /* testappcast_minimumAutoupdateVersion.xml */,
18151817
720DC50327A51A6500DFF3EC /* testappcast_minimumAutoupdateVersionSkipping.xml */,
18161818
720DC50527A62CDC00DFF3EC /* testappcast_minimumAutoupdateVersionSkipping2.xml */,
1819+
723414162EBFB482009727E0 /* testappcast_arm64HardwareRequirement.xml */,
18171820
7202DC99269ABD3500737EC4 /* testappcast_phasedRollout.xml */,
18181821
722545B526805FF80036465C /* testappcast_info_updates.xml */,
18191822
5F1510A11C96E591006E1629 /* testnamespaces.xml */,
@@ -3131,6 +3134,7 @@
31313134
72CCDEBE27421FD500B53718 /* SparkleTestCodeSignApp_bad_header.zip in Resources */,
31323135
726FC0362C1E787A00177986 /* SparkleTestCodeSignApp.aar in Resources */,
31333136
722545B626805FF80036465C /* testappcast_info_updates.xml in Resources */,
3137+
723414172EBFB482009727E0 /* testappcast_arm64HardwareRequirement.xml in Resources */,
31343138
7202DC9A269ABD3500737EC4 /* testappcast_phasedRollout.xml in Resources */,
31353139
5F1510A21C96E591006E1629 /* testnamespaces.xml in Resources */,
31363140
729F7EAC27366353004592DC /* test-links.xml in Resources */,

Sparkle/Base.lproj/Sparkle.strings

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
/* No comment provided by engineer. */
1111
"%1$@ %2$@ is available but your macOS version is too old to install it. At least macOS %3$@ is required." = "%1$@ %2$@ is available but your macOS version is too old to install it. At least macOS %3$@ is required.";
1212

13+
/* Mac is too old and update requires Apple silicon Mac */
14+
"%1$@ %2$@ is available but this update requires a new Apple silicon Mac." = "%1$@ %2$@ is available but this update requires a new Apple silicon Mac.";
15+
1316
/* No comment provided by engineer. */
1417
"%1$@ can’t be updated if it’s running from the location it was downloaded to." = "%1$@ can’t be updated if it’s running from the location it was downloaded to.";
1518

@@ -193,6 +196,9 @@
193196
/* No comment provided by engineer. */
194197
"Your macOS version is too old" = "Your macOS version is too old";
195198

199+
/* Mac is too old and update requires newer hardware */
200+
"Your Mac is too old" = "Your Mac is too old";
201+
196202
/* Status message shown when the user checks for updates but is already current or the feed doesn't contain any updates. */
197203
"You’re up to date!" = "You’re up to date!";
198204

Sparkle/SPUAppcastItemState.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ SPU_OBJC_DIRECT_MEMBERS @interface SPUAppcastItemState : NSObject
1515

1616
- (instancetype)init NS_UNAVAILABLE;
1717

18-
- (instancetype)initWithMajorUpgrade:(BOOL)majorUpgrade criticalUpdate:(BOOL)criticalUpdate informationalUpdate:(BOOL)informationalUpdate minimumOperatingSystemVersionIsOK:(BOOL)minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:(BOOL)maximumOperatingSystemVersionIsOK;
18+
- (instancetype)initWithMajorUpgrade:(BOOL)majorUpgrade criticalUpdate:(BOOL)criticalUpdate informationalUpdate:(BOOL)informationalUpdate minimumOperatingSystemVersionIsOK:(BOOL)minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:(BOOL)maximumOperatingSystemVersionIsOK arm64HardwareRequirementIsOK:(BOOL)arm64HardwareRequirementIsOK;
1919

2020
@property (nonatomic, readonly) BOOL majorUpgrade;
2121
@property (nonatomic, readonly) BOOL criticalUpdate;
2222
@property (nonatomic, readonly) BOOL informationalUpdate;
2323
@property (nonatomic, readonly) BOOL minimumOperatingSystemVersionIsOK;
2424
@property (nonatomic, readonly) BOOL maximumOperatingSystemVersionIsOK;
25+
@property (nonatomic, readonly) BOOL arm64HardwareRequirementIsOK;
2526

2627
@end
2728

Sparkle/SPUAppcastItemState.m

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define SPUAppcastItemStateInformationalUpdateKey @"SPUAppcastItemStateInformationalUpdate"
1717
#define SPUAppcastItemStateMinimumOperatingSystemVersionIsOKKey @"SPUAppcastItemStateMinimumOperatingSystemVersionIsOK"
1818
#define SPUAppcastItemStateMaximumOperatingSystemVersionIsOKKey @"SPUAppcastItemStateMaximumOperatingSystemVersionIsOK"
19+
#define SPUAppcastItemStateArm64HardwareRequirementIsOKKey @"SPUAppcastItemStateArm64HardwareRequirementIsOK"
1920

2021
@interface SPUAppcastItemState () <NSSecureCoding>
2122
@end
@@ -27,8 +28,9 @@ @implementation SPUAppcastItemState
2728
@synthesize informationalUpdate = _informationalUpdate;
2829
@synthesize minimumOperatingSystemVersionIsOK = _minimumOperatingSystemVersionIsOK;
2930
@synthesize maximumOperatingSystemVersionIsOK = _maximumOperatingSystemVersionIsOK;
31+
@synthesize arm64HardwareRequirementIsOK = _arm64HardwareRequirementIsOK;
3032

31-
- (instancetype)initWithMajorUpgrade:(BOOL)majorUpgrade criticalUpdate:(BOOL)criticalUpdate informationalUpdate:(BOOL)informationalUpdate minimumOperatingSystemVersionIsOK:(BOOL)minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:(BOOL)maximumOperatingSystemVersionIsOK
33+
- (instancetype)initWithMajorUpgrade:(BOOL)majorUpgrade criticalUpdate:(BOOL)criticalUpdate informationalUpdate:(BOOL)informationalUpdate minimumOperatingSystemVersionIsOK:(BOOL)minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:(BOOL)maximumOperatingSystemVersionIsOK arm64HardwareRequirementIsOK:(BOOL)arm64HardwareRequirementIsOK
3234
{
3335
self = [super init];
3436
if (self != nil) {
@@ -37,6 +39,7 @@ - (instancetype)initWithMajorUpgrade:(BOOL)majorUpgrade criticalUpdate:(BOOL)cri
3739
_informationalUpdate = informationalUpdate;
3840
_minimumOperatingSystemVersionIsOK = minimumOperatingSystemVersionIsOK;
3941
_maximumOperatingSystemVersionIsOK = maximumOperatingSystemVersionIsOK;
42+
_arm64HardwareRequirementIsOK = arm64HardwareRequirementIsOK;
4043
}
4144
return self;
4245
}
@@ -53,6 +56,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder
5356
[encoder encodeBool:_informationalUpdate forKey:SPUAppcastItemStateInformationalUpdateKey];
5457
[encoder encodeBool:_minimumOperatingSystemVersionIsOK forKey:SPUAppcastItemStateMinimumOperatingSystemVersionIsOKKey];
5558
[encoder encodeBool:_maximumOperatingSystemVersionIsOK forKey:SPUAppcastItemStateMaximumOperatingSystemVersionIsOKKey];
59+
[encoder encodeBool:_arm64HardwareRequirementIsOK forKey:SPUAppcastItemStateArm64HardwareRequirementIsOKKey];
5660
}
5761

5862
- (instancetype)initWithCoder:(NSCoder *)decoder
@@ -62,8 +66,9 @@ - (instancetype)initWithCoder:(NSCoder *)decoder
6266
BOOL informationalUpdate = [decoder decodeBoolForKey:SPUAppcastItemStateInformationalUpdateKey];
6367
BOOL minimumOperatingSystemVersionIsOK = [decoder decodeBoolForKey:SPUAppcastItemStateMinimumOperatingSystemVersionIsOKKey];
6468
BOOL maximumOperatingSystemVersionIsOK = [decoder decodeBoolForKey:SPUAppcastItemStateMaximumOperatingSystemVersionIsOKKey];
69+
BOOL arm64HardwareRequirementIsOK = [decoder decodeBoolForKey:SPUAppcastItemStateArm64HardwareRequirementIsOKKey];
6570

66-
return [self initWithMajorUpgrade:majorUpgrade criticalUpdate:criticalUpdate informationalUpdate:informationalUpdate minimumOperatingSystemVersionIsOK:minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:maximumOperatingSystemVersionIsOK];
71+
return [self initWithMajorUpgrade:majorUpgrade criticalUpdate:criticalUpdate informationalUpdate:informationalUpdate minimumOperatingSystemVersionIsOK:minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:maximumOperatingSystemVersionIsOK arm64HardwareRequirementIsOK:arm64HardwareRequirementIsOK];
6772
}
6873

6974
@end

Sparkle/SPUAppcastItemStateResolver+Private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
1313

1414
@interface SPUAppcastItemStateResolver ()
1515

16-
- (SPUAppcastItemState *)resolveStateWithInformationalUpdateVersions:(NSSet<NSString *> * _Nullable)informationalUpdateVersions minimumOperatingSystemVersion:(NSString * _Nullable)minimumOperatingSystemVersion maximumOperatingSystemVersion:(NSString * _Nullable)maximumOperatingSystemVersion minimumAutoupdateVersion:(NSString * _Nullable)minimumAutoupdateVersion criticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary;
16+
- (SPUAppcastItemState *)resolveStateWithInformationalUpdateVersions:(NSSet<NSString *> * _Nullable)informationalUpdateVersions minimumOperatingSystemVersion:(NSString * _Nullable)minimumOperatingSystemVersion maximumOperatingSystemVersion:(NSString * _Nullable)maximumOperatingSystemVersion minimumAutoupdateVersion:(NSString * _Nullable)minimumAutoupdateVersion criticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary hardwareRequirements:(NSSet<NSString *> *)hardwareRequirements;
1717

1818
+ (BOOL)isMinimumAutoupdateVersionOK:(NSString * _Nullable)minimumAutoupdateVersion hostVersion:(NSString *)hostVersion versionComparator:(id<SUVersionComparison>)versionComparator;
1919

Sparkle/SPUAppcastItemStateResolver.m

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
#import "SUStandardVersionComparator.h"
1414
#import "SUConstants.h"
1515
#import "SUOperatingSystem.h"
16+
#import "SULog.h"
1617

18+
#import <TargetConditionals.h>
19+
#import <sys/types.h>
20+
#import <sys/sysctl.h>
1721

1822
#include "AppKitPrevention.h"
1923

@@ -35,7 +39,7 @@ - (instancetype)initWithHostVersion:(NSString *)hostVersion applicationVersionCo
3539
return self;
3640
}
3741

38-
- (BOOL)isMinimumOperatingSystemVersionOK:(NSString * _Nullable)minimumSystemVersion
42+
- (BOOL)isMinimumOperatingSystemVersionOK:(NSString * _Nullable)minimumSystemVersion SPU_OBJC_DIRECT
3943
{
4044
BOOL minimumVersionOK = YES;
4145
if (minimumSystemVersion != nil && ![minimumSystemVersion isEqualToString:@""]) {
@@ -44,7 +48,7 @@ - (BOOL)isMinimumOperatingSystemVersionOK:(NSString * _Nullable)minimumSystemVer
4448
return minimumVersionOK;
4549
}
4650

47-
- (BOOL)isMaximumOperatingSystemVersionOK:(NSString * _Nullable)maximumSystemVersion
51+
- (BOOL)isMaximumOperatingSystemVersionOK:(NSString * _Nullable)maximumSystemVersion SPU_OBJC_DIRECT
4852
{
4953
BOOL maximumVersionOK = YES;
5054
if (maximumSystemVersion != nil && ![maximumSystemVersion isEqualToString:@""]) {
@@ -58,12 +62,12 @@ + (BOOL)isMinimumAutoupdateVersionOK:(NSString * _Nullable)minimumAutoupdateVers
5862
return (minimumAutoupdateVersion.length == 0 || ([versionComparator compareVersion:hostVersion toVersion:(NSString * _Nonnull)minimumAutoupdateVersion] != NSOrderedAscending));
5963
}
6064

61-
- (BOOL)isMinimumAutoupdateVersionOK:(NSString * _Nullable)minimumAutoupdateVersion
65+
- (BOOL)isMinimumAutoupdateVersionOK:(NSString * _Nullable)minimumAutoupdateVersion SPU_OBJC_DIRECT
6266
{
6367
return [[self class] isMinimumAutoupdateVersionOK:minimumAutoupdateVersion hostVersion:_hostVersion versionComparator:_applicationVersionComparator];
6468
}
6569

66-
- (BOOL)isCriticalUpdateWithCriticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary
70+
- (BOOL)isCriticalUpdateWithCriticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary SPU_OBJC_DIRECT
6771
{
6872
// Check if any critical update info is provided
6973
if (criticalUpdateDictionary == nil) {
@@ -80,7 +84,7 @@ - (BOOL)isCriticalUpdateWithCriticalUpdateDictionary:(NSDictionary * _Nullable)c
8084
return ([_applicationVersionComparator compareVersion:_hostVersion toVersion:criticalVersion] == NSOrderedAscending);
8185
}
8286

83-
- (BOOL)isInformationalUpdateWithInformationalUpdateVersions:(NSSet<NSString *> * _Nullable)informationalUpdateVersions
87+
- (BOOL)isInformationalUpdateWithInformationalUpdateVersions:(NSSet<NSString *> * _Nullable)informationalUpdateVersions SPU_OBJC_DIRECT
8488
{
8589
if (informationalUpdateVersions == nil) {
8690
return NO;
@@ -109,7 +113,43 @@ - (BOOL)isInformationalUpdateWithInformationalUpdateVersions:(NSSet<NSString *>
109113
return NO;
110114
}
111115

112-
- (SPUAppcastItemState *)resolveStateWithInformationalUpdateVersions:(NSSet<NSString *> * _Nullable)informationalUpdateVersions minimumOperatingSystemVersion:(NSString * _Nullable)minimumOperatingSystemVersion maximumOperatingSystemVersion:(NSString * _Nullable)maximumOperatingSystemVersion minimumAutoupdateVersion:(NSString * _Nullable)minimumAutoupdateVersion criticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary
116+
- (BOOL)isArm64HardwareRequirementOK:(NSSet<NSString *> *)hardwareRequirements minimumSystemVersion:(NSString *_Nullable )minimumSystemVersion SPU_OBJC_DIRECT
117+
{
118+
#if TARGET_CPU_X86_64
119+
// macOS 27+ will no longer support Intel Macs
120+
BOOL hasARM64Requirement;
121+
if (minimumSystemVersion.length > 0 && [_standardVersionComparator compareVersion:(NSString * _Nonnull)minimumSystemVersion toVersion:@"27.0"] != NSOrderedAscending) {
122+
hasARM64Requirement = YES;
123+
} else {
124+
hasARM64Requirement = [hardwareRequirements containsObject:SUAppcastElementHardwareRequirementARM64];
125+
}
126+
127+
if (!hasARM64Requirement) {
128+
return YES;
129+
}
130+
131+
// If the process is run under Rosetta, then the hardware is compatible
132+
// https://developer.apple.com/documentation/apple-silicon/about-the-rosetta-translation-environment
133+
int translatedResult = 0;
134+
size_t translatedResultSize = sizeof(translatedResult);
135+
if (sysctlbyname("sysctl.proc_translated", &translatedResult, &translatedResultSize, NULL, 0) == -1) {
136+
if (errno == ENOENT) {
137+
// Native x86_64 process
138+
return NO;
139+
}
140+
141+
// An error occured
142+
SULog(SULogLevelError, @"Error: failed to detect if process is running under rosetta with error: %d", errno);
143+
return YES;
144+
}
145+
146+
return (translatedResult == 1);
147+
#else
148+
return YES;
149+
#endif
150+
}
151+
152+
- (SPUAppcastItemState *)resolveStateWithInformationalUpdateVersions:(NSSet<NSString *> * _Nullable)informationalUpdateVersions minimumOperatingSystemVersion:(NSString * _Nullable)minimumOperatingSystemVersion maximumOperatingSystemVersion:(NSString * _Nullable)maximumOperatingSystemVersion minimumAutoupdateVersion:(NSString * _Nullable)minimumAutoupdateVersion criticalUpdateDictionary:(NSDictionary * _Nullable)criticalUpdateDictionary hardwareRequirements:(NSSet<NSString *> *)hardwareRequirements
113153
{
114154
BOOL informationalUpdate = [self isInformationalUpdateWithInformationalUpdateVersions:informationalUpdateVersions];
115155

@@ -121,7 +161,9 @@ - (SPUAppcastItemState *)resolveStateWithInformationalUpdateVersions:(NSSet<NSSt
121161

122162
BOOL criticalUpdate = [self isCriticalUpdateWithCriticalUpdateDictionary:criticalUpdateDictionary];
123163

124-
return [[SPUAppcastItemState alloc] initWithMajorUpgrade:majorUpgrade criticalUpdate:criticalUpdate informationalUpdate:informationalUpdate minimumOperatingSystemVersionIsOK:minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:maximumOperatingSystemVersionIsOK];
164+
BOOL arm64HardwareRequirementIsOK = [self isArm64HardwareRequirementOK:hardwareRequirements minimumSystemVersion:minimumOperatingSystemVersion];
165+
166+
return [[SPUAppcastItemState alloc] initWithMajorUpgrade:majorUpgrade criticalUpdate:criticalUpdate informationalUpdate:informationalUpdate minimumOperatingSystemVersionIsOK:minimumOperatingSystemVersionIsOK maximumOperatingSystemVersionIsOK:maximumOperatingSystemVersionIsOK arm64HardwareRequirementIsOK:arm64HardwareRequirementIsOK];
125167
}
126168

127169
@end

Sparkle/SPUBasicUpdateDriver.m

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,13 @@ - (void)didNotFindUpdateWithLatestAppcastItem:(nullable SUAppcastItem *)latestAp
202202
break;
203203
case NSOrderedAscending:
204204
// A new update is available but cannot be installed
205+
// More detailed recovery suggestions are in SPUNoUpdateFoundRecoverySuggestion()
205206

206-
if (!latestAppcastItem.minimumOperatingSystemVersionIsOK) {
207+
if (!latestAppcastItem.arm64HardwareRequirementIsOK) {
208+
localizedDescription = SULocalizedStringFromTableInBundle(@"Your Mac is too old", SPARKLE_TABLE, sparkleBundle, nil);
209+
210+
reason = SPUNoUpdateFoundReasonHardwareDoesNotSupportARM64;
211+
} else if (!latestAppcastItem.minimumOperatingSystemVersionIsOK) {
207212
localizedDescription = SULocalizedStringFromTableInBundle(@"Your macOS version is too old", SPARKLE_TABLE, sparkleBundle, nil);
208213

209214
reason = SPUNoUpdateFoundReasonSystemIsTooOld;

Sparkle/SPUNoUpdateFoundInfo.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
case SPUNoUpdateFoundReasonOnNewerThanLatestVersion:
4040
case SPUNoUpdateFoundReasonSystemIsTooOld:
4141
case SPUNoUpdateFoundReasonSystemIsTooNew:
42+
case SPUNoUpdateFoundReasonHardwareDoesNotSupportARM64:
4243
assert(latestAppcastItem != nil);
4344

4445
hostDisplayVersion = host.displayVersion;
@@ -68,6 +69,9 @@
6869
case SPUNoUpdateFoundReasonSystemIsTooNew:
6970
recoverySuggestion = [NSString stringWithFormat:SULocalizedStringFromTableInBundle(@"%1$@ %2$@ is available but your macOS version is too new for this update. This update only supports up to macOS %3$@.", SPARKLE_TABLE, sparkleBundle, nil), host.name, latestAppcastItemDisplayVersion, latestAppcastItem.maximumSystemVersion];
7071
break;
72+
case SPUNoUpdateFoundReasonHardwareDoesNotSupportARM64:
73+
recoverySuggestion = [NSString stringWithFormat:SULocalizedStringFromTableInBundle(@"%1$@ %2$@ is available but this update requires a new Apple silicon Mac.", SPARKLE_TABLE, sparkleBundle, nil), host.name, latestAppcastItemDisplayVersion];
74+
break;
7175
}
7276
return recoverySuggestion;
7377
}

Sparkle/SPUStandardUserDriver.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,7 @@ - (void)showUpdateNotFoundWithError:(NSError *)error acknowledgement:(void (^)(v
695695
}
696696
case SPUNoUpdateFoundReasonSystemIsTooOld:
697697
case SPUNoUpdateFoundReasonSystemIsTooNew:
698+
case SPUNoUpdateFoundReasonHardwareDoesNotSupportARM64:
698699
if (latestAppcastItem.infoURL != nil) {
699700
// Show the user the product's link if available
700701
[alert addButtonWithTitle:SULocalizedStringFromTableInBundle(@"Learn More…", SPARKLE_TABLE, sparkleBundle, nil)];

0 commit comments

Comments
 (0)