diff --git a/.gitignore b/.gitignore
index 1ff18864..1649ddce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,4 +26,8 @@ kotzilla.json
androidApp/keystore/
# Code-review reports — throwaway artifacts written by the code-review skill
-.claude/reviews/
\ No newline at end of file
+.claude/reviews/
+
+# Local SwiftPM working area (multi-GB) of the Kotlin/Native SPM integration. That integration is
+# off via kotlin.disableSwiftPMImport, so this only guards against it reappearing.
+.swiftpm-locks/
diff --git a/gradle.properties b/gradle.properties
index a6470db1..b6ee9b07 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -23,3 +23,11 @@ mainClass=de.tabmates.composeapp.MainKt
# client-version gate rejects a version that does not exist in the tag stream, and a value
# ahead of it also makes the in-app update check believe the build is permanently current.
APP_VERSION=1.0.0
+
+# The Kotlin/Native SwiftPM import would resolve the iOS dependencies our Kotlin libraries declare
+# (currently FirebaseMessaging, via kmpnotifier-push-firebase) by generating a local Swift package
+# under iosApp/ and wiring it into the Xcode project. That package is generated from the dependency
+# graph but has to exist before Xcode resolves packages, which no Gradle sync does — so it would
+# have to be committed and would go stale on every dependency bump. Instead we add those SDKs to
+# iosApp.xcodeproj as ordinary remote Swift packages, as KMPNotifier's own iOS setup documents.
+kotlin.disableSwiftPMImport=true
diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj
index 0413b447..1d20437a 100644
--- a/iosApp/iosApp.xcodeproj/project.pbxproj
+++ b/iosApp/iosApp.xcodeproj/project.pbxproj
@@ -6,6 +6,10 @@
objectVersion = 77;
objects = {
+/* Begin PBXBuildFile section */
+ F1B0A2C4D5E6F70819A2B3C4 /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = F2C1B3D5E6F7081A2B3C4D5E /* FirebaseMessaging */; };
+/* End PBXBuildFile section */
+
/* Begin PBXFileReference section */
D643D6045C11FE74F5CE1290 /* TabMatesApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabMatesApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@@ -41,6 +45,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ F1B0A2C4D5E6F70819A2B3C4 /* FirebaseMessaging in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -85,6 +90,7 @@
);
name = iosApp;
packageProductDependencies = (
+ F2C1B3D5E6F7081A2B3C4D5E /* FirebaseMessaging */,
);
productName = iosApp;
productReference = D643D6045C11FE74F5CE1290 /* TabMatesApp.app */;
@@ -114,6 +120,9 @@
);
mainGroup = 30782983EBF3997AB1AC52A7;
minimizedProjectReferenceProxies = 1;
+ packageReferences = (
+ F3D2C4E6F708192A3B4C5D6E /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
+ );
preferredProjectObjectVersion = 77;
productRefGroup = A812E87C7ABF334E17AF133A /* Products */;
projectDirPath = "";
@@ -370,6 +379,25 @@
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ F3D2C4E6F708192A3B4C5D6E /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 12.14.0;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ F2C1B3D5E6F7081A2B3C4D5E /* FirebaseMessaging */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = F3D2C4E6F708192A3B4C5D6E /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseMessaging;
+ };
+/* End XCSwiftPackageProductDependency section */
};
rootObject = 806E4ABFAD122295F42EBAF6 /* Project object */;
}
diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 00000000..8c4c9981
--- /dev/null
+++ b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,123 @@
+{
+ "originHash" : "8051a8438965fea6e6201e0b87777290e28716696db9fa37c19b6b0d0fd28df6",
+ "pins" : [
+ {
+ "identity" : "abseil-cpp-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/abseil-cpp-binary.git",
+ "state" : {
+ "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5",
+ "version" : "1.2024072200.0"
+ }
+ },
+ {
+ "identity" : "app-check",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/app-check.git",
+ "state" : {
+ "revision" : "3e33dd27dd4c69bd81c7c81fe61d8ccf58846902",
+ "version" : "11.3.1"
+ }
+ },
+ {
+ "identity" : "firebase-ios-sdk",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/firebase-ios-sdk.git",
+ "state" : {
+ "revision" : "346daa9f46316aa372b35b317e18224acc2e9063",
+ "version" : "12.18.0"
+ }
+ },
+ {
+ "identity" : "google-ads-on-device-conversion-ios-sdk",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk",
+ "state" : {
+ "revision" : "dc39082d8881109d35b94b1c122164c0e8d08a55",
+ "version" : "3.6.1"
+ }
+ },
+ {
+ "identity" : "googleappmeasurement",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleAppMeasurement.git",
+ "state" : {
+ "revision" : "f04760d460296cc0fa430935a7be212e5bd67fc5",
+ "version" : "12.18.0"
+ }
+ },
+ {
+ "identity" : "googledatatransport",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleDataTransport.git",
+ "state" : {
+ "revision" : "ba3358d3c3dbae8ef230b58a46b97ad65e84e974",
+ "version" : "10.1.1"
+ }
+ },
+ {
+ "identity" : "googleutilities",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleUtilities.git",
+ "state" : {
+ "revision" : "92c8f6dc3ac375d6febdfcb3db68bc3d10633db3",
+ "version" : "8.1.3"
+ }
+ },
+ {
+ "identity" : "grpc-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/grpc-binary.git",
+ "state" : {
+ "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6",
+ "version" : "1.69.1"
+ }
+ },
+ {
+ "identity" : "gtm-session-fetcher",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/gtm-session-fetcher.git",
+ "state" : {
+ "revision" : "724a52eea6329b7e12d3ad8300d76ca9f3895fcc",
+ "version" : "5.3.1"
+ }
+ },
+ {
+ "identity" : "interop-ios-for-google-sdks",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/interop-ios-for-google-sdks.git",
+ "state" : {
+ "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe",
+ "version" : "101.0.0"
+ }
+ },
+ {
+ "identity" : "leveldb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/leveldb.git",
+ "state" : {
+ "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
+ "version" : "1.22.5"
+ }
+ },
+ {
+ "identity" : "nanopb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/nanopb.git",
+ "state" : {
+ "revision" : "3851d94a41890dea16dc3db34caf60e585cb4163",
+ "version" : "2.30910.1"
+ }
+ },
+ {
+ "identity" : "promises",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/promises.git",
+ "state" : {
+ "revision" : "f4a19a3c313dc2616c70bb49d29a799fb16be837",
+ "version" : "2.4.1"
+ }
+ }
+ ],
+ "version" : 3
+}
diff --git a/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme b/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme
new file mode 100644
index 00000000..dfb57366
--- /dev/null
+++ b/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/iosApp/iosApp/GoogleService-Info.plist b/iosApp/iosApp/GoogleService-Info.plist
new file mode 100644
index 00000000..32f93842
--- /dev/null
+++ b/iosApp/iosApp/GoogleService-Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+
+ API_KEY
+ AIzaSyDUMMYDUMMYDUMMYDUMMYDUMMYDUMMY000
+ GCM_SENDER_ID
+ 000000000000
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ de.tabmates.app.TabMatesApp
+ PROJECT_ID
+ tabmates-dummy
+ STORAGE_BUCKET
+ tabmates-dummy.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:000000000000:ios:0000000000000000000000
+
+