Skip to content

Commit 8c2ff58

Browse files
authored
Make Debug builds use same time interval settings as Release (#2805)
The Sparkle Test App will opt into a private setting that changes some of the default and minimum values for Debug builds. This also removes the "WARNING: This is running a Debug build of Sparkle 2; don't use this in production!" log in Debug builds, and removes some unused constants internal to Sparkle.
1 parent 8ed643c commit 8c2ff58

File tree

13 files changed

+160
-64
lines changed

13 files changed

+160
-64
lines changed

Sparkle.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
723C8A561E2D60DB00C14942 /* SUTouchBarButtonGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 723C8A531E2D60DB00C14942 /* SUTouchBarButtonGroup.m */; };
200200
723EDC3F26885A8E000BCBA4 /* testappcast_channels.xml in Resources */ = {isa = PBXBuildFile; fileRef = 723EDC3E26885A8E000BCBA4 /* testappcast_channels.xml */; };
201201
7240852E2CA11C1400ED2FCD /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7240852D2CA11C1400ED2FCD /* libz.tbd */; };
202+
7245495C2ECA648000ABA991 /* SPUUpdaterSettings+Debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 7245495B2ECA648000ABA991 /* SPUUpdaterSettings+Debug.h */; };
202203
72464F701E1F31E000FB341C /* SUOperatingSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = 726F2CE41BC9C33D001971A4 /* SUOperatingSystem.m */; };
203204
72464F7C1E2097F600FB341C /* SUOperatingSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = 726F2CE41BC9C33D001971A4 /* SUOperatingSystem.m */; };
204205
72464F7E1E21ED8C00FB341C /* SUHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EF67550E25B58D00F754E0 /* SUHost.m */; };
@@ -1139,6 +1140,7 @@
11391140
723DFF962B3DFF6E00628E6C /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
11401141
723EDC3E26885A8E000BCBA4 /* testappcast_channels.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = testappcast_channels.xml; sourceTree = "<group>"; };
11411142
7240852D2CA11C1400ED2FCD /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
1143+
7245495B2ECA648000ABA991 /* SPUUpdaterSettings+Debug.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SPUUpdaterSettings+Debug.h"; sourceTree = "<group>"; };
11421144
7246E0A11C83B685003B4E75 /* SPUStandardUpdaterController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPUStandardUpdaterController.h; sourceTree = "<group>"; };
11431145
7246E0A21C83B685003B4E75 /* SPUStandardUpdaterController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPUStandardUpdaterController.m; sourceTree = "<group>"; };
11441146
724BB36C1D31D0B7005D534A /* InstallerConnection.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; includeInIndex = 0; path = InstallerConnection.xpc; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -2098,6 +2100,7 @@
20982100
72F9EC471D5EA7D3004AC8B6 /* SPUUpdaterDelegate.h */,
20992101
72EE181826DAE6E100C58B19 /* SPUUpdateCheck.h */,
21002102
726E078B1CA891E9001A286B /* SPUUpdaterSettings.h */,
2103+
7245495B2ECA648000ABA991 /* SPUUpdaterSettings+Debug.h */,
21012104
726E078C1CA891E9001A286B /* SPUUpdaterSettings.m */,
21022105
72F9EC3D1D5E823F004AC8B6 /* SPUUpdaterTimer.h */,
21032106
72F9EC3E1D5E823F004AC8B6 /* SPUUpdaterTimer.m */,
@@ -2482,6 +2485,7 @@
24822485
7229E1BD1C98EFF200CB50D0 /* SPUDownloadDriver.h in Headers */,
24832486
7267E5FD1D3DD1B700D1BF90 /* SPUResumableUpdate.h in Headers */,
24842487
7267E5B61D3D8AEE00D1BF90 /* SPUInstallationInfo.h in Headers */,
2488+
7245495C2ECA648000ABA991 /* SPUUpdaterSettings+Debug.h in Headers */,
24852489
72EE181926DAE70900C58B19 /* SPUUpdateCheck.h in Headers */,
24862490
72B767CE1C9B924900A07552 /* SPUInstallerDriver.h in Headers */,
24872491
723ABF30259D062F00BDB4FA /* SULegacyWebView.h in Headers */,

Sparkle/SPUStandardUserDriver.m

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
#import "SPUStandardVersionDisplay.h"
2626
#import "SULog.h"
2727
#import "SPUNoUpdateFoundInfo.h"
28+
#import "SPUUpdaterSettings.h"
29+
#import "SPUUpdaterSettings+Debug.h"
30+
2831
#include <time.h>
2932
#include <mach/mach_time.h>
3033
#import <IOKit/pwr_mgt/IOPMLib.h>
@@ -38,9 +41,6 @@ - (void)activate;
3841
@end
3942
#endif
4043

