onboarding: persist completed flag keychain-first so it doesn't re-show

The completed flag lived only in app-group UserDefaults
(UserDefaults(suiteName: appGroupSuite)). On free SideStore accounts the
app-group container isn't provisioned, so the suite read as nil: save was a
silent no-op and load always returned false -> onboarding re-appeared on
every launch even after finishing and granting all permissions.

Switch to saveString/loadString (keychain-first, app-group mirror) under
onboardingCompletedKey, matching favourites/distance-unit persistence which
survives reinstall and works without a provisioning group. loadString falls
back to the app-group mirror, so anyone who previously completed on a
provisioned group keeps their flag; users on unprovisioned groups complete
once more and then it sticks.
This commit is contained in:
FuelBoard Contributor
2026-08-20 12:27:09 +01:00
parent 28bb245c93
commit 10e3b54d0c
+8 -4
View File
@@ -934,15 +934,19 @@ struct FuelStore {
}
// MARK: Onboarding the app shows the intro screen on first launch only
// (a test button in the Alerts tab re-opens it). Stored in the app group
// so the widget can see it too if ever needed.
// (a test button in the Alerts tab re-opens it). Stored KEYCHAIN-FIRST
// (with an app-group mirror) for the same reason as favourites/distance
// unit: free SideStore accounts don't provision the app-group container,
// so an app-group-only flag silently fails to save AND reloads as false,
// making onboarding re-appear on every launch. Keychain survives reinstall
// and is shared with the extension.
static func loadHasCompletedOnboarding() -> Bool {
UserDefaults(suiteName: appGroupSuite)?.bool(forKey: onboardingCompletedKey) ?? false
(loadString(service: onboardingCompletedKey) ?? "0") == "1"
}
static func saveHasCompletedOnboarding(_ completed: Bool) {
UserDefaults(suiteName: appGroupSuite)?.set(completed, forKey: onboardingCompletedKey)
saveString(completed ? "1" : "0", service: onboardingCompletedKey)
}
// MARK: Low-level keychain helpers