Settings now persists the receiver URL and device identifier together in Keychain, with tracking preferences in versioned UserDefaults. Blank identifiers generate eight digits on save; supplied identifiers retain their exact text. Configuration never starts tracking or contacts a receiver.
Keychain access loads silently when available, explains authorization only when needed, and preserves saved data on cancellation. Settings has explicit fields, transient status messages, Dock/Command-Tab window access and validated focus recovery after denial.
Local builds use free Apple Development signing with ignored local Team/certificate configuration. PR CI explicitly uses ad hoc signing without credentials. Release signing and downloaded-DMG validation remain in #17 and #16; certificate-renewal continuity remains an untested assumption.
The same builds/tests passed in explicit CI signing mode without local signing configuration; opposite signature modes are rejected.
Manually verified real-Keychain persistence, identifiers/URL validation, cancellation/retry, focus after two denials and the Settings/Dock/About/status-message regression.
Both hosted build toolchains must pass before integration; physical minimum-OS distribution testing is separate.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/jayanezj/traccar-client-macos/pull/24
Author: @jayanezj
Created: 10/25/2026
Status: ✅ Merged
Merged: 10/25/2026
Merged by: @jayanezj
Base:
main← Head:feature/3-configuration-persistence📝 Commits (1)
026cd6afeat: persist local configuration and device identity (#3)📊 Changes
23 files changed (+1441 additions, -41 deletions)
View changed files
📝
.github/workflows/ci.yml(+6 -0)📝
.gitignore(+1 -0)📝
.swiftlint.yml(+1 -0)➕
Configuration/Signing.local.xcconfig.example(+5 -0)➕
Configuration/Signing.xcconfig(+9 -0)📝
README.md(+52 -9)📝
TraccarClient.xcodeproj/project.pbxproj(+34 -7)📝
TraccarClient.xcodeproj/xcshareddata/xcschemes/TraccarClient.xcscheme(+10 -0)📝
TraccarClient/Application/TraccarClientApp.swift(+44 -1)➕
TraccarClient/Configuration/AppConfiguration.swift(+116 -0)➕
TraccarClient/Configuration/ConfigurationModel.swift(+121 -0)➕
TraccarClient/Configuration/ConfigurationPersistence.swift(+164 -0)📝
TraccarClient/Interface/SettingsView.swift(+160 -21)📝
TraccarClient/Interface/TrackingMenu.swift(+2 -2)➕
TraccarClient/Interface/WindowFocusController.swift(+63 -0)➕
TraccarClientTests/ConfigurationTests.swift(+371 -0)➕
TraccarClientTests/KeychainAccessTests.swift(+106 -0)➕
TraccarClientTests/WindowFocusTests.swift(+104 -0)📝
scripts/build.sh(+2 -0)📝
scripts/check-local.sh(+6 -1)...and 3 more files
📄 Description
Settings now persists the receiver URL and device identifier together in Keychain, with tracking preferences in versioned UserDefaults. Blank identifiers generate eight digits on save; supplied identifiers retain their exact text. Configuration never starts tracking or contacts a receiver.
Keychain access loads silently when available, explains authorization only when needed, and preserves saved data on cancellation. Settings has explicit fields, transient status messages, Dock/Command-Tab window access and validated focus recovery after denial.
Local builds use free Apple Development signing with ignored local Team/certificate configuration. PR CI explicitly uses ad hoc signing without credentials. Release signing and downloaded-DMG validation remain in #17 and #16; certificate-renewal continuity remains an untested assumption.
Validation:
Final implementation decisions.
Closes #3
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.