From ba086e1fde12a572040db259c59fed18b7ea2d55 Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Wed, 18 Mar 2026 08:42:51 +0100 Subject: [PATCH 1/2] feat(ios): add Swift Package Manager support --- .gitignore | 6 +++ Package.swift | 32 +++++++++++++++ ios/Plugin.xcodeproj/project.pbxproj | 8 ---- ios/Plugin/CapacitorSQLitePlugin.h | 10 ----- ios/Plugin/CapacitorSQLitePlugin.m | 56 -------------------------- ios/Plugin/CapacitorSQLitePlugin.swift | 55 ++++++++++++++++++++++++- package.json | 6 ++- 7 files changed, 96 insertions(+), 77 deletions(-) create mode 100644 Package.swift delete mode 100644 ios/Plugin/CapacitorSQLitePlugin.h delete mode 100644 ios/Plugin/CapacitorSQLitePlugin.m diff --git a/.gitignore b/.gitignore index b16e7d49..6824719b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,12 @@ Pods Podfile.lock Build xcuserdata +Package.resolved +/.build +/Packages +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc # macOS files .DS_Store diff --git a/Package.swift b/Package.swift new file mode 100644 index 00000000..a8a665cf --- /dev/null +++ b/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "CapacitorCommunitySqlite", + platforms: [.iOS(.v13)], + products: [ + .library( + name: "CapacitorCommunitySqlite", + targets: ["CapacitorSQLitePlugin"]) + ], + dependencies: [ + .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", branch: "8.0.0"), + .package(url: "https://github.com/sqlcipher/SQLCipher.swift.git", from: "4.14.0"), + .package(url: "https://github.com/weichsel/ZIPFoundation.git", from: "0.9.0") + ], + targets: [ + .target( + name: "CapacitorSQLitePlugin", + dependencies: [ + .product(name: "Capacitor", package: "capacitor-swift-pm"), + .product(name: "Cordova", package: "capacitor-swift-pm"), + .product(name: "SQLCipher", package: "SQLCipher.swift"), + .product(name: "ZIPFoundation", package: "ZIPFoundation") + ], + path: "ios/Plugin"), + .testTarget( + name: "CapacitorSQLitePluginTests", + dependencies: ["CapacitorSQLitePlugin"], + path: "ios/PluginTests") + ] +) diff --git a/ios/Plugin.xcodeproj/project.pbxproj b/ios/Plugin.xcodeproj/project.pbxproj index 53fae33c..2ec973b1 100644 --- a/ios/Plugin.xcodeproj/project.pbxproj +++ b/ios/Plugin.xcodeproj/project.pbxproj @@ -40,9 +40,7 @@ 2F98D68224C9AAE500613A4C /* CapacitorSQLite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F98D68124C9AAE400613A4C /* CapacitorSQLite.swift */; }; 50ADFF92201F53D600D50D53 /* Plugin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50ADFF88201F53D600D50D53 /* Plugin.framework */; }; 50ADFF97201F53D600D50D53 /* CapacitorSQLitePluginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50ADFF96201F53D600D50D53 /* CapacitorSQLitePluginTests.swift */; }; - 50ADFF99201F53D600D50D53 /* CapacitorSQLitePlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 50ADFF8B201F53D600D50D53 /* CapacitorSQLitePlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 50ADFFA42020D75100D50D53 /* Capacitor.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50ADFFA52020D75100D50D53 /* Capacitor.framework */; }; - 50ADFFA82020EE4F00D50D53 /* CapacitorSQLitePlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 50ADFFA72020EE4F00D50D53 /* CapacitorSQLitePlugin.m */; }; 50E1A94820377CB70090CE1A /* CapacitorSQLitePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E1A94720377CB70090CE1A /* CapacitorSQLitePlugin.swift */; }; /* End PBXBuildFile section */ @@ -88,13 +86,11 @@ 2F98D68124C9AAE400613A4C /* CapacitorSQLite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CapacitorSQLite.swift; sourceTree = ""; }; 3B2A61DA5A1F2DD4F959604D /* Pods_Plugin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Plugin.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50ADFF88201F53D600D50D53 /* Plugin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Plugin.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 50ADFF8B201F53D600D50D53 /* CapacitorSQLitePlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CapacitorSQLitePlugin.h; sourceTree = ""; }; 50ADFF8C201F53D600D50D53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50ADFF91201F53D600D50D53 /* PluginTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PluginTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 50ADFF96201F53D600D50D53 /* CapacitorSQLitePluginTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CapacitorSQLitePluginTests.swift; sourceTree = ""; }; 50ADFF98201F53D600D50D53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50ADFFA52020D75100D50D53 /* Capacitor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Capacitor.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 50ADFFA72020EE4F00D50D53 /* CapacitorSQLitePlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CapacitorSQLitePlugin.m; sourceTree = ""; }; 50E1A94720377CB70090CE1A /* CapacitorSQLitePlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CapacitorSQLitePlugin.swift; sourceTree = ""; }; 5E23F77F099397094342571A /* Pods-Plugin.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Plugin.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Plugin/Pods-Plugin.debug.xcconfig"; sourceTree = ""; }; 91781294A431A2A7CC6EB714 /* Pods-Plugin.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Plugin.release.xcconfig"; path = "Pods/Target Support Files/Pods-Plugin/Pods-Plugin.release.xcconfig"; sourceTree = ""; }; @@ -205,8 +201,6 @@ 2C3AF2F725B591BC00C5EF2F /* Utils */, 2F98D68124C9AAE400613A4C /* CapacitorSQLite.swift */, 50E1A94720377CB70090CE1A /* CapacitorSQLitePlugin.swift */, - 50ADFF8B201F53D600D50D53 /* CapacitorSQLitePlugin.h */, - 50ADFFA72020EE4F00D50D53 /* CapacitorSQLitePlugin.m */, 50ADFF8C201F53D600D50D53 /* Info.plist */, 2CB89AE227C57603001F464B /* BiometricIDAuthentication.swift */, 2C3AF2F325B58EC400C5EF2F /* Database.swift */, @@ -255,7 +249,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 50ADFF99201F53D600D50D53 /* CapacitorSQLitePlugin.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -451,7 +444,6 @@ 2CB9B93A2601EF3700743730 /* UtilsMigrate.swift in Sources */, 2CB4368728EEEFF500C973AA /* UtilsDownloadFromHTTP.swift in Sources */, 2C8C860B2A84373F001F9CB2 /* UtilsSQLStatement.swift in Sources */, - 50ADFFA82020EE4F00D50D53 /* CapacitorSQLitePlugin.m in Sources */, 2C3AF31A25B593E500C5EF2F /* UtilsUpgrade.swift in Sources */, 2C3AF31225B5938500C5EF2F /* UtilsJson.swift in Sources */, 2CB89AE327C57603001F464B /* BiometricIDAuthentication.swift in Sources */, diff --git a/ios/Plugin/CapacitorSQLitePlugin.h b/ios/Plugin/CapacitorSQLitePlugin.h deleted file mode 100644 index f2bd9e0b..00000000 --- a/ios/Plugin/CapacitorSQLitePlugin.h +++ /dev/null @@ -1,10 +0,0 @@ -#import - -//! Project version number for Plugin. -FOUNDATION_EXPORT double PluginVersionNumber; - -//! Project version string for Plugin. -FOUNDATION_EXPORT const unsigned char PluginVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - diff --git a/ios/Plugin/CapacitorSQLitePlugin.m b/ios/Plugin/CapacitorSQLitePlugin.m deleted file mode 100644 index 85f2d17a..00000000 --- a/ios/Plugin/CapacitorSQLitePlugin.m +++ /dev/null @@ -1,56 +0,0 @@ -#import -#import - -// Define the plugin using the CAP_PLUGIN Macro, and -// each method the plugin supports using the CAP_PLUGIN_METHOD macro. -CAP_PLUGIN(CapacitorSQLitePlugin, "CapacitorSQLite", - CAP_PLUGIN_METHOD(echo, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(createConnection, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(closeConnection, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(createNCConnection, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(closeNCConnection, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getNCDatabasePath, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(open, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(close, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getUrl, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getVersion, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(execute, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(executeSet, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(run, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(query, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isDBExists, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isDBOpen, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(deleteDatabase, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(importFromJson, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isJsonValid, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(exportToJson, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(deleteExportedRows, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(createSyncTable, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(setSyncDate, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getSyncDate, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(addUpgradeStatement, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(copyFromAssets, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isDatabase, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isNCDatabase, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isTableExists, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getDatabaseList, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getTableList, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getMigratableDbList, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(addSQLiteSuffix, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(deleteOldDatabases, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(moveDatabasesAndAddSuffix, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(checkConnectionsConsistency, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isSecretStored, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(setEncryptionSecret, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(changeEncryptionSecret, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(clearEncryptionSecret, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(getFromHTTPRequest, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(checkEncryptionSecret, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isInConfigEncryption, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isInConfigBiometricAuth, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isDatabaseEncrypted, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(beginTransaction, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(commitTransaction, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(rollbackTransaction, CAPPluginReturnPromise); - CAP_PLUGIN_METHOD(isTransactionActive, CAPPluginReturnPromise); -) diff --git a/ios/Plugin/CapacitorSQLitePlugin.swift b/ios/Plugin/CapacitorSQLitePlugin.swift index 33f6a4d3..27ecb3b6 100644 --- a/ios/Plugin/CapacitorSQLitePlugin.swift +++ b/ios/Plugin/CapacitorSQLitePlugin.swift @@ -4,7 +4,60 @@ import Capacitor @objc(CapacitorSQLitePlugin) // swiftlint:disable file_length // swiftlint:disable type_body_length -public class CapacitorSQLitePlugin: CAPPlugin { +public class CapacitorSQLitePlugin: CAPPlugin, CAPBridgedPlugin { + public let identifier = "CapacitorSQLitePlugin" + public let jsName = "CapacitorSQLite" + public let pluginMethods: [CAPPluginMethod] = [ + CAPPluginMethod(name: "echo", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "createConnection", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "closeConnection", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "createNCConnection", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "closeNCConnection", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getNCDatabasePath", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "open", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "close", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getUrl", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getVersion", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "execute", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "executeSet", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "run", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "query", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isDBExists", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isDBOpen", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "deleteDatabase", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "importFromJson", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isJsonValid", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "exportToJson", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "deleteExportedRows", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "createSyncTable", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "setSyncDate", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getSyncDate", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "addUpgradeStatement", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "copyFromAssets", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isDatabase", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isNCDatabase", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isTableExists", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getDatabaseList", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getTableList", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getMigratableDbList", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "addSQLiteSuffix", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "deleteOldDatabases", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "moveDatabasesAndAddSuffix", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "checkConnectionsConsistency", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isSecretStored", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "setEncryptionSecret", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "changeEncryptionSecret", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "clearEncryptionSecret", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getFromHTTPRequest", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "checkEncryptionSecret", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isInConfigEncryption", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isInConfigBiometricAuth", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isDatabaseEncrypted", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "beginTransaction", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "commitTransaction", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "rollbackTransaction", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "isTransactionActive", returnType: CAPPluginReturnPromise) + ] private var implementation: CapacitorSQLite? private let modeList: [String] = ["no-encryption", "encryption", "secret", "decryption", "newsecret", "wrongsecret"] diff --git a/package.json b/package.json index 786b15d3..9e920718 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "src/", "ios/Plugin/", "electron/", - "CapacitorCommunitySqlite.podspec" + "CapacitorCommunitySqlite.podspec", + "Package.swift" ], "author": "Robin Genz ", "license": "MIT", @@ -57,7 +58,8 @@ "watch": "tsc --watch", "test": "echo \"No test specified\"", "prepublishOnly": "npm run build && npm run build-electron && npm run docgen", - "release": "commit-and-tag-version" + "release": "commit-and-tag-version", + "ios:spm:install": "cd ios && swift package resolve && cd .." }, "devDependencies": { "@capacitor/android": "^8.0.0", From e8ac33788948ff801267ec4efa0eedddb3528546 Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Wed, 18 Mar 2026 08:52:09 +0100 Subject: [PATCH 2/2] Fixes --- Package.swift | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index a8a665cf..97b9e7df 100644 --- a/Package.swift +++ b/Package.swift @@ -3,7 +3,7 @@ import PackageDescription let package = Package( name: "CapacitorCommunitySqlite", - platforms: [.iOS(.v13)], + platforms: [.iOS(.v15)], products: [ .library( name: "CapacitorCommunitySqlite", diff --git a/package.json b/package.json index 9e920718..846d2833 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "test": "echo \"No test specified\"", "prepublishOnly": "npm run build && npm run build-electron && npm run docgen", "release": "commit-and-tag-version", - "ios:spm:install": "cd ios && swift package resolve && cd .." + "ios:spm:install": "swift package resolve" }, "devDependencies": { "@capacitor/android": "^8.0.0",