diff --git a/CHANGELOG.md b/CHANGELOG.md index fb271faa..5b293e3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 11.1.1 +* Fixed bug when No-Codes screen on iOS was closing after the user canceled the purchase flow +* Small MacOS support fixes + ## 11.1.0 * No-Codes can now be used with your [custom purchase system](https://documentation.qonversion.io/docs/using-no-codes-with-custom-purchases-handling), even if you use Qonversion in Analytics mode, * You can now provide a custom locale to No-Codes to override the system one, diff --git a/android/build.gradle b/android/build.gradle index 6261194d..88a054f0 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -51,6 +51,6 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "io.qonversion:sandwich:7.3.0" + implementation "io.qonversion:sandwich:7.3.1" implementation 'com.google.code.gson:gson:2.9.0' } diff --git a/ios/qonversion_flutter.podspec b/ios/qonversion_flutter.podspec index 5abab99f..9cf8f186 100644 --- a/ios/qonversion_flutter.podspec +++ b/ios/qonversion_flutter.podspec @@ -16,7 +16,7 @@ Pod::Spec.new do |s| s.source_files = 'Classes/**/*' s.dependency 'Flutter' s.platform = :ios, '13.0' - s.dependency "QonversionSandwich", "7.3.0" + s.dependency "QonversionSandwich", "7.3.1" # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } diff --git a/lib/src/internal/qonversion_internal.dart b/lib/src/internal/qonversion_internal.dart index e1157701..a187a642 100644 --- a/lib/src/internal/qonversion_internal.dart +++ b/lib/src/internal/qonversion_internal.dart @@ -11,7 +11,7 @@ import 'package:qonversion_flutter/src/internal/utils/string.dart'; import 'constants.dart'; class QonversionInternal implements Qonversion { - static const String sdkVersion = "11.1.0"; + static const String sdkVersion = "11.1.1"; final MethodChannel _channel = MethodChannel('qonversion_plugin'); diff --git a/macos/Classes/SwiftQonversionPlugin.swift b/macos/Classes/SwiftQonversionPlugin.swift index 39eccab1..fb10a6f3 100644 --- a/macos/Classes/SwiftQonversionPlugin.swift +++ b/macos/Classes/SwiftQonversionPlugin.swift @@ -30,18 +30,18 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { instance.qonversionSandwich = sandwichInstance } - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + @MainActor public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { // MARK: - Calls without arguments switch (call.method) { case "syncHistoricalData": - qonversionSandwich?.syncHistoricalData() - return result(nil) + qonversionSandwich?.syncHistoricalData() + return result(nil) case "syncStoreKit2Purchases": - qonversionSandwich?.syncStoreKit2Purchases() - return result(nil) + qonversionSandwich?.syncStoreKit2Purchases() + return result(nil) case "products": return products(result) @@ -62,9 +62,6 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { case "logout": qonversionSandwich?.logout() return result(nil) - - case "isFallbackFileAccessible": - return isFallbackFileAccessible(result) case "userInfo": return userInfo(result) @@ -72,9 +69,15 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { case "userProperties": return userProperties(result) + case "isFallbackFileAccessible": + return isFallbackFileAccessible(result) + case "remoteConfigList": return remoteConfigList(result) + case "collectAppleSearchAdsAttribution": + return collectAppleSearchAdsAttribution(result) + default: break } @@ -95,6 +98,9 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { case "purchase": return purchase(args, result) + case "purchaseWithResult": + return purchaseWithResult(args, result) + case "remoteConfig": return remoteConfig(args["contextKey"] as? String, result) @@ -118,10 +124,10 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { case "identify": return identify(args["userId"] as? String, result) - + case "attachUserToExperiment": return attachUserToExperiment(args, result) - + case "detachUserFromExperiment": return detachUserFromExperiment(args, result) @@ -171,7 +177,7 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { return result(FlutterError.noNecessaryData) } - qonversionSandwich?.getPromotionalOffer(productId, productDiscountId:discountId, completion:getDefaultCompletion(result)) + qonversionSandwich?.getPromotionalOffer(productId, productDiscountId:discountId, completion:getJsonCompletion(result)) } private func products(_ result: @escaping FlutterResult) { @@ -190,6 +196,18 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { qonversionSandwich?.purchase(productId, quantity:quantity, contextKeys:contextKeys, promoOffer:promoOfferData, completion:getJsonCompletion(result)) } + private func purchaseWithResult(_ args: [String: Any], _ result: @escaping FlutterResult) { + guard let productId = args["productId"] as? String else { + return result(FlutterError.noNecessaryData) + } + + let contextKeys = args["contextKeys"] as? [String] ?? [] + let quantity = args["quantity"] as? Int ?? 1 + let promoOfferData = args["promoOffer"] as? [String: Any] ?? [:] + + qonversionSandwich?.purchaseWithResult(productId, quantity:quantity, contextKeys:contextKeys, promoOffer:promoOfferData, completion:getJsonCompletion(result)) + } + private func checkEntitlements(_ result: @escaping FlutterResult) { qonversionSandwich?.checkEntitlements(getJsonCompletion(result)) } @@ -206,6 +224,11 @@ public class SwiftQonversionPlugin: NSObject, FlutterPlugin { qonversionSandwich?.isFallbackFileAccessible(completion: getJsonCompletion(result)) } + private func collectAppleSearchAdsAttribution(_ result: @escaping FlutterResult) { + qonversionSandwich?.collectAppleSearchAdsAttribution() + result(nil) + } + private func remoteConfigList(_ args: [String: Any], _ result: @escaping FlutterResult) { guard let contextKeys = args["contextKeys"] as? [String] else { return result(FlutterError.noNecessaryData) diff --git a/macos/qonversion_flutter.podspec b/macos/qonversion_flutter.podspec index 39a9feb0..5aa15b25 100644 --- a/macos/qonversion_flutter.podspec +++ b/macos/qonversion_flutter.podspec @@ -16,7 +16,7 @@ Pod::Spec.new do |s| s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' s.platform = :osx, '10.12' - s.dependency "QonversionSandwich", "6.0.10" + s.dependency "QonversionSandwich", "7.3.1" s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } s.swift_version = '5.0' diff --git a/pubspec.yaml b/pubspec.yaml index 519f1841..12511bd0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: qonversion_flutter description: Flutter plugin to implement in-app subscriptions and purchases. Validate user receipts and manage cross-platform access to paid content on your app. Android & iOS. -version: 11.1.0 +version: 11.1.1 homepage: 'https://qonversion.io' repository: 'https://github.com/qonversion/flutter-sdk'