Skip to content

Commit 02e35a7

Browse files
committed
fix: 4 blocking bugs — iOS target 17.0, debug prints→Logger, PG SSL dynamic, Keychain group runtime
1 parent f3535f5 commit 02e35a7

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

TableProMobile/TableProMobile.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,7 +1705,7 @@
17051705
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
17061706
GCC_WARN_UNUSED_FUNCTION = YES;
17071707
GCC_WARN_UNUSED_VARIABLE = YES;
1708-
IPHONEOS_DEPLOYMENT_TARGET = 26.4;
1708+
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
17091709
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
17101710
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
17111711
MTL_FAST_MATH = YES;
@@ -1763,7 +1763,7 @@
17631763
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
17641764
GCC_WARN_UNUSED_FUNCTION = YES;
17651765
GCC_WARN_UNUSED_VARIABLE = YES;
1766-
IPHONEOS_DEPLOYMENT_TARGET = 26.4;
1766+
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
17671767
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
17681768
MTL_ENABLE_DEBUG_INFO = NO;
17691769
MTL_FAST_MATH = YES;

TableProMobile/TableProMobile/Drivers/PostgreSQLDriver.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,26 @@ final class PostgreSQLDriver: DatabaseDriver, @unchecked Sendable {
1717
private let user: String
1818
private let password: String
1919
private let database: String
20+
private let sslEnabled: Bool
2021

2122
var supportsSchemas: Bool { true }
2223
private(set) var currentSchema: String? = "public"
2324
var supportsTransactions: Bool { true }
2425
private(set) var serverVersion: String?
2526

26-
init(host: String, port: Int, user: String, password: String, database: String) {
27+
init(host: String, port: Int, user: String, password: String, database: String, sslEnabled: Bool = false) {
2728
self.host = host
2829
self.port = port
2930
self.user = user
3031
self.password = password
3132
self.database = database
33+
self.sslEnabled = sslEnabled
3234
}
3335

3436
// MARK: - Connection
3537

3638
func connect() async throws {
37-
try await actor.connect(host: host, port: port, user: user, password: password, database: database)
39+
try await actor.connect(host: host, port: port, user: user, password: password, database: database, sslEnabled: sslEnabled)
3840
serverVersion = await actor.serverVersion()
3941
}
4042

@@ -274,14 +276,15 @@ final class PostgreSQLDriver: DatabaseDriver, @unchecked Sendable {
274276
private actor PostgreSQLActor {
275277
private var conn: OpaquePointer?
276278

277-
func connect(host: String, port: Int, user: String, password: String, database: String) throws {
279+
func connect(host: String, port: Int, user: String, password: String, database: String, sslEnabled: Bool = false) throws {
278280
let escapedHost = escapeConnParam(host)
279281
let escapedUser = escapeConnParam(user)
280282
let escapedPass = escapeConnParam(password)
281283
let escapedDb = escapeConnParam(database)
284+
let sslmode = sslEnabled ? "require" : "disable"
282285

283286
let connStr = "host='\(escapedHost)' port='\(port)' dbname='\(escapedDb)' " +
284-
"user='\(escapedUser)' password='\(escapedPass)' connect_timeout='10' sslmode='disable'"
287+
"user='\(escapedUser)' password='\(escapedPass)' connect_timeout='10' sslmode='\(sslmode)'"
285288

286289
let connection = PQconnectdb(connStr)
287290

TableProMobile/TableProMobile/Platform/IOSDriverFactory.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ final class IOSDriverFactory: DriverFactory {
2626
port: connection.port,
2727
user: connection.username,
2828
password: password ?? "",
29-
database: connection.database
29+
database: connection.database,
30+
sslEnabled: connection.sslEnabled
3031
)
3132
case .redis:
3233
let dbIndex = Int(connection.database) ?? 0

TableProMobile/TableProMobile/Platform/KeychainSecureStore.swift

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,32 @@ import TableProDatabase
99

1010
final class KeychainSecureStore: SecureStore {
1111
private let serviceName = "com.TablePro"
12-
private let accessGroup = "D7HJ5TFYCU.com.TablePro.shared"
12+
private let accessGroup: String
13+
14+
private static func resolveAccessGroup() -> String {
15+
// Read team ID prefix from provisioning at runtime
16+
if let seedID = Bundle.main.infoDictionary?["AppIdentifierPrefix"] as? String {
17+
return "\(seedID)com.TablePro.shared"
18+
}
19+
// Fallback: query Keychain for the app's default access group
20+
let query: [String: Any] = [
21+
kSecClass as String: kSecClassGenericPassword,
22+
kSecAttrAccount as String: "__accessgroup_probe__",
23+
kSecReturnAttributes as String: true,
24+
]
25+
var result: AnyObject?
26+
SecItemAdd(query as CFDictionary, &result)
27+
SecItemDelete(query as CFDictionary)
28+
if let attrs = result as? [String: Any],
29+
let group = attrs[kSecAttrAccessGroup as String] as? String {
30+
let prefix = group.components(separatedBy: ".").first ?? ""
31+
return "\(prefix).com.TablePro.shared"
32+
}
33+
return "D7HJ5TFYCU.com.TablePro.shared"
34+
}
1335

1436
init() {
37+
self.accessGroup = Self.resolveAccessGroup()
1538
migrateFromOldServiceIfNeeded()
1639
}
1740

TableProMobile/TableProMobile/Sync/IOSSyncCoordinator.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
import CloudKit
77
import Foundation
88
import Observation
9+
import os
910
import TableProModels
1011
import TableProSync
1112

1213
@MainActor @Observable
1314
final class IOSSyncCoordinator {
15+
private static let logger = Logger(subsystem: "com.TablePro.Mobile", category: "Sync")
16+
1417
var status: SyncStatus = .idle
1518
var lastSyncDate: Date?
1619

@@ -44,10 +47,10 @@ final class IOSSyncCoordinator {
4447

4548
try await getEngine().ensureZoneExists()
4649
let remoteChanges = try await pull()
47-
print("SYNC: pulled \(remoteChanges.changed.count) changed, \(remoteChanges.deletedIDs.count) deleted")
50+
Self.logger.info("Pulled \(remoteChanges.changed.count) changed, \(remoteChanges.deletedIDs.count) deleted")
4851
try await push(localConnections: localConnections)
4952
let merged = merge(local: localConnections, remote: remoteChanges)
50-
print("SYNC: local=\(localConnections.count), merged=\(merged.count)")
53+
Self.logger.info("Merged: local=\(localConnections.count), result=\(merged.count)")
5154
onConnectionsChanged?(merged)
5255

5356
metadata.lastSyncDate = Date()

0 commit comments

Comments
 (0)