From f8a92e9af3cbd1bd463f37c23bc96a8bd73b9d34 Mon Sep 17 00:00:00 2001 From: Maria Bordunova Date: Thu, 29 Apr 2021 12:35:31 +0300 Subject: [PATCH 1/3] Add headers and support for CheckTrialIntroEligibility --- Editor/QonversionDependencies.xml | 2 +- .../com/qonversion/unitywrapper/Mapper.java | 21 ++++++- .../unitywrapper/QonversionWrapper.java | 58 ++++++++++++------- Runtime/Android/QonversionWrapperAndroid.cs | 10 ++++ Runtime/Scripts/Constants.cs | 9 +++ Runtime/Scripts/Constants.cs.meta | 11 ++++ Runtime/Scripts/IQonversionWrapper.cs | 2 + Runtime/Scripts/Mapper.cs | 25 +++++++- Runtime/Scripts/Models/Eligibility.cs | 41 +++++++++++++ Runtime/Scripts/Models/Eligibility.cs.meta | 11 ++++ Runtime/Scripts/Models/EligibilityStatus.cs | 10 ++++ .../Scripts/Models/EligibilityStatus.cs.meta | 11 ++++ Runtime/Scripts/Models/Product.cs | 5 +- Runtime/Scripts/Qonversion.cs | 38 ++++++++++++ Runtime/Scripts/QonversionWrapperNoop.cs | 10 ++++ Runtime/iOS/Plugins/Common/UtilityBridge.h | 2 + Runtime/iOS/Plugins/Common/UtilityBridge.m | 21 +++++++ Runtime/iOS/Plugins/QonversionBridge.m | 36 ++++++++++++ Runtime/iOS/QonversionWrapperIOS.cs | 23 +++++++- 19 files changed, 315 insertions(+), 31 deletions(-) create mode 100644 Runtime/Scripts/Constants.cs create mode 100644 Runtime/Scripts/Constants.cs.meta create mode 100644 Runtime/Scripts/Models/Eligibility.cs create mode 100644 Runtime/Scripts/Models/Eligibility.cs.meta create mode 100644 Runtime/Scripts/Models/EligibilityStatus.cs create mode 100644 Runtime/Scripts/Models/EligibilityStatus.cs.meta diff --git a/Editor/QonversionDependencies.xml b/Editor/QonversionDependencies.xml index 730a7c6..91b752e 100644 --- a/Editor/QonversionDependencies.xml +++ b/Editor/QonversionDependencies.xml @@ -1,7 +1,7 @@ - + diff --git a/Runtime/Android/Plugins/com/qonversion/unitywrapper/Mapper.java b/Runtime/Android/Plugins/com/qonversion/unitywrapper/Mapper.java index 42042ac..3eede8b 100644 --- a/Runtime/Android/Plugins/com/qonversion/unitywrapper/Mapper.java +++ b/Runtime/Android/Plugins/com/qonversion/unitywrapper/Mapper.java @@ -3,6 +3,8 @@ import com.android.billingclient.api.SkuDetails; import com.qonversion.android.sdk.dto.QPermission; +import com.qonversion.android.sdk.dto.eligibility.QEligibility; +import com.qonversion.android.sdk.dto.eligibility.QIntroEligibilityStatus; import com.qonversion.android.sdk.dto.offerings.QOffering; import com.qonversion.android.sdk.dto.offerings.QOfferings; import com.qonversion.android.sdk.dto.products.QProduct; @@ -17,7 +19,7 @@ public final class Mapper { - public static List> mapPermissions(Map permissions) { + static List> mapPermissions(Map permissions) { List> result = new ArrayList<>(); for (Map.Entry entry : permissions.entrySet()) { @@ -124,7 +126,7 @@ static Map mapOfferings(QOfferings offerings) { return result; } - static Map mapOffering(QOffering offering) { + private static Map mapOffering(QOffering offering) { Map result = new HashMap<>(); result.put("id", offering.getOfferingID()); @@ -144,4 +146,19 @@ static Map mapOffering(QOffering offering) { return result; } + + static List> mapEligibilities(Map map) { + List> result = new ArrayList<>(); + + for (Map.Entry entry : map.entrySet()) { + Map mappedEligibility = new HashMap<>(); + QEligibility eligibility = entry.getValue(); + mappedEligibility.put("productId", entry.getKey()); + mappedEligibility.put("status", eligibility.getStatus().getType()); + + result.add(mappedEligibility); + } + + return result; + } } diff --git a/Runtime/Android/Plugins/com/qonversion/unitywrapper/QonversionWrapper.java b/Runtime/Android/Plugins/com/qonversion/unitywrapper/QonversionWrapper.java index b2a22f7..0d11fa5 100644 --- a/Runtime/Android/Plugins/com/qonversion/unitywrapper/QonversionWrapper.java +++ b/Runtime/Android/Plugins/com/qonversion/unitywrapper/QonversionWrapper.java @@ -1,15 +1,19 @@ package com.qonversion.unitywrapper; import android.app.Activity; -import android.os.AsyncTask; +import android.content.Context; +import android.content.SharedPreferences; import android.util.Log; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.core.JsonProcessingException; import com.qonversion.android.sdk.QUserProperties; +import com.qonversion.android.sdk.QonversionEligibilityCallback; import com.qonversion.android.sdk.QonversionOfferingsCallback; import com.qonversion.android.sdk.QonversionProductsCallback; +import com.qonversion.android.sdk.dto.eligibility.QEligibility; import com.qonversion.android.sdk.dto.offerings.QOfferings; import com.qonversion.android.sdk.dto.products.QProduct; import com.unity3d.player.UnityPlayer; @@ -18,7 +22,6 @@ import java.util.HashMap; import java.util.Map; -import java.util.concurrent.Executor; import java.util.List; import com.fasterxml.jackson.core.type.TypeReference; @@ -32,18 +35,21 @@ import com.qonversion.android.sdk.dto.QLaunchResult; import com.qonversion.android.sdk.dto.QPermission; -import android.os.Handler; +import androidx.preference.PreferenceManager; public class QonversionWrapper { public static String TAG = "QonversionWrapper"; private static String unityListenerName; - private static Executor executor; + public static synchronized void storeSdkInfo(String version, String versionKey, String source, String sourceKey) { + Context context = UnityPlayer.currentActivity.getApplicationContext(); - private static final Object LOCK = new Object(); - - private static Handler mUnityMainThreadHandler; + SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); + editor.putString(versionKey, version); + editor.putString(sourceKey, source); + editor.apply(); + } public static synchronized void launch(String unityListener, String projectKey, boolean observerMode) { Log.d(TAG, "Qonversion Launch starting. Project key: " + projectKey); @@ -198,6 +204,29 @@ public void onError(@NotNull QonversionError error) { }); } + public static synchronized void checkTrialIntroEligibilityForProductIds(String productIds, String unityCallbackName) { + try { + ObjectMapper mapper = new ObjectMapper(); + TypeReference> typeRef = new TypeReference>() {}; + List productIdsList = mapper.readValue(productIds, typeRef); + + Qonversion.checkTrialIntroEligibilityForProductIds(productIdsList, new QonversionEligibilityCallback() { + @Override + public void onSuccess(@NotNull Map eligibilities) { + List> mappedEligibilities = Mapper.mapEligibilities(eligibilities); + sendMessageToUnity(mappedEligibilities, unityCallbackName); + } + + @Override + public void onError(@NotNull QonversionError error) { + handleErrorResponse(error, unityCallbackName); + } + }); + } catch (JsonProcessingException e) { + handleJsonProcessingException(e); + } + } + private static void handlePermissionsResponse(@NotNull Map permissions, @NotNull String methodName) { List> mappedPermissions = Mapper.mapPermissions(permissions); sendMessageToUnity(mappedPermissions, methodName); @@ -230,19 +259,4 @@ private static void sendMessageToUnity(@NotNull Object objectToConvert, @NotNull private static void handleJsonProcessingException(JsonProcessingException e) { Log.e(TAG, "An error occurred while serializing data: " + e.getLocalizedMessage()); } - - private void runOnUnityThread(Runnable runnable) { - if (mUnityMainThreadHandler != null && runnable != null) { - mUnityMainThreadHandler.post(runnable); - } - } - - private static Executor getExecutor() { - synchronized (LOCK) { - if (QonversionWrapper.executor == null) { - QonversionWrapper.executor = AsyncTask.THREAD_POOL_EXECUTOR; - } - } - return QonversionWrapper.executor; - } } \ No newline at end of file diff --git a/Runtime/Android/QonversionWrapperAndroid.cs b/Runtime/Android/QonversionWrapperAndroid.cs index db5e5a5..efb1fc4 100644 --- a/Runtime/Android/QonversionWrapperAndroid.cs +++ b/Runtime/Android/QonversionWrapperAndroid.cs @@ -5,6 +5,11 @@ namespace QonversionUnity { internal class QonversionWrapperAndroid : IQonversionWrapper { + public void StoreSdkInfo(string version, string versionKey, string source, string sourceKey) + { + CallQonversion("storeSdkInfo", version, versionKey, source, sourceKey); + } + public void Launch(string gameObjectName, string projectKey, bool observerMode) { CallQonversion("launch", gameObjectName, projectKey, observerMode); @@ -106,6 +111,11 @@ public void Offerings(string callbackName) CallQonversion("offerings", callbackName); } + public void CheckTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName) + { + CallQonversion("checkTrialIntroEligibilityForProductIds", productIdsJson, callbackName); + } + private const string QonversionWrapper = "com.qonversion.unitywrapper.QonversionWrapper"; private static void CallQonversion(string methodName, params object[] args) diff --git a/Runtime/Scripts/Constants.cs b/Runtime/Scripts/Constants.cs new file mode 100644 index 0000000..da6bbe0 --- /dev/null +++ b/Runtime/Scripts/Constants.cs @@ -0,0 +1,9 @@ +namespace QonversionUnity +{ + static class Constants + { + public const string KeyPrefix = "com.qonversion.keys"; + public const string SourceKey = KeyPrefix + ".source"; + public const string VersionKey = KeyPrefix + ".sourceVersion"; + } +} \ No newline at end of file diff --git a/Runtime/Scripts/Constants.cs.meta b/Runtime/Scripts/Constants.cs.meta new file mode 100644 index 0000000..99bb230 --- /dev/null +++ b/Runtime/Scripts/Constants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ea3fffc4c6514bbdbdce589ee67f561 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/IQonversionWrapper.cs b/Runtime/Scripts/IQonversionWrapper.cs index 3843eb0..f63d481 100644 --- a/Runtime/Scripts/IQonversionWrapper.cs +++ b/Runtime/Scripts/IQonversionWrapper.cs @@ -2,6 +2,7 @@ { internal interface IQonversionWrapper { + void StoreSdkInfo(string version, string versionKey, string source, string sourceKey); void SetDebugMode(); void SetAdvertisingID(); void Launch(string gameObjectName, string projectKey, bool observerMode); @@ -16,5 +17,6 @@ internal interface IQonversionWrapper void UpdatePurchase(string productId, string oldProductId, ProrationMode prorationMode, string callbackName); void Products(string callbackName); void Offerings(string callbackName); + void CheckTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName); } } \ No newline at end of file diff --git a/Runtime/Scripts/Mapper.cs b/Runtime/Scripts/Mapper.cs index 344f39e..5b90f8f 100644 --- a/Runtime/Scripts/Mapper.cs +++ b/Runtime/Scripts/Mapper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using QonversionUnity.MiniJSON; using UnityEngine; @@ -55,7 +55,28 @@ internal static Offerings OfferingsFromJson(string jsonStr) return new Offerings(offerings); } - + + internal static Dictionary EligibilitiesFromJson(string jsonStr) + { + var result = new Dictionary(); + + if (!(Json.Deserialize(jsonStr) is List elibilities)) + { + Debug.LogError("Could not parse Eligibilities"); + return result; + } + + foreach (Dictionary eligibilityDict in elibilities) + { + if (eligibilityDict.TryGetValue("productId", out object value)) + { + Eligibility eligibility = new Eligibility(eligibilityDict); + result.Add(value as string, eligibility); + } + } + + return result; + } internal static QonversionError ErrorFromJson(string jsonStr) { diff --git a/Runtime/Scripts/Models/Eligibility.cs b/Runtime/Scripts/Models/Eligibility.cs new file mode 100644 index 0000000..c830239 --- /dev/null +++ b/Runtime/Scripts/Models/Eligibility.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; + +namespace QonversionUnity +{ + public class Eligibility + { + public readonly EligibilityStatus Status; + + public Eligibility(Dictionary dict) + { + if (dict.TryGetValue("status", out object value)) Status = FormatEligibilityStatus(value); + } + + public override string ToString() + { + return $"{nameof(Status)}: {Status}"; + } + + private EligibilityStatus FormatEligibilityStatus(object status) { + string value = status as string; + EligibilityStatus result; + switch (value) + { + case "non_intro_or_trial_product": + result = EligibilityStatus.NonIntroProduct; + break; + case "intro_or_trial_eligible": + result = EligibilityStatus.Eligible; + break; + case "intro_or_trial_ineligible": + result = EligibilityStatus.Ineligible; + break; + default: + result = EligibilityStatus.Unknown; + break; + } + + return result; + } + } +} \ No newline at end of file diff --git a/Runtime/Scripts/Models/Eligibility.cs.meta b/Runtime/Scripts/Models/Eligibility.cs.meta new file mode 100644 index 0000000..0b5bd33 --- /dev/null +++ b/Runtime/Scripts/Models/Eligibility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e5734643decb54c5b891603130ab213e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Models/EligibilityStatus.cs b/Runtime/Scripts/Models/EligibilityStatus.cs new file mode 100644 index 0000000..c3815fa --- /dev/null +++ b/Runtime/Scripts/Models/EligibilityStatus.cs @@ -0,0 +1,10 @@ +namespace QonversionUnity +{ + public enum EligibilityStatus + { + Unknown, + NonIntroProduct, + Ineligible, + Eligible + } +} \ No newline at end of file diff --git a/Runtime/Scripts/Models/EligibilityStatus.cs.meta b/Runtime/Scripts/Models/EligibilityStatus.cs.meta new file mode 100644 index 0000000..11fdd80 --- /dev/null +++ b/Runtime/Scripts/Models/EligibilityStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb95a37986ad54d139d16c3bc624e387 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Models/Product.cs b/Runtime/Scripts/Models/Product.cs index 23a66b5..0c67f16 100644 --- a/Runtime/Scripts/Models/Product.cs +++ b/Runtime/Scripts/Models/Product.cs @@ -77,9 +77,8 @@ public override string ToString() private QProductDuration FormatDuration(object duration) { - Int32 value = Convert.ToInt32(duration); - var result = QProductDuration.Unknown; - + int value = Convert.ToInt32(duration); + QProductDuration result; switch (value) { case 0: diff --git a/Runtime/Scripts/Qonversion.cs b/Runtime/Scripts/Qonversion.cs index 7aa4e19..514057f 100644 --- a/Runtime/Scripts/Qonversion.cs +++ b/Runtime/Scripts/Qonversion.cs @@ -9,6 +9,7 @@ public class Qonversion : MonoBehaviour public delegate void OnPermissionsReceived(Dictionary permissions, QonversionError error); public delegate void OnProductsReceived(Dictionary products, QonversionError error); public delegate void OnOfferingsReceived(Offerings offerings, QonversionError error); + public delegate void OnEligibilitiesReceived(Dictionary eligibilities, QonversionError error); private const string GameObjectName = "QonvesrionRuntimeGameObject"; private const string OnCheckPermissionsMethodName = "OnCheckPermissions"; @@ -17,6 +18,10 @@ public class Qonversion : MonoBehaviour private const string OnRestoreMethodName = "OnRestore"; private const string OnProductsMethodName = "OnProducts"; private const string OnOfferingsMethodName = "OnOfferings"; + private const string OnEligibilitiesMethodName = "OnEligibilities"; + + private const string SdkVersion = "2.1.2"; + private const string SdkSource = "unity"; private static IQonversionWrapper _Instance; @@ -48,6 +53,7 @@ private static IQonversionWrapper getFinalInstance() public static void Launch(string apiKey, bool observerMode) { IQonversionWrapper instance = getFinalInstance(); + instance.StoreSdkInfo(SdkVersion, Constants.VersionKey, SdkSource, Constants.SourceKey); instance.Launch(GameObjectName, apiKey, observerMode); } @@ -153,6 +159,17 @@ public static void Offerings(OnOfferingsReceived callback) instance.Offerings(OnOfferingsMethodName); } + private static OnEligibilitiesReceived EligibilitiesCallback { get; set; } + + public static void CheckTrialIntroEligibilityForProductIds(IList productIds, OnEligibilitiesReceived callback) + { + var productIdsJson = Json.Serialize(productIds); + + EligibilitiesCallback = callback; + IQonversionWrapper instance = getFinalInstance(); + instance.CheckTrialIntroEligibilityForProductIds(productIdsJson, OnEligibilitiesMethodName); + } + // Called from the native SDK - Called when permissions received from the checkPermissions() method private void OnCheckPermissions(string jsonString) { @@ -278,5 +295,26 @@ private void OnOfferings(string jsonString) OfferingsCallback = null; } + + // Called from the native SDK - Called when eligibilities received from the checkTrialIntroEligibilityForProductIds() method + private void OnEligibilities(string jsonString) + { + Debug.Log("OnEligibilities " + jsonString); + + if (EligibilitiesCallback == null) return; + + var error = Mapper.ErrorFromJson(jsonString); + if (error != null) + { + EligibilitiesCallback(null, error); + } + else + { + Dictionary eligibilities = Mapper.EligibilitiesFromJson(jsonString); + EligibilitiesCallback(eligibilities, null); + } + + EligibilitiesCallback = null; + } } } \ No newline at end of file diff --git a/Runtime/Scripts/QonversionWrapperNoop.cs b/Runtime/Scripts/QonversionWrapperNoop.cs index 074d5c0..18da6e4 100644 --- a/Runtime/Scripts/QonversionWrapperNoop.cs +++ b/Runtime/Scripts/QonversionWrapperNoop.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace QonversionUnity { internal class QonversionWrapperNoop : IQonversionWrapper @@ -57,6 +59,14 @@ public void Products(string callbackName) public void Offerings(string callbackName) { } + + public void StoreSdkInfo(string version, string versionKey, string source, string sourceKey) + { + } + + public void CheckTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName) + { + } } } \ No newline at end of file diff --git a/Runtime/iOS/Plugins/Common/UtilityBridge.h b/Runtime/iOS/Plugins/Common/UtilityBridge.h index 42651fa..e74af22 100644 --- a/Runtime/iOS/Plugins/Common/UtilityBridge.h +++ b/Runtime/iOS/Plugins/Common/UtilityBridge.h @@ -2,6 +2,7 @@ #import "Qonversion.h" #import #import +#import @interface UtilityBridge : NSObject @@ -13,6 +14,7 @@ + (NSArray *)convertPermissions:(NSArray *)permissions; + (NSArray *)convertProducts:(NSArray *)products; + (NSDictionary *)convertOfferings:(QNOfferings *)offerings; ++ (NSDictionary *)convertIntroEligibility:(NSDictionary *)introEligibilityInfo; + (NSDictionary *)convertError:(NSError *)error; + (void)sendUnityMessage:(NSObject *)objectToConvert toMethod:(NSString *)methodName diff --git a/Runtime/iOS/Plugins/Common/UtilityBridge.m b/Runtime/iOS/Plugins/Common/UtilityBridge.m index ce2e19a..5b51936 100644 --- a/Runtime/iOS/Plugins/Common/UtilityBridge.m +++ b/Runtime/iOS/Plugins/Common/UtilityBridge.m @@ -210,6 +210,27 @@ + (NSDictionary *)convertOffering:(QNOffering *)offering { return [result copy]; } ++ (NSDictionary *)convertIntroEligibility:(NSDictionary *)introEligibilityInfo { + NSDictionary *statuses = @{ + @(QNIntroEligibilityStatusNonIntroProduct): @"non_intro_or_trial_product", + @(QNIntroEligibilityStatusEligible): @"intro_or_trial_eligible", + @(QNIntroEligibilityStatusIneligible): @"intro_or_trial_ineligible" + }; + + NSMutableArray *convertedData = [NSMutableArray new]; + + for (NSString *key in introEligibilityInfo.allKeys) { + QNIntroEligibility *eligibility = introEligibilityInfo[key]; + NSString *statusValue = statuses[@(eligibility.status)] ? : @"unknonw"; + + NSDictionary *eligibilityInfo = @{@"productId": key, @"status": statusValue}; + + [convertedData addObject:eligibilityInfo]; + } + + return [convertedData copy]; +} + + (void)handlePermissionsResponse:(NSDictionary *) result withError:( NSError *)error toMethod:(NSString *) methodName unityListener:(const char *)unityListenerName{ diff --git a/Runtime/iOS/Plugins/QonversionBridge.m b/Runtime/iOS/Plugins/QonversionBridge.m index b18bfe6..36ca121 100644 --- a/Runtime/iOS/Plugins/QonversionBridge.m +++ b/Runtime/iOS/Plugins/QonversionBridge.m @@ -3,6 +3,17 @@ char* unityListenerName = nil; +void _storeSdkInfo(const char* version, const char* versionKey, const char* source, const char* sourceKey) +{ + NSString *versionStr = [UtilityBridge сonvertCStringToNSString:version]; + NSString *versionKeyStr = [UtilityBridge сonvertCStringToNSString:versionKey]; + NSString *sourceStr = [UtilityBridge сonvertCStringToNSString:source]; + NSString *sourceKeyStr = [UtilityBridge сonvertCStringToNSString:sourceKey]; + + [[NSUserDefaults standardUserDefaults] setValue:versionStr forKey:versionKeyStr]; + [[NSUserDefaults standardUserDefaults] setValue:sourceStr forKey:sourceKeyStr]; +} + void _setDebugMode() { [Qonversion setDebugMode]; } @@ -102,3 +113,28 @@ void _offerings(const char* unityCallbackName){ [UtilityBridge sendUnityMessage:offerings toMethod:callbackName unityListener: unityListenerName]; }]; } + +void _checkTrialIntroEligibilityForProductIds(const char* productIdsJson, const char* unityCallbackName){ + NSString *callbackName = [UtilityBridge сonvertCStringToNSString:unityCallbackName]; + NSString *productIdsJsonStr = [UtilityBridge сonvertCStringToNSString:productIdsJson]; + + NSError *error = nil; + NSData *data = [productIdsJsonStr dataUsingEncoding:NSUTF8StringEncoding]; + NSArray *products = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; + + if (error) { + NSLog(@"An error occurred while serializing data: %@", error.localizedDescription); + return; + } + if (products) { + [Qonversion checkTrialIntroEligibilityForProductIds:products completion:^(NSDictionary * _Nonnull result, NSError * _Nullable error) { + if (error) { + [UtilityBridge handleErrorResponse:error toMethod:callbackName unityListener:unityListenerName]; + return; + } + + NSDictionary *eligibilities = [UtilityBridge convertIntroEligibility:result]; + [UtilityBridge sendUnityMessage:eligibilities toMethod:callbackName unityListener: unityListenerName]; + }]; + } +} diff --git a/Runtime/iOS/QonversionWrapperIOS.cs b/Runtime/iOS/QonversionWrapperIOS.cs index 6a21ccf..05f72cf 100644 --- a/Runtime/iOS/QonversionWrapperIOS.cs +++ b/Runtime/iOS/QonversionWrapperIOS.cs @@ -2,7 +2,8 @@ using System.Runtime.InteropServices; #endif -using System; +using System; +using System.Collections.Generic; using UnityEngine; namespace QonversionUnity @@ -10,6 +11,9 @@ namespace QonversionUnity internal class QonversionWrapperIOS : IQonversionWrapper { #if UNITY_IOS + [DllImport("__Internal")] + private static extern void _storeSdkInfo(string version, string versionKey, string source, string sourceKey); + [DllImport("__Internal")] private static extern void _setDebugMode(); @@ -45,7 +49,17 @@ internal class QonversionWrapperIOS : IQonversionWrapper [DllImport("__Internal")] private static extern void _offerings(string callbackName); + + [DllImport("__Internal")] + private static extern void _checkTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName); +#endif + + public void StoreSdkInfo(string version, string versionKey, string source, string sourceKey) + { +#if UNITY_IOS + _storeSdkInfo(version, versionKey, source, sourceKey); #endif + } public void Launch(string gameObjectName, string projectKey, bool observerMode) { @@ -138,6 +152,13 @@ public void Offerings(string callbackName) { #if UNITY_IOS _offerings(callbackName); +#endif + } + + public void CheckTrialIntroEligibilityForProductIds(string productIdsJson, string callbackName) + { +#if UNITY_IOS + _checkTrialIntroEligibilityForProductIds(productIdsJson, callbackName); #endif } } From c63c4a9c72f3421d3c44e339396fe3374c30fda9 Mon Sep 17 00:00:00 2001 From: Surik Date: Mon, 3 May 2021 13:45:32 +0300 Subject: [PATCH 2/3] Bump native android version to 2.7.6 --- Editor/QonversionDependencies.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Editor/QonversionDependencies.xml b/Editor/QonversionDependencies.xml index 91b752e..2ad8c49 100644 --- a/Editor/QonversionDependencies.xml +++ b/Editor/QonversionDependencies.xml @@ -1,7 +1,7 @@ - + From d8264191bc2f76d6f43bd60ac3f5f81e4b95c637 Mon Sep 17 00:00:00 2001 From: Surik Date: Mon, 3 May 2021 13:46:00 +0300 Subject: [PATCH 3/3] Bump version to 2.1.3 --- Runtime/Scripts/Qonversion.cs | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Scripts/Qonversion.cs b/Runtime/Scripts/Qonversion.cs index 514057f..9595993 100644 --- a/Runtime/Scripts/Qonversion.cs +++ b/Runtime/Scripts/Qonversion.cs @@ -20,7 +20,7 @@ public class Qonversion : MonoBehaviour private const string OnOfferingsMethodName = "OnOfferings"; private const string OnEligibilitiesMethodName = "OnEligibilities"; - private const string SdkVersion = "2.1.2"; + private const string SdkVersion = "2.1.3"; private const string SdkSource = "unity"; private static IQonversionWrapper _Instance; diff --git a/package.json b/package.json index bd554f3..c11de80 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.qonversion.unity", "displayName": "Qonversion", - "version": "2.1.2", + "version": "2.1.3", "unity": "2018.3", "description": "Empower your mobile app marketing and product decisions with precise subscription data.", "author": {