From 2dc251743a9c7a2e6aaf4361331a5d2bd0c4521c Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:45:18 +0800 Subject: [PATCH 01/11] Bound Facebook iOS SDK range to major version 18 The SPM dependency used `from: "18.0.0"` which is unbounded and would accept v19, v20, etc. This could silently break the plugin on a major SDK update. Align with the podspec (`~> 18.0`) and Android (`[18.0,19.0)`) by using an explicit half-open range. Co-Authored-By: Claude Opus 4.6 --- ios/facebook_app_events/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/facebook_app_events/Package.swift b/ios/facebook_app_events/Package.swift index ccb82af6..8f56f606 100644 --- a/ios/facebook_app_events/Package.swift +++ b/ios/facebook_app_events/Package.swift @@ -18,7 +18,7 @@ let package = Package( .library(name: "facebook-app-events", targets: ["facebook_app_events"]) ], dependencies: [ - .package(url: "https://github.com/facebook/facebook-ios-sdk.git", from: "18.0.0") + .package(url: "https://github.com/facebook/facebook-ios-sdk.git", "18.0.0"..<"19.0.0") ], targets: [ .target( From 8d4aadb312c712ea339658d5e75f0d307ed17a2a Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:47:06 +0800 Subject: [PATCH 02/11] Update Android toolchain to latest stable versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Kotlin 1.9.24 → 2.3.10 - AGP 8.5.2 → 8.9.2 - Gradle 8.7 → 8.11.1 - compileSdk 34 → 35 (Android 15) Co-Authored-By: Claude Opus 4.6 --- android/build.gradle | 6 +++--- android/gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 6a9f1853..e52b6d4e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,14 +2,14 @@ group = "id.oddbit.flutter.facebook_app_events" version = "1.0-SNAPSHOT" buildscript { - ext.kotlin_version = "1.9.24" + ext.kotlin_version = "2.3.10" repositories { google() mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:8.5.2") + classpath("com.android.tools.build:gradle:8.9.2") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") } } @@ -27,7 +27,7 @@ apply plugin: "kotlin-android" android { namespace "id.oddbit.flutter.facebook_app_events" - compileSdk = 34 + compileSdk = 35 compileOptions { sourceCompatibility = JavaVersion.VERSION_17 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index e68633d2..c6484273 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -# AGP 8.5.x pairs with Gradle 8.7 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +# AGP 8.9.x pairs with Gradle 8.11.1 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip From a9780c9d00e882c7918c105ede377fdf57759459 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:47:20 +0800 Subject: [PATCH 03/11] Update iOS toolchain and raise deployment target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - swift-tools-version 5.9 → 6.1 - Podspec swift_version 5.0 → 5.9 (align with Package.swift minimum) - iOS deployment target 12.0 → 13.0 (iOS 12 is EOL) Co-Authored-By: Claude Opus 4.6 --- ios/facebook_app_events.podspec | 4 ++-- ios/facebook_app_events/Package.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/facebook_app_events.podspec b/ios/facebook_app_events.podspec index 5c22a282..683ca802 100644 --- a/ios/facebook_app_events.podspec +++ b/ios/facebook_app_events.podspec @@ -12,8 +12,8 @@ Flutter plugin for Facebook Analytics and App Events s.source_files = 'facebook_app_events/Sources/facebook_app_events/**/*.{swift}' s.static_framework = true s.dependency 'Flutter' - s.swift_version = '5.0' - s.ios.deployment_target = '12.0' + s.swift_version = '5.9' + s.ios.deployment_target = '13.0' # Do not specify PATCH version of FBSDKCoreKit. See README file for explanation # https://github.com/oddbit/flutter_facebook_app_events#dependencies-on-facebook-sdk diff --git a/ios/facebook_app_events/Package.swift b/ios/facebook_app_events/Package.swift index 8f56f606..de0004b8 100644 --- a/ios/facebook_app_events/Package.swift +++ b/ios/facebook_app_events/Package.swift @@ -3,7 +3,7 @@ // This source file is part of facebook_app_events. // Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE. -// swift-tools-version: 5.9 +// swift-tools-version: 6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -11,7 +11,7 @@ import PackageDescription let package = Package( name: "facebook_app_events", platforms: [ - .iOS(.v12) + .iOS(.v13) ], products: [ // If the plugin name contains "_", the library name must use "-". From d11fd9bd0a694db3b6427c9d12e65b9f70c7a507 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:47:32 +0800 Subject: [PATCH 04/11] Tighten Dart and Flutter SDK constraints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dart >=2.12.0 → >=3.6.0 (Dart 3.6 ships with Flutter 3.27) - Flutter >=2.0.0 → >=3.27.0 The previous range was extremely broad and included versions from 2021. This still supports Flutter releases from December 2024 onward. Co-Authored-By: Claude Opus 4.6 --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index e6e4c534..aba97f51 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,8 +5,8 @@ version: 0.25.0 homepage: https://github.com/oddbit/flutter_facebook_app_events environment: - sdk: '>=2.12.0 <4.0.0' - flutter: '>=2.0.0' + sdk: '>=3.6.0 <4.0.0' + flutter: '>=3.27.0' dependencies: flutter: From 4183bcdee1e4883842d83c83cbea6355680e6070 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:47:51 +0800 Subject: [PATCH 05/11] Add analysis_options.yaml with flutter_lints The project had no static analysis configuration. Add flutter_lints as a dev dependency with the standard recommended ruleset to catch common issues during development. Co-Authored-By: Claude Opus 4.6 --- analysis_options.yaml | 1 + pubspec.yaml | 1 + 2 files changed, 2 insertions(+) create mode 100644 analysis_options.yaml diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 00000000..f9b30346 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml diff --git a/pubspec.yaml b/pubspec.yaml index aba97f51..09d62545 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_lints: ^5.0.0 flutter: plugin: From db44f15ba5f2c2b8a69073d87446d75ec6b6ae5a Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:48:15 +0800 Subject: [PATCH 06/11] Add Android build performance config and consumer ProGuard rules - gradle.properties: enable parallel builds, caching, and non-transitive R classes for faster incremental compilation - consumer-proguard-rules.pro: prevent R8 from stripping Facebook SDK classes in host apps that enable code shrinking Co-Authored-By: Claude Opus 4.6 --- android/build.gradle | 1 + android/consumer-proguard-rules.pro | 4 ++++ android/gradle.properties | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 android/consumer-proguard-rules.pro create mode 100644 android/gradle.properties diff --git a/android/build.gradle b/android/build.gradle index e52b6d4e..3d7a394f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,6 +48,7 @@ android { defaultConfig { minSdk = 21 + consumerProguardFiles 'consumer-proguard-rules.pro' } dependencies { diff --git a/android/consumer-proguard-rules.pro b/android/consumer-proguard-rules.pro new file mode 100644 index 00000000..e06a6a1d --- /dev/null +++ b/android/consumer-proguard-rules.pro @@ -0,0 +1,4 @@ +# Preserve Facebook App Events SDK classes used by this plugin. +# Without this rule, R8 in the host app may strip classes that are only +# referenced reflectively by the Facebook SDK, causing runtime crashes. +-keep class com.facebook.appevents.** { *; } diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 00000000..674fa0f5 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.parallel=true +org.gradle.caching=true +android.nonTransitiveRClass=true From ec672fd30de5659fe7c923f0110591cb61f2a182 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:48:34 +0800 Subject: [PATCH 07/11] Fix double-Handle typo in iOS anonymous ID handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename handleHandleGetAnonymousId → handleGetAnonymousId. This is a private method name only; the method channel string is unchanged. Co-Authored-By: Claude Opus 4.6 --- .../Sources/facebook_app_events/FacebookAppEventsPlugin.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/facebook_app_events/Sources/facebook_app_events/FacebookAppEventsPlugin.swift b/ios/facebook_app_events/Sources/facebook_app_events/FacebookAppEventsPlugin.swift index f6b0c926..27b9753d 100644 --- a/ios/facebook_app_events/Sources/facebook_app_events/FacebookAppEventsPlugin.swift +++ b/ios/facebook_app_events/Sources/facebook_app_events/FacebookAppEventsPlugin.swift @@ -67,7 +67,7 @@ public class FacebookAppEventsPlugin: NSObject, FlutterPlugin { case "logPurchase": handlePurchased(call, result: result) case "getAnonymousId": - handleHandleGetAnonymousId(call, result: result) + handleGetAnonymousId(call, result: result) case "setAdvertiserTracking": handleSetAdvertiserTracking(call, result: result) case "setGraphApiVersion": @@ -127,7 +127,7 @@ public class FacebookAppEventsPlugin: NSObject, FlutterPlugin { result(appId) } - private func handleHandleGetAnonymousId(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + private func handleGetAnonymousId(_ call: FlutterMethodCall, result: @escaping FlutterResult) { result(AppEvents.shared.anonymousID) } From e7b0566aae6b05e4ac62b81e5b9120076b88f366 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 09:51:20 +0800 Subject: [PATCH 08/11] Relax Dart/Flutter SDK floor to match ecosystem conventions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dart >=3.6.0 → >=3.3.0, Flutter >=3.27.0 → >=3.19.0. Aligns with flutter_facebook_auth and covers releases from March 2024 onward without forcing aggressive upgrades on consumers. Co-Authored-By: Claude Opus 4.6 --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 09d62545..a1678bda 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,8 +5,8 @@ version: 0.25.0 homepage: https://github.com/oddbit/flutter_facebook_app_events environment: - sdk: '>=3.6.0 <4.0.0' - flutter: '>=3.27.0' + sdk: '>=3.3.0 <4.0.0' + flutter: '>=3.19.0' dependencies: flutter: From bc46bee64c1af373b84d5f938f4724a7bb18f413 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 10:02:54 +0800 Subject: [PATCH 09/11] Narrow consumer ProGuard comment to match actual keep scope MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The keep rule only covers com.facebook.appevents.** — other Facebook SDK classes (FacebookSdk, GraphRequest, etc.) are directly referenced and won't be stripped by R8. Co-Authored-By: Claude Opus 4.6 --- android/consumer-proguard-rules.pro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/consumer-proguard-rules.pro b/android/consumer-proguard-rules.pro index e06a6a1d..2c43d228 100644 --- a/android/consumer-proguard-rules.pro +++ b/android/consumer-proguard-rules.pro @@ -1,4 +1,4 @@ -# Preserve Facebook App Events SDK classes used by this plugin. -# Without this rule, R8 in the host app may strip classes that are only -# referenced reflectively by the Facebook SDK, causing runtime crashes. +# Preserve Facebook App Events classes used by this plugin. +# Without this rule, R8 in the host app may strip App Events classes that are +# only referenced reflectively by the Facebook App Events SDK, causing runtime crashes. -keep class com.facebook.appevents.** { *; } From e808df0d2c384add75c2c947523825f8ff639076 Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 10:03:02 +0800 Subject: [PATCH 10/11] Revert swift-tools-version to 5.9 No SwiftPM 6.1 features are used in the manifest. Keeping 5.9 avoids forcing SPM users onto a newer Xcode than necessary. Co-Authored-By: Claude Opus 4.6 --- ios/facebook_app_events/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/facebook_app_events/Package.swift b/ios/facebook_app_events/Package.swift index de0004b8..b4ce0348 100644 --- a/ios/facebook_app_events/Package.swift +++ b/ios/facebook_app_events/Package.swift @@ -3,7 +3,7 @@ // This source file is part of facebook_app_events. // Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE. -// swift-tools-version: 6.1 +// swift-tools-version: 5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription From 06d1299f325071a0d531566a326b76306c90305b Mon Sep 17 00:00:00 2001 From: Dennis Alund Date: Thu, 12 Mar 2026 10:03:08 +0800 Subject: [PATCH 11/11] Update example app Android toolchain to match plugin Align the example app's AGP (8.9.2), Kotlin (2.3.10), and Gradle (8.11.1) with the plugin so CI builds use the same toolchain. Co-Authored-By: Claude Opus 4.6 --- example/android/build.gradle | 4 ++-- example/android/gradle/wrapper/gradle-wrapper.properties | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/example/android/build.gradle b/example/android/build.gradle index b35213f2..ae291b29 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = "1.9.24" + ext.kotlin_version = "2.3.10" repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.5.2' + classpath 'com.android.tools.build:gradle:8.9.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 5fecd5c7..f41ca66a 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -4,4 +4,5 @@ distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +# AGP 8.9.x pairs with Gradle 8.11.1 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip