Repository navigation
iOS: save the recovery phrase to Passwords, and restore from it - #476
Merged
Merged
Conversation
jvsena42
added this pull request to stack #477
October 8, 2026 23:45
jvsena42
commented
Oct 9, 2026
jvsena42
left a comment
Owner
Author
There was a problem hiding this comment.
Two findings, both needing a device or a hand on the Simulator to settle. The thirteen catalog keys exist in all eleven localizations and none carries a format specifier.
jvsena42
force-pushed
the
feat/ios-password-manager
branch
from
October 9, 2026 00:11
2ec251f to
afaf126
Compare
iOS withheld the password-manager backup on the reasoning that no API writes an arbitrary secret into the Passwords app. That holds for an arbitrary secret and not for a password belonging to a domain that names the app, which loopky.app now can. PasswordManagerSheet saves a loopky.app shared web credential under the account's pubky and reads it back through the system's saved-password sheet. The backup menu, phrase screen and confirm step gain what Android has, and the restore menu gains the third card. The shared ViewModels are unchanged: the Swift side answers the same effects. The entitlement gains webcredentials:loopky.app. The site must list the app under webcredentials before this works on a device; a simulator does not enforce it. Refs #472 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #472 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On iOS the save is two system prompts, and a signed-in user has a reason to dismiss a sheet titled "Sign In". The read-back then returned nil and the screen said nothing was saved while the entry sat in Passwords; a retry saved again over it. Android has the same shape with its picker. A failed read-back after a successful save is now its own state, with its own line, and the next tap raises the check alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jvsena42
force-pushed
the
feat/ios-password-manager
branch
from
October 9, 2026 00:16
afaf126 to
002a2e6
Compare
jvsena42
marked this pull request as ready for review
October 9, 2026 00:17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #472. Stacked on #475.
Do not merge until jvsena42/loopky.github.io#23 is deployed and this has been run on a device. See "Not verified".
What the spike found
SecAddSharedWebCredentialstill compiles against the current SDK and works: on a simulator it raises the system alert "Would you like to save this password in your iCloud Keychain…".ASAuthorizationPasswordRequestraises the "Sign In" sheet naming the credential by the account's full pubky.IosPasswordManagerPresencewas wrong for a domain-scoped credential.canSave()is now true.What changed
PasswordManagerSheet.swift: save and read, no Kotlin binding, same split asSpeechListener.Loopky.entitlements:webcredentials:loopky.app.backup_method_password_manager_detailis new copy naming Apple's Passwords app, because the Android text names Google Password Manager.The shared ViewModels are unchanged.
Verification
xcodebuildmcp simulator buildsucceeds;./gradlew lintSwift checkStringPluralspass.restore_phrase_manager_emptywith the field editable.Not verified
snapshot-uidoes not list it; AXe taps do nothing), so the verified state, the tick on the backup menu, the confirm step and a restore from a saved entry were not driven. It takes one tap by hand in the Simulator.webcredentialsentry, so it does not enforce the association. A device does. Until the site PR is live and Apple's CDN has it, a device save should fail withbackup_phrase_manager_failed.Config.xcconfigalready says how to blank the entitlement.journeys/28has the device steps andjourneys/README.mdrecords the above.🤖 Generated with Claude Code