Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
7ad5ae7
Add bedtime Live Activity
cursoragent Aug 7, 2026
7f0feb5
Complete Live Activity extension configuration
cursoragent Aug 7, 2026
f0b319c
Use system-managed Live Activity timers
cursoragent Aug 7, 2026
e3f8a23
Fix Live Activity extension archive export configuration
cursoragent Aug 7, 2026
ab8c554
schemes
gsbernstein Aug 7, 2026
510a63a
Show minute-precision countdown in Live Activity and improve legibility
cursoragent Aug 7, 2026
547be90
Use DateReference for Live Activity countdown phrasing
cursoragent Aug 7, 2026
4fd5526
Merge remote-tracking branch 'origin/master' into cursor/live-bedtime…
cursoragent Aug 11, 2026
34f1e38
Keep the compact Dynamic Island countdown narrow
cursoragent Aug 12, 2026
d991fb1
Start the bedtime activity automatically and label the compact pill
cursoragent Aug 12, 2026
d192b17
Match the optional IntentDescription requirement
cursoragent Aug 12, 2026
4427f6d
Read the lead-time constant inside the isolated method body
cursoragent Aug 12, 2026
1d9bed8
Make Constants a nonisolated enum
cursoragent Aug 12, 2026
6bf7c39
Schedule the activity to start itself at wind-down on iOS 26
cursoragent Aug 12, 2026
9a7a90e
Merge branch 'master' into cursor/live-bedtime-activity-43cf
gsbernstein Aug 12, 2026
c2f50db
Resolve the night already underway instead of tomorrow's bedtime
cursoragent Aug 12, 2026
2c1043c
Keep staleDate in the future and carry the phase in content state
cursoragent Aug 12, 2026
dc153b1
Show the Live Activity target to a single decimal
cursoragent Aug 13, 2026
ae26d37
Show progress in the minimal Dynamic Island presentation
cursoragent Aug 13, 2026
7bd3187
Use the clock-pattern countdown in the minimal presentation
cursoragent Aug 13, 2026
215d54f
Return the minimal presentation to a ring
cursoragent Aug 13, 2026
1c78cb8
Merge remote-tracking branch 'origin/master' into cursor/live-bedtime…
gsbernstein Aug 13, 2026
e780093
convert to folder
gsbernstein Aug 13, 2026
656b3e1
consolidate some settings
gsbernstein Aug 13, 2026
78bcb26
remove metal settings
gsbernstein Aug 13, 2026
73dbe57
swift version
gsbernstein Aug 13, 2026
8f22fbf
recommended settings
gsbernstein Aug 13, 2026
d401868
remove comment
gsbernstein Aug 13, 2026
14c728f
swift 6
gsbernstein Aug 13, 2026
8747cbf
fix isolation/sendable error
gsbernstein Aug 13, 2026
0b9ca8e
no op
gsbernstein Aug 13, 2026
6bd41ae
previews
gsbernstein Aug 13, 2026
a816d08
dynamic island, too
gsbernstein Aug 13, 2026
876a3d9
count up?
gsbernstein Aug 13, 2026
15b5414
title attribute no longer in use
gsbernstein Aug 13, 2026
b4bee72
remove redundant expanded island title
gsbernstein Aug 13, 2026
71dd000
consistent layout
gsbernstein Aug 13, 2026
ea6e0ad
minor
gsbernstein Aug 13, 2026
b6f29cc
custom time formatter
gsbernstein Aug 13, 2026
c2bc3dc
revert the convenience initializer, it was overkill
gsbernstein Aug 13, 2026
cb92ddd
minimal also as text?
gsbernstein Aug 13, 2026
59dc3e7
Merge branch 'master' into cursor/live-bedtime-activity-43cf
gsbernstein Aug 13, 2026
2e3ace7
flip countdown bar
gsbernstein Aug 13, 2026
b5e1e51
handle r-to-l layouts
gsbernstein Aug 13, 2026
1573fff
revert custom formatter
gsbernstein Aug 13, 2026
6e03790
all reference
gsbernstein Aug 13, 2026
5f4039d
Add small padding to minimal Dynamic Island icon
cursoragent Aug 13, 2026
396aa93
Merge branch 'master' into cursor/live-bedtime-activity-43cf
gsbernstein Aug 13, 2026
6a8c7a9
Minor style cleanup in BedtimeLiveActivity.swift
cursoragent Aug 13, 2026
820efb5
Add linear progress bar under compact trailing countdown
cursoragent Aug 13, 2026
7f3e99d
min 30 minute live progress duration
gsbernstein Aug 14, 2026
cdc2ed7
move range/target math from Phase enum to state struct
gsbernstein Aug 14, 2026
a4148c6
fixup
gsbernstein Aug 14, 2026
d196d92
use throughout
gsbernstein Aug 14, 2026
88d3317
rename and use helper
gsbernstein Aug 14, 2026
d3539d2
fixups
gsbernstein Aug 14, 2026
6ebca99
narrower
gsbernstein Aug 14, 2026
04716bb
Fix newStartTime treating lead time seconds as minutes
cursoragent Aug 14, 2026
bff1321
Keep Calendar-based newStartTime, fix units to seconds
cursoragent Aug 14, 2026
5ba5d68
Add Calendar+TimeInterval helper for DST-safe interval math
cursoragent Aug 14, 2026
3e344b5
Revert lead-time/sleep-duration math to elapsed-time subtraction
cursoragent Aug 14, 2026
ece1795
Merge branch 'master' into cursor/live-bedtime-activity-43cf
gsbernstein Aug 14, 2026
481fc66
remove separate extension scheme
gsbernstein Aug 14, 2026
389b9fb
clearer name
gsbernstein Aug 14, 2026
c2f3bae
Pre-schedule a queue of upcoming nights with staleness reminders
cursoragent Aug 15, 2026
18495b6
Merge branch 'master' into cursor/live-bedtime-activity-43cf
cursoragent Aug 15, 2026
4951401
Flip Live Activity to a done phase after wake time
cursoragent Aug 15, 2026
d47fab5
Mark BedtimeSourceAppLink nonisolated to fix Equatable conformance
cursoragent Aug 16, 2026
333393e
Fix Sendable warning ending pending activities in scheduleUpcomingNights
cursoragent Aug 16, 2026
a17822f
Flip default actor isolation from MainActor to nonisolated
cursoragent Aug 16, 2026
8304d92
Narrow compact trailing width and allow countdown text to wrap
cursoragent Aug 17, 2026
ba1ba2b
Sync Live Activity when the recommendation changes in the foreground
cursoragent Aug 17, 2026
65387a7
Fix Live Activity updates targeting the wrong queued activity
cursoragent Aug 17, 2026
2301f36
Clear all pending activities before requesting a new one
cursoragent Aug 24, 2026
12dff3b
Gate .pending cleanup loop in startOrUpdate behind iOS 26
cursoragent Aug 24, 2026
4f23bd3
Fix Sendable errors in registerBackgroundTask and startOrUpdate
cursoragent Aug 24, 2026
00c3db7
Use a proper nonisolated static helper for existingActivity lookup
cursoragent Aug 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
188 changes: 163 additions & 25 deletions Bedtime/Bedtime.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,55 @@
objectVersion = 77;
objects = {

/* Begin PBXBuildFile section */
4C4956450000000000000003 /* BedtimeLiveActivity.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 4C4956450000000000000011 /* BedtimeLiveActivity.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
4C4956450000000000000020 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 373AAED52E91B7E900D8ED84 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4C4956450000000000000030;
remoteInfo = BedtimeLiveActivity;
};
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
4C4956450000000000000040 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
4C4956450000000000000003 /* BedtimeLiveActivity.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
373AAEDD2E91B7E900D8ED84 /* Bedger.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Bedger.app; sourceTree = BUILT_PRODUCTS_DIR; };
4C4956450000000000000011 /* BedtimeLiveActivity.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = BedtimeLiveActivity.appex; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedRootGroup section */
371FB5C6302D689B005F6931 /* Shared */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = Shared;
sourceTree = "<group>";
};
373AAEDF2E91B7E900D8ED84 /* Bedtime */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = Bedtime;
sourceTree = "<group>";
};
4C4956450000000000000050 /* BedtimeLiveActivity */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = BedtimeLiveActivity;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */

