A patron's app is in a state that sign-out + uninstall + reinstall does not fix. This console walks you through the six-step recovery workflow.
Use this whenever a patron's app is in a stuck state that ordinary sign-out and reinstall does not clear. Typical signals:
Reset Account is a general-purpose local-state recovery for one library — it is not targeted at a specific bug. Use it as the first recovery step whenever ordinary sign-out has not been enough.
Reset Account ships in Palace iOS 3.1.0 — it does not exist on 3.0.3 or earlier.
Ask the patron: open the Palace app → Settings → scroll to the bottom. The version is shown as "Palace 3.1.0 (build n)".
Tell the patron:
Open the Palace app, then go to Settings → Developer Settings → Send Error Logs. You'll see a Device ID near the top — it looks like 12345678-90AB-CDEF-1234-567890ABCDEF. Tap Copy Device ID and paste it into your reply.
If they don't see "Developer Settings": ask them to go to Settings, scroll to the bottom, and long-press the Palace version label until Developer Settings appears.
reset_account_enabled_device_).true.Tip: double-check that the parameter is actually Published — Firebase has a "save draft" state that looks similar but won't fetch on the patron's device.
Tell the patron:
Force-quit Palace (swipe up + flick the card away), then re-open it. Within an hour you should see a red Reset This Library Account button at the bottom of Settings → Accounts → [your library name]. Tap it and confirm. The app signs you out and returns to the library selection screen (5–10 seconds). Sign back in with your card + PIN and try the failing audiobook again.
If they don't see the red button: Remote Config hasn't fetched yet. Have them force-quit + re-open one more time. Worst case, give it 30 more minutes.
Primary check: ask the patron whether the previously-failing book now plays / downloads after they re-signed in.
Optional deep check — if the patron is comfortable sending a sysdiagnose, paste it below to verify every reset step actually ran.
If Step 5 succeeded, turn the flag back off so the Reset button is hidden again on that device.
reset_account_enabled_device_… parameter.false.If Step 5 did not succeed and you're escalating to engineering: leave the flag on. Engineering may need to ask the patron to retry on a diagnostic build.
Tag the HelpSpot ticket with reset-account and note the outcome (fixed / partial / no change) so we can track effectiveness.
If iCloud Backup is enabled and the bad state lives in the backup, every reset gets clobbered by the next restore. Ask the patron to temporarily disable iCloud Backup for Palace (Settings → [name] → iCloud → Manage Account Storage → Backups → [device] → Palace → toggle off), do another Reset, then re-enable after the next successful checkout.
The library's identity provider still has the patron's session active. Ask the patron to clear Safari cookies (Settings → Safari → Clear History and Website Data) and try again.
Device-token rows or license fulfillment cache out of sync server-side. Ask the CM team to inspect the patron's account. Provide Device ID + library + failing book IDs.
Escalate to iOS engineering with: Device ID, failing book IDs, sysdiagnose if available, screenshots, and the verified log output from Step 5. Leave the per-device Firebase flag ON — engineering may ship a diagnostic build and ask the patron to retry.
Full implementation: Palace/SignInLogic/TPPSignInBusinessLogic+ForceReset.swift.
bookDownloadsCenter + bookRegistry state for the selected libraryuserAccount.removeAll), selectedIDP, samlHelper.clearStateNetworkExecutor cache + URLCache.shared.removeAllCachedResponses() — addresses CFNetwork-cached stale fulfillment URLs surviving uninstallprefersEphemeralWebBrowserSession = trueWKWebsiteDataStore.default() — every data type, from epoch[RESET_ACCOUNT] start — libraryAccountID=<uuid>
[RESET_ACCOUNT] step 1 ok — FCM token DELETE dispatched
[RESET_ACCOUNT] step 2 ok — bookDownloadsCenter + bookRegistry reset
[RESET_ACCOUNT] step 2.5 — dispatching DRM deauthorize
[RESET_ACCOUNT] step 3 ok — userAccount.removeAll, selectedIDP=nil
[RESET_ACCOUNT] step 4 ok — networkExecutor cache + URLCache cleared
[RESET_ACCOUNT] step 5 ok — nextOIDCSessionEphemeral flag set
[RESET_ACCOUNT] step 6 ok — WKWebsiteDataStore wiped
[RESET_ACCOUNT] complete
| Mechanism | Firebase parameter | Default |
|---|---|---|
| Per-device (support) | reset_account_enabled_device_<id> | n/a |
| Global rollout | reset_account_enabled | false |
| QA local override | RemoteFeatureFlags.resetAccountLocalOverride UserDefault | unset |