Boot Up was created to solve my problem of opening instagram reels whenever I had a second to spare. It uses Apple’s Screen Time APIs to lock down user selected apps and enforces/integrates a fake loading screen as the only way to unlock them.
I like playing video games but I found myself scrolling on instagram even when I had the time to make some progress in the video game I am playing at the time. Why? Because instagram reels loads instantly and my PC or Steam deck takes a minute or two to boot up a game. So I thought, why dont I force a loading screen on instagram as well so I will play my game instead of brain rotting. (lesser of two evils?)
[1] First Launch
└── open Boot Up
└── Onboarding slideshow video tutorial shows
├── Get Screen Time authorization
└── Get Notification authorization
└── Tap + in top right to choose apps to lock (FamilyActivityPicker)
├── saves selection (UserDefaults?? better way to do this?)
└── locks chosen apps via ManagedSettingsStore
├── user clicks new app shown in the LockedAppsView to add a name to them
├── [Note 1] This is necessary because I need to link the app to a bundleID
and a urlScheme like this, bundleID: com.instagram instagram urlScheme: instagram://
├── [Note 2] This allows me to send the custom boot timer information with the notification or
automation and it also allows me to deeplink back to the app after the loading screen finishes.
└── [Note 3] These bundleIDs and urlSchemes are saved in the AppDatabase.swift file for
popular apps. If the user to use an app that isnt in the database they can set
up a open app shortcut that they can then input into the "Deep Link Fallback"
in TokenTimerEditView.
[2] Static Shielded App Screen (Apple's Shield Configuration Extension)
└── user taps locked app
├── iOS displays Static Shield UI
└── Shortcut automation fires bringing the user to Boot Up
└── Boot Up starts the loading screen for the app the user opened
[3] Buttons on static shield screen (Apple's Shield Action Extension)
[Note] This is only if the user didnt set up the shortcut automation
└── user taps primary button (BOOT UP) on the static shield screen
└── fire notification that includes bundleID to figure out custom boot time set and app name
└── user taps notification
[4] Actual Loading Screen
└── Boot Up shows ShieldLoadingView (my cool loading screen)
└── hits 100%
├── Calls ManagedSettingsStore
│ └── Locked app is temporarily unlocked
└── Start DeviceActivityMonitorExtension
└── Schedule user's set grace period
[5] relock (Apple's Device Activity Monitor Extension)
[Note] I dont really do any of this, the timing and unlocking is all handled by Apple extensions
└── locked app temporarily unclocked
└── grace time successfully reached
└── iOS wakes DeviceActivityMonitorExtension in background
└── Extension reads app token saved in UserDefaults
└── Extension calls ManagedSettingsStore
└── app is relocked
If you have a solution or want to help with any of this please make a pull request. thanks