I once wrote an article about using Shortcuts to sync workout records to my blog’s personal status.
But in actual use it felt awful: on one hand, the shortcut was so long that tweaking any part of it became extremely tedious; on the other, Apple’s automation offers no “run at fixed times” option, so to cover an entire day of scheduled syncing I had to create five or six separate automations. The whole thing was bulky and clumsy. So, during the New-Year break I wrote an app that uses HKObserverQuery + widget background tasks to push data automatically.



Because I’m on a free Apple developer account, I can only archive the app into an ipa file and install it via SideStore. This means that even though HealthKit entitlements are declared, the health-authorization sheet never appears after installation, so the app can’t access any health data. After searching online and finding no good solutions, I thought I’d have to reconnect to Xcode every week to rebuild and re-sign the app just to keep it alive.
Later I stumbled across this Reddit post; in the comments someone mentioned an idea: change the app’s Bundle ID so it re-uses an already-existing App ID, bypassing the problem that an unexpired App ID prevents installing a new app.
After testing, this trick also works for the missing health-authorization sheet when installing via SideStore. The concrete steps: change the Xcode project’s Bundle ID to the same App ID used when the app was first installed via SideStore, then run once on a real device through Xcode so that Xcode registers the HealthKit capability for that App ID. Launch the app and the health-authorization sheet now pops up normally, letting you grant access.
Finally, rebuild the app into an ipa and reinstall via SideStore; the app now accesses HealthKit data while already authorized. This approach somewhat circumvents the limitation that free-developer-account sideloaded apps don’t show authorization sheets.
Of course, whether the authorization obtained this way will persist long-term remains to be seen. I’ll update if anything new turns up. Confirmed: the method works permanently.