/* Begin PBXFrameworksBuildPhase section */
Expand All @@ -26,13 +65,22 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4C4956450000000000000060 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
373AAED42E91B7E900D8ED84 = {
isa = PBXGroup;
children = (
373AAEDF2E91B7E900D8ED84 /* Bedtime */,
4C4956450000000000000050 /* BedtimeLiveActivity */,
371FB5C6302D689B005F6931 /* Shared */,
373AAEDE2E91B7E900D8ED84 /* Products */,
);
sourceTree = "<group>";
Expand All @@ -41,6 +89,7 @@
isa = PBXGroup;
children = (
373AAEDD2E91B7E900D8ED84 /* Bedger.app */,
4C4956450000000000000011 /* BedtimeLiveActivity.appex */,
);
name = Products;
sourceTree = "<group>";
Expand All @@ -55,12 +104,15 @@
373AAED92E91B7E900D8ED84 /* Sources */,
373AAEDA2E91B7E900D8ED84 /* Frameworks */,
373AAEDB2E91B7E900D8ED84 /* Resources */,
4C4956450000000000000040 /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
4C4956450000000000000080 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
371FB5C6302D689B005F6931 /* Shared */,
373AAEDF2E91B7E900D8ED84 /* Bedtime */,
);
name = Bedtime;
Expand All @@ -70,6 +122,29 @@
productReference = 373AAEDD2E91B7E900D8ED84 /* Bedger.app */;
productType = "com.apple.product-type.application";
};
4C4956450000000000000030 /* BedtimeLiveActivity */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4C4956450000000000000090 /* Build configuration list for PBXNativeTarget "BedtimeLiveActivity" */;
buildPhases = (
4C49564500000000000000A0 /* Sources */,
4C4956450000000000000060 /* Frameworks */,
4C49564500000000000000B0 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
371FB5C6302D689B005F6931 /* Shared */,
4C4956450000000000000050 /* BedtimeLiveActivity */,
);
name = BedtimeLiveActivity;
packageProductDependencies = (
);
productName = BedtimeLiveActivity;
productReference = 4C4956450000000000000011 /* BedtimeLiveActivity.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
Expand All @@ -78,11 +153,14 @@
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 2600;
LastUpgradeCheck = 2600;
LastUpgradeCheck = 2660;
TargetAttributes = {
373AAEDC2E91B7E900D8ED84 = {
CreatedOnToolsVersion = 26.0;
};
4C4956450000000000000030 = {
CreatedOnToolsVersion = 26.0;
};
};
};
buildConfigurationList = 373AAED82E91B7E900D8ED84 /* Build configuration list for PBXProject "Bedtime" */;
Expand All @@ -100,6 +178,7 @@
projectRoot = "";
targets = (
373AAEDC2E91B7E900D8ED84 /* Bedtime */,
4C4956450000000000000030 /* BedtimeLiveActivity */,
);
};
/* End PBXProject section */
Expand All @@ -112,6 +191,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4C49564500000000000000B0 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
Expand All @@ -122,24 +208,36 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4C49564500000000000000A0 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
4C4956450000000000000080 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4C4956450000000000000030 /* BedtimeLiveActivity */;
targetProxy = 4C4956450000000000000020 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */

/* Begin XCBuildConfiguration section */
373AAEEC2E91B7EA00D8ED84 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Bedtime/Bedtime.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 9J44X82D53;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_BGTaskSchedulerPermittedIdentifiers = "com.burnsides.bedtime.background-task";
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
INFOPLIST_KEY_NSHealthShareUsageDescription = "Use your sleep data to calculate your sleep bank and provide personalized bedtime recommendations.";
INFOPLIST_KEY_NSHealthUpdateUsageDescription = "Sync sleep data from Bedger to Apple Health";
INFOPLIST_KEY_NSSupportsLiveActivities = YES;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UIBackgroundModes = processing;
Expand All @@ -150,14 +248,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.9.0;
PRODUCT_BUNDLE_IDENTIFIER = com.burnsides.bedtime;
PRODUCT_NAME = Bedger;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
Expand All @@ -168,15 +260,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Bedtime/Bedtime.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 9J44X82D53;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_BGTaskSchedulerPermittedIdentifiers = "com.burnsides.bedtime.background-task";
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
INFOPLIST_KEY_NSHealthShareUsageDescription = "Use your sleep data to calculate your sleep bank and provide personalized bedtime recommendations.";
INFOPLIST_KEY_NSHealthUpdateUsageDescription = "Sync sleep data from Bedger to Apple Health";
INFOPLIST_KEY_NSSupportsLiveActivities = YES;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UIBackgroundModes = processing;
Expand All @@ -187,14 +276,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.9.0;
PRODUCT_BUNDLE_IDENTIFIER = com.burnsides.bedtime;
PRODUCT_NAME = Bedger;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
Expand Down Expand Up @@ -233,6 +316,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 9J44X82D53;
ENABLE_STRICT_OBJC_MSGSEND = YES;
Expand All @@ -252,14 +336,18 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
MARKETING_VERSION = 0.9.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 6.0;
};
name = Debug;
Expand Down Expand Up @@ -298,6 +386,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 9J44X82D53;
ENABLE_NS_ASSERTIONS = NO;
Expand All @@ -311,17 +400,57 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
MARKETING_VERSION = 0.9.0;
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 6.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
4C49564500000000000000C0 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = "BedtimeLiveActivity-Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = Bedger;
IPHONEOS_DEPLOYMENT_TARGET = 18.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.burnsides.bedtime.liveactivity;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
4C49564500000000000000D0 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = "BedtimeLiveActivity-Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = Bedger;
IPHONEOS_DEPLOYMENT_TARGET = 18.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.burnsides.bedtime.liveactivity;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
Expand All @@ -343,6 +472,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4C4956450000000000000090 /* Build configuration list for PBXNativeTarget "BedtimeLiveActivity" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4C49564500000000000000C0 /* Debug */,
4C49564500000000000000D0 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 373AAED52E91B7E900D8ED84 /* Project object */;
Expand Down
6 changes: 6 additions & 0 deletions Bedtime/Bedtime/BedtimeApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ struct BedtimeApp: App {
}
}()

init() {
// Must happen synchronously before the app finishes launching, per
// BGTaskScheduler's requirements.
LiveActivityManager.registerBackgroundTask()
}

var body: some Scene {
WindowGroup {
ContentView()
Expand Down
Loading