41-
// The amount of time the app is allowed to be idle for us to consider showing an update prompt right away when the app is active
42-
static const NSTimeInterval SUScheduledUpdateIdleEventLeewayInterval = DEBUG ? 30.0 : 5 * 60.0;
43-
4444
@interface SPUStandardUserDriver () <SPUGentleUserDriverReminders>
4545

4646
// Note: we expose a private interface for activeUpdateAlert property in SPUStandardUserDriver+Private.h as NSWindowController
@@ -65,6 +65,7 @@ @implementation SPUStandardUserDriver
6565
SUStatusController *_checkingController;
6666

6767
SUUpdateAlert *_activeUpdateAlert;
68+
SPUUpdaterSettings *_updaterSettings;
6869

6970
SUStatusController *_statusController;
7071
SUUpdatePermissionPrompt *_permissionPrompt;
@@ -92,6 +93,7 @@ - (instancetype)initWithHostBundle:(NSBundle *)hostBundle delegate:(nullable id<
9293
self = [super init];
9394
if (self != nil) {
9495
_host = [[SUHost alloc] initWithBundle:hostBundle];
96+
_updaterSettings = [[SPUUpdaterSettings alloc] initWithHostBundle:hostBundle];
9597
_oldHostName = _host.name;
9698
_oldHostBundleURL = hostBundle.bundleURL;
9799
_delegate = delegate;
@@ -218,7 +220,9 @@ - (void)setUpActiveUpdateAlertForScheduledUpdate:(SUAppcastItem * _Nullable)upda
218220
if (!appNearUpdaterInitialization && !backgroundApp) {
219221
timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType);
220222

221-
if (timeSinceLastEvent >= SUScheduledUpdateIdleEventLeewayInterval) {
223+
NSTimeInterval scheduledUpdateIdleEventLeewayInterval = _updaterSettings.standardUIScheduledUpdateIdleEventLeewayInterval;
224+
225+
if (timeSinceLastEvent >= scheduledUpdateIdleEventLeewayInterval) {
222226
// Make sure there's no active power management assertions preventing
223227
// the display from sleeping by the current application.
224228
// If there is, then the app may still actively be in use
@@ -367,7 +371,7 @@ - (void)showUpdateFoundWithAppcastItem:(SUAppcastItem *)appcastItem state:(SPUUs
367371

368372
__weak __typeof__(self) weakSelf = self;
369373
__weak id<SPUStandardUserDriverDelegate> weakDelegate = delegate;
370-
_activeUpdateAlert = [[SUUpdateAlert alloc] initWithAppcastItem:appcastItem state:state host:_host versionDisplayer:versionDisplayer completionBlock:^(SPUUserUpdateChoice choice, NSRect windowFrame, BOOL wasKeyWindow) {
374+
_activeUpdateAlert = [[SUUpdateAlert alloc] initWithAppcastItem:appcastItem state:state host:_host versionDisplayer:versionDisplayer updaterSettings:_updaterSettings completionBlock:^(SPUUserUpdateChoice choice, NSRect windowFrame, BOOL wasKeyWindow) {
371375
reply(choice);
372376

373377
__typeof__(self) strongSelf = weakSelf;

Sparkle/SPUUpdater.m

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#import "SPUUpdater.h"
1010
#import "SPUUpdaterDelegate.h"
1111
#import "SPUUpdaterSettings.h"
12+
#import "SPUUpdaterSettings+Debug.h"
1213
#import "SUHost.h"
1314
#import "SPUUpdatePermissionRequest.h"
1415
#import "SUUpdatePermissionResponse.h"
@@ -85,18 +86,6 @@ @implementation SPUUpdater
8586
@synthesize sessionInProgress = _sessionInProgress;
8687
@synthesize canCheckForUpdates = _canCheckForUpdates;
8788

88-
#if DEBUG
89-
+ (void)initialize
90-
{
91-
static dispatch_once_t onceToken;
92-
dispatch_once(&onceToken, ^{
93-
// We're using NSLog instead of SULog here because we don't want to start Sparkle's logger here,
94-
// and because this is not really an error, just a warning notice
95-
NSLog(@"WARNING: This is running a Debug build of Sparkle 2; don't use this in production!");
96-
});
97-
}
98-
#endif
99-
10089
- (instancetype)initWithHostBundle:(NSBundle *)hostBundle applicationBundle:(NSBundle *)applicationBundle userDriver:(id <SPUUserDriver>)userDriver delegate:(id<SPUUpdaterDelegate> _Nullable)delegate
10190
{
10291
self = [super init];
@@ -561,9 +550,11 @@ - (void)scheduleNextUpdateCheckFiringImmediately:(BOOL)firingImmediately usingCu
561550
intervalSinceCheck = 0;
562551
}
563552

553+
NSTimeInterval minimumUpdateCheckInterval = self->_updaterSettings.minimumUpdateCheckInterval;
554+
564555
// Now we want to figure out how long until we check again.
565-
if (updateCheckInterval < SUMinimumUpdateCheckInterval)
566-
updateCheckInterval = SUMinimumUpdateCheckInterval;
556+
if (updateCheckInterval < minimumUpdateCheckInterval)
557+
updateCheckInterval = minimumUpdateCheckInterval;
567558
if (intervalSinceCheck < updateCheckInterval) {
568559
NSTimeInterval delayUntilCheck = (updateCheckInterval - intervalSinceCheck); // It hasn't been long enough.
569560
if ([delegate respondsToSelector:@selector(updater:willScheduleUpdateCheckAfterDelay:)]) {
@@ -574,7 +565,9 @@ - (void)scheduleNextUpdateCheckFiringImmediately:(BOOL)firingImmediately usingCu
574565
[(id<SPUGentleUserDriverReminders>)self->_userDriver logGentleScheduledUpdateReminderWarningIfNeeded];
575566
}
576567

577-
[self->_updaterTimer startAndFireAfterDelay:delayUntilCheck];
568+
uint64_t leewayUpdateCheckInterval = self->_updaterSettings.leewayUpdateCheckInterval;
569+
570+
[self->_updaterTimer startAndFireAfterDelay:delayUntilCheck leewayUpdateCheckInterval:leewayUpdateCheckInterval];
578571
} else {
579572
// We're overdue! Run one now.
580573
[self _checkForUpdatesInBackground];

Sparkle/SPUUpdaterSettings+Debug.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// SPUUpdaterSettings+Debug.h
3+
// Sparkle
4+
//
5+
// Created on 11/16/25.
6+
// Copyright © 2025 Sparkle Project. All rights reserved.
7+
//
8+
9+
#import "SPUUpdaterSettings.h"
10+
11+
/**
12+
* Private settings which may be debug gated for the Sparkle Test App under DEBUG
13+
*/
14+
@interface SPUUpdaterSettings (Debug)
15+
16+
/**
17+
* The minimum update check interval
18+
*/
19+
@property (nonatomic, readonly) NSTimeInterval minimumUpdateCheckInterval;
20+
21+
/**
22+
* The amount of time the system can defer our update check (for improved performance)
23+
*/
24+
@property (nonatomic, readonly) uint64_t leewayUpdateCheckInterval;
25+
26+
/**
27+
* The amount of time the app is allowed to be idle for us to consider showing an update prompt right away when the app is active.
28+
*
29+
* This is for the standard user driver.
30+
*/
31+
@property (nonatomic, readonly) NSTimeInterval standardUIScheduledUpdateIdleEventLeewayInterval;
32+
33+
@end

Sparkle/SPUUpdaterSettings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ NS_ASSUME_NONNULL_BEGIN
3030
*/
3131
SU_EXPORT @interface SPUUpdaterSettings : NSObject
3232

33+
- (instancetype)init NS_UNAVAILABLE;
34+
3335
- (instancetype)initWithHostBundle:(NSBundle *)hostBundle;
3436

3537
/**

Sparkle/SPUUpdaterSettings.m

Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//
88

99
#import "SPUUpdaterSettings.h"
10+
#import "SPUUpdaterSettings+Debug.h"
1011
#import "SUHost.h"
1112
#import "SUConstants.h"
1213

@@ -22,6 +23,10 @@
2223
@implementation SPUUpdaterSettings
2324
{
2425
SUHost *_host;
26+
27+
#if DEBUG
28+
BOOL _enableDebugUpdateCheckIntervals;
29+
#endif
2530
}
2631

2732
@synthesize automaticallyChecksForUpdates = _automaticallyChecksForUpdates;
@@ -36,6 +41,12 @@ - (instancetype)initWithHostBundle:(NSBundle *)hostBundle
3641
if (self != nil) {
3742
_host = [[SUHost alloc] initWithBundle:hostBundle];
3843

44+
#if DEBUG
45+
// This one must be checked first, before checking the other settings,
46+
// since the others may rely on this
47+
_enableDebugUpdateCheckIntervals = [self currentEnableDebugUpdateCheckIntervals];
48+
#endif
49+
3950
_automaticallyChecksForUpdates = [self currentAutomaticallyChecksForUpdates];
4051
_updateCheckInterval = [self currentUpdateCheckInterval];
4152
_impatientUpdateCheckInterval = [self currentImpatientUpdateCheckInterval];
@@ -152,6 +163,12 @@ - (void)synchronize:(NSNotification *)notification
152163
return;
153164
}
154165

166+
#if DEBUG
167+
// This one must be checked first, before checking the other settings,
168+
// since the others may rely on this
169+
_enableDebugUpdateCheckIntervals = [self currentEnableDebugUpdateCheckIntervals];
170+
#endif
171+
155172
[self processCurrentAutomaticallyChecksForUpdates];
156173
[self processUpdateCheckInterval];
157174
[self processImpatientUpdateCheckInterval];
@@ -180,7 +197,7 @@ - (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyCheckForUpdates
180197
// Hack to support backwards compatibility with older Sparkle versions, which supported
181198
// disabling updates by setting the check interval to 0.
182199
if (automaticallyCheckForUpdates && (NSInteger)[self currentUpdateCheckInterval] == 0) {
183-
[self setUpdateCheckInterval:SUDefaultUpdateCheckInterval];
200+
[self setUpdateCheckInterval:[self defaultUpdateCheckInterval]];
184201
} else {
185202
[NSNotificationCenter.defaultCenter postNotificationName:SUUpdateAutomaticCheckSettingChangedNotification object:nil userInfo:@{SUUpdateBundlePathUserInfoKey: _host.bundlePath}];
186203
}
@@ -196,7 +213,7 @@ - (NSTimeInterval)currentUpdateCheckInterval SPU_OBJC_DIRECT
196213
// Find the stored check interval. User defaults override Info.plist.
197214
NSNumber *intervalValue = [_host doubleNumberForKey:SUScheduledCheckIntervalKey];
198215
if (intervalValue == nil) {
199-
return SUDefaultUpdateCheckInterval;
216+
return [self defaultUpdateCheckInterval];
200217
}
201218

202219
return intervalValue.doubleValue;
@@ -222,7 +239,7 @@ - (NSTimeInterval)currentImpatientUpdateCheckInterval SPU_OBJC_DIRECT
222239
{
223240
NSNumber *intervalValue = [_host doubleNumberForInfoDictionaryKey:SUScheduledImpatientCheckIntervalKey];
224241
if (intervalValue == nil) {
225-
return SUDefaultImpatientUpdateCheckInterval;
242+
return [self defaultImpatientUpdateCheckInterval];
226243
}
227244

228245
return intervalValue.doubleValue;
@@ -295,4 +312,79 @@ + (BOOL)automaticallyNotifiesObserversOfSendsSystemProfile
295312
return NO;
296313
}
297314

315+
#if DEBUG
316+
// This is only used in DEBUG and is meant for the Sparkle Test App
317+
- (BOOL)currentEnableDebugUpdateCheckIntervals
318+
{
319+
return [_host boolForInfoDictionaryKey:@"_SUEnableDebugUpdateCheckIntervals"];
320+
}
321+
#endif
322+
323+
- (NSTimeInterval)minimumUpdateCheckInterval
324+
{
325+
#if DEBUG
326+
if (_enableDebugUpdateCheckIntervals) {
327+
// 1 minute
328+
return 60;
329+
}
330+
#endif
331+
332+
// 1 hour
333+
return (60 * 60);
334+
}
335+
336+
- (uint64_t)leewayUpdateCheckInterval
337+
{
338+
#if DEBUG
339+
if (_enableDebugUpdateCheckIntervals) {
340+
// 1 second
341+
return 1;
342+
}
343+
#endif
344+
345+
// 15 seconds
346+
return 15;
347+
}
348+
349+
- (NSTimeInterval)defaultUpdateCheckInterval SPU_OBJC_DIRECT
350+
{
351+
#if DEBUG
352+
if (_enableDebugUpdateCheckIntervals) {
353+
// 1 minute
354+
return 60;
355+
}
356+
#endif
357+
358+
// 1 day
359+
return (60 * 60 * 24);
360+
}
361+
362+
// If the update has already been automatically downloaded, we normally don't want to bug the user about the update
363+
// However if the user has gone a very long time without quitting an application, we will notify them
364+
- (NSTimeInterval)defaultImpatientUpdateCheckInterval SPU_OBJC_DIRECT
365+
{
366+
#if DEBUG
367+
if (_enableDebugUpdateCheckIntervals) {
368+
// 2 minutes
369+
return (60 * 2);
370+
}
371+
#endif
372+
373+
// 1 week
374+
return (60 * 60 * 24 * 7);
375+
}
376+
377+
- (NSTimeInterval)standardUIScheduledUpdateIdleEventLeewayInterval
378+
{
379+
#if DEBUG
380+
if (_enableDebugUpdateCheckIntervals) {
381+
// 30 seconds
382+
return 30.0;
383+
}
384+
#endif
385+
386+
// 5 minutes
387+
return (5 * 60.0);
388+
}
389+
298390
@end

Sparkle/SPUUpdaterTimer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ SPU_OBJC_DIRECT_MEMBERS @interface SPUUpdaterTimer : NSObject
2222

2323
- (instancetype)initWithDelegate:(id<SPUUpdaterTimerDelegate>)delegate;
2424

25-
- (void)startAndFireAfterDelay:(NSTimeInterval)delay;
25+
- (void)startAndFireAfterDelay:(NSTimeInterval)delay leewayUpdateCheckInterval:(uint64_t)leewayUpdateCheckInterval;
2626

2727
- (void)invalidate;
2828

Sparkle/SPUUpdaterTimer.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ - (instancetype)initWithDelegate:(id<SPUUpdaterTimerDelegate>)delegate
2828
return self;
2929
}
3030

31-
- (void)startAndFireAfterDelay:(NSTimeInterval)delay
31+
- (void)startAndFireAfterDelay:(NSTimeInterval)delay leewayUpdateCheckInterval:(uint64_t)leewayUpdateCheckInterval
3232
{
3333
_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
3434

3535
// We use the wall time instead of cpu time for our dispatch timer
3636
// So eg if the computer sleeps we want to include that time spent in our timer
3737
dispatch_time_t timeToFire = dispatch_walltime(NULL, (int64_t)(delay * NSEC_PER_SEC));
38-
dispatch_source_set_timer(_source, timeToFire, DISPATCH_TIME_FOREVER, SULeewayUpdateCheckInterval * NSEC_PER_SEC);
38+
dispatch_source_set_timer(_source, timeToFire, DISPATCH_TIME_FOREVER, leewayUpdateCheckInterval * NSEC_PER_SEC);
3939

4040
__weak __typeof__(self) weakSelf = self;
4141
dispatch_source_set_event_handler(_source, ^{

Sparkle/SUConstants.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,6 @@
1616
// Misc:
1717
// -----------------------------------------------------------------------------
1818

19-
extern const NSTimeInterval SUDefaultUpdatePermissionPromptInterval;
20-
extern const NSTimeInterval SUMinimumUpdateCheckInterval;
21-
extern const NSTimeInterval SUDefaultUpdateCheckInterval;
22-
extern const uint64_t SULeewayUpdateCheckInterval;
23-
extern const NSTimeInterval SUDefaultImpatientUpdateCheckInterval;
24-
2519
extern NSString *const SUBundleIdentifier;
2620

2721
extern NSString *const SUAppcastAttributeValueMacOS;
@@ -30,7 +24,6 @@ extern NSString *const SUAppcastAttributeValueMacOS;
3024
// Notifications:
3125
// -----------------------------------------------------------------------------
3226

33-
extern NSString *const SUTechnicalErrorInformationKey;
3427
extern NSString *const SUUpdateAutomaticCheckSettingChangedNotification;
3528
extern NSString *const SUUpdateSettingsNeedsSynchronizationNotification;
3629
extern NSString *const SUUpdateBundlePathUserInfoKey;
@@ -68,11 +61,6 @@ extern NSString *const SUPromptUserOnFirstLaunchKey;
6861
extern NSString *const SUDefaultsDomainKey;
6962
extern NSString *const SUEnableJavaScriptKey;
7063
extern NSString *const SUAllowedURLSchemesKey;
71-
extern NSString *const SUFixedHTMLDisplaySizeKey __attribute__((deprecated("This key is obsolete and has no effect.")));
72-
extern NSString *const SUAppendVersionNumberKey __attribute__((deprecated("This key is obsolete. See SPARKLE_APPEND_VERSION_NUMBER.")));
73-
extern NSString *const SUEnableAutomatedDowngradesKey __attribute__((deprecated("This key is obsolete. See SPARKLE_AUTOMATED_DOWNGRADES.")));
74-
extern NSString *const SUNormalizeInstalledApplicationNameKey __attribute__((deprecated("This key is obsolete. SPARKLE_NORMALIZE_INSTALLED_APPLICATION_NAME.")));
75-
extern NSString *const SURelaunchToolNameKey __attribute__((deprecated("This key is obsolete. SPARKLE_RELAUNCH_TOOL_NAME.")));
7664

7765
// -----------------------------------------------------------------------------
7866
// Appcast keys::

0 commit comments

Comments
 (0)