From 0a835f6be02b764e285afe8bd8944b0e21eaf698 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 26 Apr 2026 23:20:36 -0500 Subject: [PATCH] Drop App Groups, share via keychain access group only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apple's ASC API doesn't expose App Group registration cleanly, and the keychain access group on its own (`$(AppIdentifierPrefix)`) already gives the share extension and container app a shared store for the base URL + token. The repo cache moves to per-process UserDefaults — the extension fetches/caches it on first share if empty. Co-Authored-By: Claude Opus 4.7 (1M context) --- GiteaIssue/GiteaIssue.entitlements | 4 ---- GiteaIssueShare/GiteaIssueShare.entitlements | 4 ---- Shared/RepoCache.swift | 12 ++++++------ Shared/Settings.swift | 8 +++----- 4 files changed, 9 insertions(+), 19 deletions(-) diff --git a/GiteaIssue/GiteaIssue.entitlements b/GiteaIssue/GiteaIssue.entitlements index 905d4f9..ca57964 100644 --- a/GiteaIssue/GiteaIssue.entitlements +++ b/GiteaIssue/GiteaIssue.entitlements @@ -2,10 +2,6 @@ - com.apple.security.application-groups - - group.com.treytartt.GiteaIssue - keychain-access-groups $(AppIdentifierPrefix)com.treytartt.GiteaIssue diff --git a/GiteaIssueShare/GiteaIssueShare.entitlements b/GiteaIssueShare/GiteaIssueShare.entitlements index 905d4f9..ca57964 100644 --- a/GiteaIssueShare/GiteaIssueShare.entitlements +++ b/GiteaIssueShare/GiteaIssueShare.entitlements @@ -2,10 +2,6 @@ - com.apple.security.application-groups - - group.com.treytartt.GiteaIssue - keychain-access-groups $(AppIdentifierPrefix)com.treytartt.GiteaIssue diff --git a/Shared/RepoCache.swift b/Shared/RepoCache.swift index dc1af73..42bb30b 100644 --- a/Shared/RepoCache.swift +++ b/Shared/RepoCache.swift @@ -9,7 +9,7 @@ enum RepoCache { static var repos: [GiteaRepo] { get { - guard let data = AppSettings.sharedDefaults.data(forKey: listKey) else { return [] } + guard let data = AppSettings.localDefaults.data(forKey: listKey) else { return [] } let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 return (try? decoder.decode([GiteaRepo].self, from: data)) ?? [] @@ -18,14 +18,14 @@ enum RepoCache { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 if let data = try? encoder.encode(newValue) { - AppSettings.sharedDefaults.set(data, forKey: listKey) - AppSettings.sharedDefaults.set(Date(), forKey: listFetchedKey) + AppSettings.localDefaults.set(data, forKey: listKey) + AppSettings.localDefaults.set(Date(), forKey: listFetchedKey) } } } static var fetchedAt: Date? { - AppSettings.sharedDefaults.object(forKey: listFetchedKey) as? Date + AppSettings.localDefaults.object(forKey: listFetchedKey) as? Date } static var isStale: Bool { @@ -34,13 +34,13 @@ enum RepoCache { } static var recentFullNames: [String] { - AppSettings.sharedDefaults.stringArray(forKey: recentsKey) ?? [] + AppSettings.localDefaults.stringArray(forKey: recentsKey) ?? [] } static func touch(_ fullName: String) { var current = recentFullNames.filter { $0 != fullName } current.insert(fullName, at: 0) if current.count > recentsCap { current = Array(current.prefix(recentsCap)) } - AppSettings.sharedDefaults.set(current, forKey: recentsKey) + AppSettings.localDefaults.set(current, forKey: recentsKey) } } diff --git a/Shared/Settings.swift b/Shared/Settings.swift index 57f08b0..deb94a5 100644 --- a/Shared/Settings.swift +++ b/Shared/Settings.swift @@ -1,8 +1,6 @@ import Foundation enum AppSettings { - static let appGroup = "group.com.treytartt.GiteaIssue" - private static let baseURLKey = "gitea.baseURL" private static let tokenKey = "gitea.token" @@ -20,7 +18,7 @@ enum AppSettings { !token.isEmpty && URL(string: baseURL) != nil } - static var sharedDefaults: UserDefaults { - UserDefaults(suiteName: appGroup) ?? .standard - } + /// Process-local cache store. Keychain handles cross-process sharing; + /// the cached repo list lives in each process's standard defaults. + static var localDefaults: UserDefaults { .standard } }