diff --git a/.github/scripts/update_native_sdks.sh b/.github/scripts/update_native_sdks.sh index 9020102b..741b2c53 100644 --- a/.github/scripts/update_native_sdks.sh +++ b/.github/scripts/update_native_sdks.sh @@ -34,7 +34,7 @@ echo "Android SDK last version is $androidVersion" sed -i~ -e "s|io.didomi.sdk:android:[0-9]\{1,2\}.[0-9]\{1,2\}.[0-9]\{1,2\}|io.didomi.sdk:android:$androidVersion|g" android/build.gradle || exit 1 -# Update ios SDK Version +# Update ios SDK Version for both CocoaPods and SPM builds iOSVersion=$(pod_last_version) if [[ ! $iOSVersion =~ ^[0-9]+.[0-9]+.[0-9]+$ ]]; then echo "Error while getting ios SDK version ($iOSVersion)" @@ -44,6 +44,7 @@ fi echo "iOS SDK last version is $iOSVersion" sed -i~ -e "s|s.dependency 'Didomi-XCFramework', '[0-9]\{1,2\}.[0-9]\{1,2\}.[0-9]\{1,2\}'|s.dependency 'Didomi-XCFramework', '$iOSVersion'|g" ios/didomi_sdk.podspec || exit 1 +sed -i~ -e "s|from: \"[0-9]\{1,2\}.[0-9]\{1,2\}.[0-9]\{1,2\}\"|from: \"$iOSVersion\"|g" ios/didomi_sdk/Package.swift || exit 1 # Cleanup backup files find . -type f -name '*~' -delete diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c448d8d7..fec87b7f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -95,10 +95,24 @@ jobs: working-directory: ./example/ios run: pod update - # iOS IPA - - name: Build iOS Sample + # iOS IPA with SPM + - name: Build iOS Sample (SPM) working-directory: ./example run: | + flutter config --enable-swift-package-manager + flutter build ios --no-codesign + cd build/ios/iphoneos + mkdir Payload-spm + cd Payload-spm + ln -s ../Runner.app + cd .. + zip -r app-spm.ipa Payload-spm + + # iOS IPA with CocoaPods + - name: Build iOS Sample (CocoaPods) + working-directory: ./example + run: | + flutter config --no-enable-swift-package-manager flutter build ios --no-codesign cd build/ios/iphoneos mkdir Payload diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 6e9d1ff2..e35f4926 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -26,9 +26,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Didomi-XCFramework: 671c92122f40c407fc0d24f101c27c898ac83a61 - didomi_sdk: 0b8b5935f1b53169cfa87d9401a1d3ed8c455b85 + didomi_sdk: cd6fc1713dec59d1ac293f5b6fe7d6bae17a28fa Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 + integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e PODFILE CHECKSUM: e2772aabdb96c4d254f2b01df983810e9a468979 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index cd103e54..7285b534 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -191,7 +191,7 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 4C11C7A522D5C5BDF99CED1E /* [CP] Embed Pods Frameworks */, + 50A0FB47D488346EABFE2884 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -320,7 +320,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 4C11C7A522D5C5BDF99CED1E /* [CP] Embed Pods Frameworks */ = { + 50A0FB47D488346EABFE2884 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( diff --git a/ios/Assets/.gitkeep b/ios/Assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/ios/didomi_sdk.podspec b/ios/didomi_sdk.podspec index 2ca40937..50d80468 100644 --- a/ios/didomi_sdk.podspec +++ b/ios/didomi_sdk.podspec @@ -10,7 +10,8 @@ Pod::Spec.new do |s| s.license = { :type => 'BSD', :file => '../LICENSE' } s.author = { 'Didomi ' => 'tech@didomi.io' } s.source = { :path => 'git@github.com:didomi/flutter.git', :tag => '2.18.0' } - s.source_files = 'Classes/**/*' + s.source_files = 'didomi_sdk/Sources/**/*.{swift,h,m}' + s.public_header_files = 'didomi_sdk/Sources/DidomiObjC/include/**/*.h' s.dependency 'Flutter' s.dependency 'Didomi-XCFramework', '2.34.0' s.platform = :ios, '13.0' diff --git a/ios/didomi_sdk/Package.swift b/ios/didomi_sdk/Package.swift new file mode 100644 index 00000000..b43528a1 --- /dev/null +++ b/ios/didomi_sdk/Package.swift @@ -0,0 +1,40 @@ +// 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: "didomi_sdk", + platforms: [ + .iOS("10.0") + ], + products: [ + .library(name: "didomi-sdk", targets: ["didomi_sdk"]) + ], + dependencies: [ + .package(url: "https://github.com/didomi/didomi-ios-sdk-spm", from: "2.34.0") + ], + targets: [ + .target( + name: "DidomiSwift", + dependencies: [ + .product(name: "Didomi", package: "didomi-ios-sdk-spm") + ], + path: "Sources/DidomiSwift", + resources: [], + linkerSettings: [ + .linkedFramework("Flutter", .when(platforms: [.iOS])) + ] + ), + .target( + name: "didomi_sdk", + dependencies: ["DidomiSwift"], + path: "Sources/DidomiObjC", + resources: [], + publicHeadersPath: "include", + linkerSettings: [ + .linkedFramework("Flutter", .when(platforms: [.iOS])) + ] + ) + ] +) diff --git a/ios/Classes/DidomiSdkPlugin.m b/ios/didomi_sdk/Sources/DidomiObjC/DidomiSdkPlugin.m similarity index 54% rename from ios/Classes/DidomiSdkPlugin.m rename to ios/didomi_sdk/Sources/DidomiObjC/DidomiSdkPlugin.m index 84acd16b..b0771e0d 100644 --- a/ios/Classes/DidomiSdkPlugin.m +++ b/ios/didomi_sdk/Sources/DidomiObjC/DidomiSdkPlugin.m @@ -1,11 +1,12 @@ #import "DidomiSdkPlugin.h" +#import + +// For CocoaPods/traditional builds #if __has_include() #import #else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "didomi_sdk-Swift.h" +// For SPM builds, import the Swift module directly +@import DidomiSwift; #endif @implementation DidomiSdkPlugin diff --git a/ios/Classes/DidomiSdkPlugin.h b/ios/didomi_sdk/Sources/DidomiObjC/include/DidomiSdkPlugin.h similarity index 100% rename from ios/Classes/DidomiSdkPlugin.h rename to ios/didomi_sdk/Sources/DidomiObjC/include/DidomiSdkPlugin.h diff --git a/ios/didomi_sdk/Sources/DidomiObjC/include/didomi_sdk.h b/ios/didomi_sdk/Sources/DidomiObjC/include/didomi_sdk.h new file mode 100644 index 00000000..0cb5efd7 --- /dev/null +++ b/ios/didomi_sdk/Sources/DidomiObjC/include/didomi_sdk.h @@ -0,0 +1,8 @@ +// +// didomi_sdk.h +// didomi_sdk +// +// Umbrella header for didomi_sdk module +// + +#import "DidomiSdkPlugin.h" diff --git a/ios/Classes/Constants.swift b/ios/didomi_sdk/Sources/DidomiSwift/Constants.swift similarity index 96% rename from ios/Classes/Constants.swift rename to ios/didomi_sdk/Sources/DidomiSwift/Constants.swift index f05122cb..e22e47c1 100644 --- a/ios/Classes/Constants.swift +++ b/ios/didomi_sdk/Sources/DidomiSwift/Constants.swift @@ -5,6 +5,8 @@ // Created by Philémon Merlet on 10/05/2021. // +import Foundation + struct Constants { // Channels names static let methodsChannelName = "didomi_sdk" diff --git a/ios/Classes/DidomiEventStreamHandler.swift b/ios/didomi_sdk/Sources/DidomiSwift/DidomiEventStreamHandler.swift similarity index 100% rename from ios/Classes/DidomiEventStreamHandler.swift rename to ios/didomi_sdk/Sources/DidomiSwift/DidomiEventStreamHandler.swift diff --git a/ios/Classes/EntitiesHelper.swift b/ios/didomi_sdk/Sources/DidomiSwift/EntitiesHelper.swift similarity index 100% rename from ios/Classes/EntitiesHelper.swift rename to ios/didomi_sdk/Sources/DidomiSwift/EntitiesHelper.swift diff --git a/ios/Classes/SwiftDidomiSdkPlugin.swift b/ios/didomi_sdk/Sources/DidomiSwift/SwiftDidomiSdkPlugin.swift similarity index 99% rename from ios/Classes/SwiftDidomiSdkPlugin.swift rename to ios/didomi_sdk/Sources/DidomiSwift/SwiftDidomiSdkPlugin.swift index d2c11482..36f39a5f 100644 --- a/ios/Classes/SwiftDidomiSdkPlugin.swift +++ b/ios/didomi_sdk/Sources/DidomiSwift/SwiftDidomiSdkPlugin.swift @@ -2,7 +2,7 @@ import Flutter import UIKit import Didomi -public class SwiftDidomiSdkPlugin: NSObject, FlutterPlugin { +@objc public class SwiftDidomiSdkPlugin: NSObject, FlutterPlugin { /// Default message if SDK is not ready private static let didomiNotReadyException: String = "Didomi SDK is not ready. Use the onReady callback to access this method." @@ -12,13 +12,13 @@ public class SwiftDidomiSdkPlugin: NSObject, FlutterPlugin { override init() { super.init() - + if let userAgentVersion = Constants.userAgentVersion { Didomi.shared.setUserAgent(name: Constants.userAgentName, version: userAgentVersion) } } - - public static func register(with registrar: FlutterPluginRegistrar) { + + @objc public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: Constants.methodsChannelName, binaryMessenger: registrar.messenger()) let instance = SwiftDidomiSdkPlugin() registrar.addMethodCallDelegate(instance, channel: channel)