diff --git a/android/src/main/java/com/revenuecat/purchases_flutter/PurchasesFlutterPlugin.java b/android/src/main/java/com/revenuecat/purchases_flutter/PurchasesFlutterPlugin.java index 1df102697..964fbc5fc 100644 --- a/android/src/main/java/com/revenuecat/purchases_flutter/PurchasesFlutterPlugin.java +++ b/android/src/main/java/com/revenuecat/purchases_flutter/PurchasesFlutterPlugin.java @@ -201,6 +201,9 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { case "syncPurchases": syncPurchases(result); break; + case "syncPurchasesWith": + syncPurchasesWith(result); + break; case "isAnonymous": isAnonymous(result); break; @@ -520,6 +523,10 @@ private void syncPurchases(final Result result) { result.success(null); } + private void syncPurchasesWith(final Result result) { + CommonKt.syncPurchases(getOnResult(result)); + } + private void isAnonymous(final Result result) { result.success(CommonKt.isAnonymous()); } diff --git a/ios/Classes/PurchasesFlutterPlugin.m b/ios/Classes/PurchasesFlutterPlugin.m index 074a8403b..5f76eac7b 100644 --- a/ios/Classes/PurchasesFlutterPlugin.m +++ b/ios/Classes/PurchasesFlutterPlugin.m @@ -104,6 +104,8 @@ - (void)handleMethodCall:(FlutterMethodCall *)call [self getCustomerInfoWithResult:result]; } else if ([@"syncPurchases" isEqualToString:call.method]) { [self syncPurchasesWithResult:result]; + } else if ([@"syncPurchasesWith" isEqualToString:call.method]) { + [self syncPurchasesWithResult:result]; } else if ([@"enableAdServicesAttributionTokenCollection" isEqualToString:call.method]) { [self enableAdServicesAttributionTokenCollection:result]; } else if ([@"recordPurchaseForProductID" isEqualToString:call.method]) { diff --git a/lib/purchases_flutter.dart b/lib/purchases_flutter.dart index 05ad38871..1443db529 100644 --- a/lib/purchases_flutter.dart +++ b/lib/purchases_flutter.dart @@ -634,6 +634,19 @@ class Purchases { /// successful purchase. static Future syncPurchases() => _channel.invokeMethod('syncPurchases'); + /// This method will send all the purchases to the RevenueCat backend. + /// + /// **WARNING**: Call this when using your own implementation of in-app + /// purchases. + /// + /// This method should be called anytime a sync is needed, like after a + /// successful purchase. + static Future syncPurchasesWithResult() async { + final result = await _channel.invokeMethod('syncPurchasesWith'); + return CustomerInfo.fromJson(Map.from(result)); + } + + /// iOS only. Enable automatic collection of Apple Search Ad attribution. Disabled by /// default static Future enableAdServicesAttributionTokenCollection() =>