diff --git a/SingularSDK/Editor/Dependencies.xml b/SingularSDK/Editor/Dependencies.xml
index bc92f23..d162655 100644
--- a/SingularSDK/Editor/Dependencies.xml
+++ b/SingularSDK/Editor/Dependencies.xml
@@ -1,6 +1,6 @@
-
+
https://maven.singular.net
@@ -10,7 +10,7 @@
-
+
diff --git a/SingularSDK/Plugins/Android/SingularUnityBridge.jar b/SingularSDK/Plugins/Android/SingularUnityBridge.jar
index 6f131be..df71aaa 100644
Binary files a/SingularSDK/Plugins/Android/SingularUnityBridge.jar and b/SingularSDK/Plugins/Android/SingularUnityBridge.jar differ
diff --git a/SingularSDK/Plugins/iOS/SingularAppDelegate.m.meta b/SingularSDK/Plugins/iOS/SingularAppDelegate.m.meta
index 3e567b8..9a68c0d 100644
--- a/SingularSDK/Plugins/iOS/SingularAppDelegate.m.meta
+++ b/SingularSDK/Plugins/iOS/SingularAppDelegate.m.meta
@@ -11,6 +11,20 @@ PluginImporter:
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude WebGL: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
- first:
Any:
second:
@@ -30,7 +44,7 @@ PluginImporter:
- first:
tvOS: tvOS
second:
- enabled: 1
+ enabled: 0
settings: {}
userData:
assetBundleName:
diff --git a/SingularSDK/Plugins/iOS/SingularStateWrapper.h.meta b/SingularSDK/Plugins/iOS/SingularStateWrapper.h.meta
index 1e4d861..f8d7b86 100644
--- a/SingularSDK/Plugins/iOS/SingularStateWrapper.h.meta
+++ b/SingularSDK/Plugins/iOS/SingularStateWrapper.h.meta
@@ -20,9 +20,11 @@ PluginImporter:
Exclude Editor: 1
Exclude Linux64: 1
Exclude OSXUniversal: 1
+ Exclude WebGL: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 0
+ Exclude tvOS: 1
- first:
Android: Android
second:
diff --git a/SingularSDK/Plugins/iOS/SingularStateWrapper.m.meta b/SingularSDK/Plugins/iOS/SingularStateWrapper.m.meta
index ca51dfb..510e9b2 100644
--- a/SingularSDK/Plugins/iOS/SingularStateWrapper.m.meta
+++ b/SingularSDK/Plugins/iOS/SingularStateWrapper.m.meta
@@ -11,6 +11,20 @@ PluginImporter:
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude WebGL: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
- first:
Any:
second:
@@ -30,7 +44,7 @@ PluginImporter:
- first:
tvOS: tvOS
second:
- enabled: 1
+ enabled: 0
settings: {}
userData:
assetBundleName:
diff --git a/SingularSDK/Plugins/iOS/SingularSwizzledAppController.m.meta b/SingularSDK/Plugins/iOS/SingularSwizzledAppController.m.meta
index 71a1523..71ec8e7 100644
--- a/SingularSDK/Plugins/iOS/SingularSwizzledAppController.m.meta
+++ b/SingularSDK/Plugins/iOS/SingularSwizzledAppController.m.meta
@@ -11,6 +11,20 @@ PluginImporter:
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude WebGL: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
- first:
Any:
second:
@@ -30,7 +44,7 @@ PluginImporter:
- first:
tvOS: tvOS
second:
- enabled: 1
+ enabled: 0
settings: {}
userData:
assetBundleName:
diff --git a/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm b/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm
index 216bb64..d5e8339 100644
--- a/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm
+++ b/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm
@@ -404,22 +404,45 @@ int SetDeferredDeepLinkTimeout_(int duration){
}
// Revenue methods
- void Revenue_(const char* currency, double amount){
+ void Revenue_(const char* currency, double amount) {
[Singular revenue:[NSString stringWithUTF8String:currency] amount:amount];
}
- void CustomRevenue_(const char* eventName, const char* currency, double amount){
+ void CustomRevenue_(const char* eventName, const char* currency, double amount) {
[Singular customRevenue:[NSString stringWithUTF8String:eventName] currency:[NSString stringWithUTF8String:currency] amount:amount];
}
- void RevenueWithAllParams_(const char* currency, double amount, const char* productSKU, const char* productName, const char* productCategory, int productQuantity, double productPrice){
+ void RevenueWithAllParams_(const char* currency, double amount, const char* productSKU, const char* productName, const char* productCategory, int productQuantity, double productPrice) {
[Singular revenue:[NSString stringWithUTF8String:currency] amount:amount productSKU:[NSString stringWithUTF8String:productSKU] productName:[NSString stringWithUTF8String:productName] productCategory:[NSString stringWithUTF8String:productCategory] productQuantity:productQuantity productPrice:productPrice];
}
- void CustomRevenueWithAllParams_(const char* eventName, const char* currency, double amount, const char* productSKU, const char* productName, const char* productCategory, int productQuantity, double productPrice){
+ void CustomRevenueWithAllParams_(const char* eventName, const char* currency, double amount, const char* productSKU, const char* productName, const char* productCategory, int productQuantity, double productPrice) {
[Singular customRevenue:[NSString stringWithUTF8String:eventName] currency:[NSString stringWithUTF8String:currency] amount:amount productSKU:[NSString stringWithUTF8String:productSKU] productName:[NSString stringWithUTF8String:productName] productCategory:[NSString stringWithUTF8String:productCategory] productQuantity:productQuantity productPrice:productPrice];
}
-
+
+ void RevenueWithAttributes_(const char* currency, double amount, const char* attributesAsJson) {
+ NSError *error;
+ NSDictionary* attributesDictionary = [NSJSONSerialization JSONObjectWithData:[[NSString stringWithUTF8String:attributesAsJson]
+ dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
+ if (!error) {
+ [Singular revenue:[NSString stringWithUTF8String:currency]
+ amount:amount
+ withAttributes:attributesDictionary];
+ }
+ }
+
+ void CustomRevenueWithAttributes_(const char* eventName, const char* currency, double amount, const char* attributesAsJson) {
+ NSError *error;
+ NSDictionary* attributesDictionary = [NSJSONSerialization JSONObjectWithData:[[NSString stringWithUTF8String:attributesAsJson]
+ dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
+ if (!error) {
+ [Singular customRevenue:[NSString stringWithUTF8String:eventName]
+ currency:[NSString stringWithUTF8String:currency]
+ amount:amount
+ withAttributes:attributesDictionary];
+ }
+ }
+
// Custom user id
void SetCustomUserId_(const char* customUserId){
[Singular setCustomUserId:[NSString stringWithUTF8String:customUserId]];
diff --git a/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm.meta b/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm.meta
index da62e61..6257585 100644
--- a/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm.meta
+++ b/SingularSDK/Plugins/iOS/SingularUnityWrapper.mm.meta
@@ -11,6 +11,20 @@ PluginImporter:
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude WebGL: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ Exclude tvOS: 1
- first:
Any:
second:
@@ -30,7 +44,7 @@ PluginImporter:
- first:
tvOS: tvOS
second:
- enabled: 1
+ enabled: 0
settings: {}
userData:
assetBundleName:
diff --git a/SingularSDK/Runtime/SingularSDK.asmdef b/SingularSDK/Runtime/SingularSDK.asmdef
index 1b0d872..a0769b4 100644
--- a/SingularSDK/Runtime/SingularSDK.asmdef
+++ b/SingularSDK/Runtime/SingularSDK.asmdef
@@ -1,6 +1,9 @@
{
"name": "SingularSDK",
- "references": [],
+ "rootNamespace": "",
+ "references": [
+ "UnityEngine.Purchasing"
+ ],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
diff --git a/SingularSDK/Runtime/SingularSDK.cs b/SingularSDK/Runtime/SingularSDK.cs
index 7ded107..94bb734 100644
--- a/SingularSDK/Runtime/SingularSDK.cs
+++ b/SingularSDK/Runtime/SingularSDK.cs
@@ -3,11 +3,10 @@
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
using Newtonsoft.Json;
using UnityEngine;
-#if UNITY_5_3_OR_NEWER && UNITY_PURCHASING
using UnityEngine.Purchasing;
-#endif
namespace Singular
{
@@ -26,7 +25,7 @@ public class SingularSDK : MonoBehaviour
private static bool Initialized = false;
private const string UNITY_WRAPPER_NAME = "Unity";
- private const string UNITY_VERSION = "5.1.1";
+ private const string UNITY_VERSION = "5.1.3";
// ios-only:
[Obsolete]
@@ -150,8 +149,7 @@ public static void InitializeSingularSDK()
#endif
Initialized = true;
}
-
-
+
public static void createReferrerShortLink(string baseLink, string referrerName, string referrerId,
Dictionary passthroughParams, ShortLinkCallback completionHandler)
{
@@ -236,8 +234,8 @@ private static void InitAndroidJavaClasses() {
private static AndroidJavaObject JavaArrayFromCS(string[] values) {
AndroidJavaClass arrayClass = new AndroidJavaClass("java.lang.reflect.Array");
- AndroidJavaObject arrayObject =
- arrayClass.CallStatic("newInstance", new AndroidJavaClass("java.lang.String"), values.Length);
+ AndroidJavaObject arrayObject = arrayClass.CallStatic("newInstance", new AndroidJavaClass("java.lang.String"), values.Length);
+
for (int i = 0; i < values.Length; ++i) {
arrayClass.CallStatic("set", arrayObject, i, new AndroidJavaObject("java.lang.String", values[i]));
}
@@ -320,7 +318,15 @@ private enum NSType
private static extern void CustomRevenue_(string eventName, string currency, double amount);
[DllImport("__Internal")]
- private static extern void RevenueWithAllParams_(string currency, double amount, string productSKU, string productName, string productCategory, int productQuantity, double productPrice);[DllImport("__Internal")] private static extern void CustomRevenueWithAllParams_(string eventName, string currency, double amount, string productSKU, string productName, string productCategory, int productQuantity, double productPrice);
+ private static extern void RevenueWithAllParams_(string currency, double amount, string productSKU, string productName, string productCategory, int productQuantity, double productPrice);
+ [DllImport("__Internal")]
+ private static extern void CustomRevenueWithAllParams_(string eventName, string currency, double amount, string productSKU, string productName, string productCategory, int productQuantity, double productPrice);
+
+ [DllImport("__Internal")]
+ private static extern void RevenueWithAttributes_(string currency, double amount, string attributesJson);
+
+ [DllImport("__Internal")]
+ private static extern void CustomRevenueWithAttributes_(string eventName, string currency, double amount, string attributesJson);
// Auxiliary functions;
[DllImport("__Internal")]
@@ -719,9 +725,7 @@ public static void Event(Dictionary args, string name)
Free_NSDictionary();
Free_NSMasterArray();
#elif UNITY_ANDROID
- AndroidJavaObject json =
- new AndroidJavaObject("org.json.JSONObject", JsonConvert.SerializeObject(args, Formatting.None));
-
+ AndroidJavaObject json = new AndroidJavaObject("org.json.JSONObject", JsonConvert.SerializeObject(args, Formatting.None));
if (singular != null) {
status = singular.CallStatic("eventJSON", name, json);
}
@@ -1136,9 +1140,9 @@ private void SingularSdidReceived(string result)
}
#endregion // end sdid
-
-#if UNITY_5_3_OR_NEWER && UNITY_PURCHASING
+#region IAP
+
public static void InAppPurchase(IEnumerable products, Dictionary attributes, bool isRestored
= false) {
InAppPurchase("__iap__", products, attributes, isRestored);
@@ -1285,7 +1289,13 @@ private static Dictionary BuildAndroidPurchaseAttributes(Product
}
#endif
-#endif
+ #endregion // end region IAP
+
+ #region Revenue
+
+ private const string androidNativeMethodName_Revenue = "revenue";
+ private const string androidNativeMethodName_CustomRevenue = "customRevenue";
+
public static void Revenue(string currency, double amount)
{
if (Application.isEditor)
@@ -1296,7 +1306,8 @@ public static void Revenue(string currency, double amount)
Revenue_(currency, amount);
#elif UNITY_ANDROID
if (singular != null) {
- singular.CallStatic("revenue", currency, amount);
+ singular.CallStatic(androidNativeMethodName_Revenue,
+ currency, amount);
}
#endif
}
@@ -1311,7 +1322,8 @@ public static void CustomRevenue(string eventName, string currency, double amoun
CustomRevenue_(eventName, currency, amount);
#elif UNITY_ANDROID
if (singular != null) {
- singular.CallStatic("customRevenue", eventName, currency, amount);
+ singular.CallStatic(androidNativeMethodName_CustomRevenue,
+ eventName, currency, amount);
}
#endif
}
@@ -1324,7 +1336,8 @@ public static void Revenue(string currency, double amount, string receipt, strin
}
#if UNITY_ANDROID
if (singular != null) {
- singular.CallStatic("revenue", currency, amount, receipt, signature);
+ singular.CallStatic(androidNativeMethodName_Revenue,
+ currency, amount, receipt, signature);
}
#endif
}
@@ -1338,7 +1351,8 @@ public static void CustomRevenue(string eventName, string currency, double amoun
}
#if UNITY_ANDROID
if (singular != null) {
- singular.CallStatic("customRevenue", eventName, currency, amount, receipt, signature);
+ singular.CallStatic(androidNativeMethodName_CustomRevenue,
+ eventName, currency, amount, receipt, signature);
}
#endif
}
@@ -1353,10 +1367,10 @@ public static void Revenue(string currency, double amount, string productSKU, st
#if UNITY_IOS
RevenueWithAllParams_(currency, amount, productSKU, productName, productCategory, productQuantity, productPrice);
-
#elif UNITY_ANDROID
if (singular != null) {
- singular.CallStatic("revenue", currency, amount, productSKU, productName, productCategory, productQuantity, productPrice);
+ singular.CallStatic(androidNativeMethodName_Revenue,
+ currency, amount, productSKU, productName, productCategory, productQuantity, productPrice);
}
#endif
}
@@ -1370,13 +1384,66 @@ public static void CustomRevenue(string eventName, string currency, double amoun
}
#if UNITY_IOS
CustomRevenueWithAllParams_(eventName, currency, amount, productSKU, productName, productCategory, productQuantity, productPrice);
-
#elif UNITY_ANDROID
if (singular != null) {
- singular.CallStatic("customRevenue", eventName, currency, amount, productSKU, productName, productCategory, productQuantity, productPrice);
+ singular.CallStatic(androidNativeMethodName_CustomRevenue,
+ eventName, currency, amount, productSKU, productName, productCategory, productQuantity, productPrice);
}
#endif
}
+
+ public static void Revenue(string currency, double amount, Dictionary attributes)
+ {
+ if (Application.isEditor)
+ {
+ return;
+ }
+
+ try
+ {
+ string attributesAsJsonString = JsonConvert.SerializeObject(attributes);
+ #if UNITY_IOS
+ RevenueWithAttributes_(currency, amount, attributesAsJsonString);
+ #elif UNITY_ANDROID
+ if (jniSingularUnityBridge != null)
+ {
+ jniSingularUnityBridge.CallStatic("revenueWithAttributes", currency, amount.ToString(), attributesAsJsonString);
+ }
+ #endif
+ }
+ catch (Exception)
+ {
+
+ }
+
+ }
+
+ public static void CustomRevenue(string eventName, string currency, double amount, Dictionary attributes)
+ {
+ if (Application.isEditor)
+ {
+ return;
+ }
+
+ try
+ {
+ string attributesAsJsonString = JsonConvert.SerializeObject(attributes);
+ #if UNITY_IOS
+ CustomRevenueWithAttributes_(eventName, currency, amount, attributesAsJsonString);
+ #elif UNITY_ANDROID
+ if (jniSingularUnityBridge != null)
+ {
+ jniSingularUnityBridge.CallStatic("customRevenueWithAttributes", eventName, currency, amount.ToString(), attributesAsJsonString);
+ }
+ #endif
+ }
+ catch (Exception)
+ {
+
+ }
+ }
+
+ #endregion // end region Revenue
public static void RegisterTokenForUninstall(String token)
{
diff --git a/package.json b/package.json
index de96175..df705a4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "singular-unity-package",
- "version": "5.1.1",
+ "version": "5.1.3",
"displayName": "Singular",
"description": "Singular Unity Package",
"type": "library",
@@ -12,6 +12,7 @@
},
"unity": "2019.4",
"dependencies": {
- "com.unity.nuget.newtonsoft-json": "3.2.1"
+ "com.unity.nuget.newtonsoft-json": "3.2.1",
+ "com.unity.purchasing": "2.0.6"
}
}
\ No newline at end of file