From 59f21f807df51bfd20c604cff06eb1004bd2f696 Mon Sep 17 00:00:00 2001 From: Aleksandr Lozhkovoi Date: Sat, 14 Feb 2026 15:50:23 +0100 Subject: [PATCH] Add Swift Package Manager support for iOS Implements SPM support alongside existing CocoaPods integration. Changes: - Add Package.swift with Intercom SDK 19.5.1 dependency - Move source files to intercom_flutter/Sources/intercom_flutter/ - Update podspec paths and remove duplicate dependency - Add .gitignore for SPM build artifacts - Update example app Xcode project for SPM integration Both package managers now use the same source files and SDK version. Tested with both CocoaPods and SPM - all working correctly. Resolves #491 --- .gitignore | 1 + intercom_flutter/example/ios/.gitignore | 8 +++++ .../ios/Runner.xcodeproj/project.pbxproj | 33 ++++++++++++++++--- .../xcshareddata/xcschemes/Runner.xcscheme | 23 ++++++++++++- intercom_flutter/ios/.gitignore | 4 +++ intercom_flutter/ios/intercom_flutter.podspec | 7 ++-- .../ios/intercom_flutter/Package.resolved | 14 ++++++++ .../ios/intercom_flutter/Package.swift | 29 ++++++++++++++++ .../intercom_flutter}/IntercomFlutterPlugin.m | 2 +- .../intercom_flutter}/IntercomFlutterPlugin.h | 0 10 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 intercom_flutter/ios/intercom_flutter/Package.resolved create mode 100644 intercom_flutter/ios/intercom_flutter/Package.swift rename intercom_flutter/ios/{Classes => intercom_flutter/Sources/intercom_flutter}/IntercomFlutterPlugin.m (99%) rename intercom_flutter/ios/{Classes => intercom_flutter/Sources/intercom_flutter/include/intercom_flutter}/IntercomFlutterPlugin.h (100%) diff --git a/.gitignore b/.gitignore index 94ca7432..e0938d47 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /intercom_flutter/example/lib/generated_plugin_registrant.dart +.idea/ diff --git a/intercom_flutter/example/ios/.gitignore b/intercom_flutter/example/ios/.gitignore index 79cc4da8..b786013f 100644 --- a/intercom_flutter/example/ios/.gitignore +++ b/intercom_flutter/example/ios/.gitignore @@ -43,3 +43,11 @@ Icon? Pods/ .symlinks/ + +# Flutter generated files +/Flutter/Flutter.podspec +/Flutter/ephemeral/ + +# Swift Package Manager +/Runner.xcworkspace/xcshareddata/swiftpm/ +/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/ diff --git a/intercom_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/intercom_flutter/example/ios/Runner.xcodeproj/project.pbxproj index 94000315..f5f837ae 100644 --- a/intercom_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/intercom_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,13 +3,14 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -53,6 +54,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, B06D52763675792FF5758304 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -144,13 +146,16 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 5737A5BAF870233794884398 /* [CP] Embed Pods Frameworks */, + 7648CF7DA2AB407AC84CAA65 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -161,7 +166,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -179,6 +184,9 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -205,10 +213,12 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -217,7 +227,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 5737A5BAF870233794884398 /* [CP] Embed Pods Frameworks */ = { + 7648CF7DA2AB407AC84CAA65 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -236,6 +246,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -491,6 +502,20 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/intercom_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/intercom_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 50a8cfc9..851adedd 100644 --- a/intercom_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/intercom_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,10 +1,28 @@ + + + + + + + + + + diff --git a/intercom_flutter/ios/.gitignore b/intercom_flutter/ios/.gitignore index 710ec6cf..db23ae3b 100644 --- a/intercom_flutter/ios/.gitignore +++ b/intercom_flutter/ios/.gitignore @@ -34,3 +34,7 @@ Icon? .tags* /Flutter/Generated.xcconfig + +# Swift Package Manager +.build/ +.swiftpm/ diff --git a/intercom_flutter/ios/intercom_flutter.podspec b/intercom_flutter/ios/intercom_flutter.podspec index 1fb16938..fbbd1531 100644 --- a/intercom_flutter/ios/intercom_flutter.podspec +++ b/intercom_flutter/ios/intercom_flutter.podspec @@ -12,11 +12,10 @@ A new flutter plugin project. s.license = { :file => '../LICENSE' } s.author = { 'xChange OÜ' => 'maido@getchange.com' } s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' + s.source_files = 'intercom_flutter/Sources/intercom_flutter/**/*.{h,m}' + s.public_header_files = 'intercom_flutter/Sources/intercom_flutter/include/**/*.h' s.dependency 'Flutter' - s.dependency 'Intercom' - s.static_framework = true s.dependency 'Intercom', '19.5.1' + s.static_framework = true s.ios.deployment_target = '15.0' end diff --git a/intercom_flutter/ios/intercom_flutter/Package.resolved b/intercom_flutter/ios/intercom_flutter/Package.resolved new file mode 100644 index 00000000..bde8f5f7 --- /dev/null +++ b/intercom_flutter/ios/intercom_flutter/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "intercom-ios-sp", + "kind" : "remoteSourceControl", + "location" : "https://github.com/intercom/intercom-ios-sp.git", + "state" : { + "revision" : "d16b74e358073c91c0462dcc3de4629649f0d6d3", + "version" : "19.5.1" + } + } + ], + "version" : 2 +} diff --git a/intercom_flutter/ios/intercom_flutter/Package.swift b/intercom_flutter/ios/intercom_flutter/Package.swift new file mode 100644 index 00000000..d11123bc --- /dev/null +++ b/intercom_flutter/ios/intercom_flutter/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "intercom_flutter", + platforms: [ + .iOS("15.0") + ], + products: [ + .library(name: "intercom-flutter", targets: ["intercom_flutter"]) + ], + dependencies: [ + .package(url: "https://github.com/intercom/intercom-ios-sp.git", exact: "19.5.1") + ], + targets: [ + .target( + name: "intercom_flutter", + dependencies: [ + .product(name: "Intercom", package: "intercom-ios-sp") + ], + resources: [], + cSettings: [ + .headerSearchPath("include/intercom_flutter") + ] + ) + ] +) diff --git a/intercom_flutter/ios/Classes/IntercomFlutterPlugin.m b/intercom_flutter/ios/intercom_flutter/Sources/intercom_flutter/IntercomFlutterPlugin.m similarity index 99% rename from intercom_flutter/ios/Classes/IntercomFlutterPlugin.m rename to intercom_flutter/ios/intercom_flutter/Sources/intercom_flutter/IntercomFlutterPlugin.m index b48c6ac1..b3a857c7 100644 --- a/intercom_flutter/ios/Classes/IntercomFlutterPlugin.m +++ b/intercom_flutter/ios/intercom_flutter/Sources/intercom_flutter/IntercomFlutterPlugin.m @@ -1,4 +1,4 @@ -#import "IntercomFlutterPlugin.h" +#import "include/intercom_flutter/IntercomFlutterPlugin.h" #import id unread; diff --git a/intercom_flutter/ios/Classes/IntercomFlutterPlugin.h b/intercom_flutter/ios/intercom_flutter/Sources/intercom_flutter/include/intercom_flutter/IntercomFlutterPlugin.h similarity index 100% rename from intercom_flutter/ios/Classes/IntercomFlutterPlugin.h rename to intercom_flutter/ios/intercom_flutter/Sources/intercom_flutter/include/intercom_flutter/IntercomFlutterPlugin.h