437 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			437 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using UnityEngine; | |||
|  | using System; | |||
|  | using System.Collections; | |||
|  | using System.Collections.Generic; | |||
|  | using System.Runtime.InteropServices; | |||
|  | using AOT; | |||
|  | 
 | |||
|  | public class IosTenjin : BaseTenjin { | |||
|  | 
 | |||
|  | #if UNITY_IPHONE && !UNITY_EDITOR | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinInit(string apiKey); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinInitWithSharedSecret(string apiKey, string sharedSecret); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinInitWithAppSubversion(string apiKey, int appSubversion); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinInitWithSharedSecretAppSubversion(string apiKey, string sharedSecret, int appSubversion); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinConnect(); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinConnectWithDeferredDeeplink(string deferredDeeplink); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinOptIn(); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinOptOut(); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinOptInParams(String[] parameters, int size); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinOptOutParams(String[] parameters, int size); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinRegisterAppForAdNetworkAttribution(); | |||
|  | 	 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinUpdateConversionValue(int conversionValue); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinRequestTrackingAuthorizationWithCompletionHandler(); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinAppendAppSubversion(int subversion); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinSendEvent(string eventName); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinSendEventWithValue(string eventName, string eventValue); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinTransaction(string productId, string currencyCode, int quantity, double unitPrice); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  | 	private static extern void iosTenjinTransactionWithReceiptData(string productId, string currencyCode, int quantity, double unitPrice, string transactionId, string receipt); | |||
|  | 
 | |||
|  | 	[DllImport ("__Internal")] | |||
|  |  	private static extern void iosTenjinRegisterDeepLinkHandler(DeepLinkHandlerNativeDelegate deepLinkHandlerNativeDelegate); | |||
|  | 
 | |||
|  |     [DllImport ("__Internal")] | |||
|  |     private static extern void iosTenjinMopubImpressionFromJSON(string jsonString); | |||
|  | 
 | |||
|  |     [DllImport ("__Internal")] | |||
|  |     private static extern void iosTenjinSetDebugLogs(); | |||
|  | 
 | |||
|  |     [DllImport ("__Internal")] | |||
|  |     private static extern void iosTenjinSetWrapperVersion(string wrapperString); | |||
|  | 
 | |||
|  | 	private delegate void DeepLinkHandlerNativeDelegate(IntPtr deepLinkDataPairArray, int deepLinkDataPairCount); | |||
|  | 	 | |||
|  | 	private static readonly Stack<Dictionary<string, string>> deferredDeeplinkEvents = new Stack<Dictionary<string, string>>(); | |||
|  | 	private static Tenjin.DeferredDeeplinkDelegate registeredDeferredDeeplinkDelegate; | |||
|  | 
 | |||
|  | 	public override void Init(string apiKey){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  |             Debug.Log ("iOS Initializing - v"+this.SdkVersion); | |||
|  | 		} | |||
|  |         SetUnityVersionInNativeSDK(); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		iosTenjinInit (ApiKey); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void InitWithSharedSecret(string apiKey, string sharedSecret){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log("iOS Initializing with Shared Secret - v"+this.SdkVersion); | |||
|  | 		} | |||
|  |         SetUnityVersionInNativeSDK(); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		SharedSecret = sharedSecret; | |||
|  | 		iosTenjinInitWithSharedSecret (ApiKey, SharedSecret); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void InitWithAppSubversion(string apiKey, int appSubversion){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log("iOS Initializing with App Subversion: " + appSubversion + " v" +this.SdkVersion); | |||
|  | 		} | |||
|  |         SetUnityVersionInNativeSDK(); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		AppSubversion = appSubversion; | |||
|  | 		iosTenjinInitWithAppSubversion (ApiKey, AppSubversion); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void InitWithSharedSecretAppSubversion(string apiKey, string sharedSecret, int appSubversion){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log("iOS Initializing with Shared Secret + App Subversion: " + appSubversion +" v" +this.SdkVersion); | |||
|  | 		} | |||
|  |         SetUnityVersionInNativeSDK(); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		SharedSecret = sharedSecret; | |||
|  | 		AppSubversion = appSubversion; | |||
|  | 		iosTenjinInitWithSharedSecretAppSubversion (ApiKey, SharedSecret, AppSubversion); | |||
|  | 	} | |||
|  | 
 | |||
|  |     private void SetUnityVersionInNativeSDK() { | |||
|  | 		var unitySdkVersion = this.SdkVersion + "u"; | |||
|  | 
 | |||
|  | 	    iosTenjinSetWrapperVersion(unitySdkVersion); | |||
|  |     } | |||
|  | 
 | |||
|  | 	public override void Connect(){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS Connecting"); | |||
|  | 		} | |||
|  | 		iosTenjinConnect(); | |||
|  | 	} | |||
|  | 	 | |||
|  | 	public override void Connect(string deferredDeeplink){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS Connecting with deferredDeeplink " + deferredDeeplink); | |||
|  | 		} | |||
|  | 		iosTenjinConnectWithDeferredDeeplink (deferredDeeplink); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptIn(){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS OptIn"); | |||
|  | 		} | |||
|  | 		iosTenjinOptIn (); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptOut(){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS OptOut"); | |||
|  | 		} | |||
|  | 		iosTenjinOptOut (); | |||
|  | 	} | |||
|  |      | |||
|  | 	public override void OptInParams(List<string> parameters){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS OptInParams" + parameters.ToString()); | |||
|  | 		} | |||
|  | 		iosTenjinOptInParams (parameters.ToArray(), parameters.Count); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptOutParams(List<string> parameters){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS OptOutParams" + parameters.ToString()); | |||
|  | 		} | |||
|  | 		iosTenjinOptOutParams (parameters.ToArray(), parameters.Count); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void RegisterAppForAdNetworkAttribution(){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS RegisterAppForAdNetworkAttribution"); | |||
|  | 		} | |||
|  | 		iosTenjinRegisterAppForAdNetworkAttribution (); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void UpdateConversionValue(int conversionValue){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS UpdateConversionValue"); | |||
|  | 		} | |||
|  | 		iosTenjinUpdateConversionValue (conversionValue); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void RequestTrackingAuthorizationWithCompletionHandler(Action<int> trackingAuthorizationCallback){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS RequestTrackingAuthorizationWithCompletionHandler"); | |||
|  | 		} | |||
|  | 		Tenjin.authorizationStatusDelegate = trackingAuthorizationCallback; | |||
|  | 		iosTenjinRequestTrackingAuthorizationWithCompletionHandler(); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	private void SetTrackingAuthorizationStatus(string status){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS SetTrackingAuthorizationStatus " + status); | |||
|  | 		} | |||
|  | 		Tenjin.authorizationStatusDelegate(Int16.Parse(status)); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void AppendAppSubversion(int appSubversion){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS AppendAppSubversion " + appSubversion); | |||
|  | 		} | |||
|  | 		iosTenjinAppendAppSubversion (appSubversion); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void SendEvent(string eventName){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS Sending Event " + eventName); | |||
|  | 		} | |||
|  | 		iosTenjinSendEvent(eventName); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void SendEvent(string eventName, string eventValue){ | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("iOS Sending Event " + eventName + " : " + eventValue); | |||
|  | 		} | |||
|  | 		iosTenjinSendEventWithValue(eventName, eventValue); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void Transaction(string productId, string currencyCode, int quantity, double unitPrice, string transactionId, string receipt, string signature){ | |||
|  | 		signature = null; | |||
|  | 
 | |||
|  | 		//only if the receipt and transaction_id are not null, then try to validate the transaction. Otherwise manually record the transaction | |||
|  | 		if(receipt != null && transactionId != null){ | |||
|  | 			if (Debug.isDebugBuild) { | |||
|  | 				Debug.Log ("iOS Transaction with receipt " + productId + ", " + currencyCode + ", " + quantity + ", " + unitPrice + ", " + transactionId + ", " + receipt); | |||
|  | 			} | |||
|  | 			iosTenjinTransactionWithReceiptData(productId, currencyCode, quantity, unitPrice, transactionId, receipt); | |||
|  | 		} | |||
|  | 		else{ | |||
|  | 			if (Debug.isDebugBuild) { | |||
|  | 				Debug.Log ("iOS Transaction " + productId + ", " + currencyCode + ", " + quantity + ", " + unitPrice); | |||
|  | 			} | |||
|  | 			iosTenjinTransaction(productId, currencyCode, quantity, unitPrice); | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void SetAppStoreType(AppStoreType appStoreType) { | |||
|  | 	} | |||
|  | 
 | |||
|  |     public override void SubscribeMoPubImpressions(){ | |||
|  |         TenjinMopubIntegration.ListenForImpressions(ILARHandler); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void ILARHandler(string json){ | |||
|  |         if(!string.IsNullOrEmpty(json)) | |||
|  |         { | |||
|  |             iosTenjinMopubImpressionFromJSON(json); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 	public override void GetDeeplink(Tenjin.DeferredDeeplinkDelegate deferredDeeplinkDelegate) { | |||
|  | 		if (Debug.isDebugBuild) { | |||
|  | 			Debug.Log ("Sending IosTenjin::GetDeeplink"); | |||
|  | 		} | |||
|  | 		registeredDeferredDeeplinkDelegate = deferredDeeplinkDelegate; | |||
|  | 		iosTenjinRegisterDeepLinkHandler(DeepLinkHandler); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void DebugLogs() { | |||
|  | 		iosTenjinSetDebugLogs(); | |||
|  |     } | |||
|  | 
 | |||
|  | 	private void Update() { | |||
|  | 		lock (deferredDeeplinkEvents) { | |||
|  | 			while (deferredDeeplinkEvents.Count > 0) { | |||
|  | 				Dictionary<string, string> deepLinkData = deferredDeeplinkEvents.Pop(); | |||
|  | 				if (registeredDeferredDeeplinkDelegate != null) { | |||
|  | 					registeredDeferredDeeplinkDelegate(deepLinkData); | |||
|  | 				} | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	[MonoPInvokeCallback(typeof(DeepLinkHandlerNativeDelegate))] | |||
|  | 	private static void DeepLinkHandler(IntPtr deepLinkDataPairArray, int deepLinkDataPairCount) { | |||
|  | 		if (deepLinkDataPairArray == IntPtr.Zero) | |||
|  | 			return; | |||
|  | 
 | |||
|  | 		Dictionary<string, string> deepLinkData =  | |||
|  | 			NativeUtility.MarshalStringStringDictionary(deepLinkDataPairArray, deepLinkDataPairCount); | |||
|  | 
 | |||
|  | 		lock (deferredDeeplinkEvents) { | |||
|  | 			deferredDeeplinkEvents.Push(deepLinkData); | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	private static class NativeUtility { | |||
|  | 		/// <summary> | |||
|  | 		/// Marshals a native linear array of structs to the managed array. | |||
|  | 		/// </summary> | |||
|  | 		public static T[] MarshalNativeStructArray<T>(IntPtr nativeArrayPtr, int nativeArraySize) where T : struct { | |||
|  | 			if (nativeArrayPtr == IntPtr.Zero) | |||
|  | 				throw new ArgumentNullException("nativeArrayPtr"); | |||
|  | 
 | |||
|  | 			if (nativeArraySize < 0) | |||
|  | 				throw new ArgumentOutOfRangeException("nativeArraySize"); | |||
|  | 
 | |||
|  | 			T[] managedArray = new T[nativeArraySize]; | |||
|  | 			IntPtr currentNativeArrayPtr = nativeArrayPtr; | |||
|  | 			int structSize = Marshal.SizeOf(typeof(T)); | |||
|  | 			for (int i = 0; i < nativeArraySize; i++) { | |||
|  | 				T marshaledStruct = (T) Marshal.PtrToStructure(currentNativeArrayPtr, typeof(T)); | |||
|  | 				managedArray[i] = marshaledStruct; | |||
|  | 				currentNativeArrayPtr = (IntPtr) (currentNativeArrayPtr.ToInt64() + structSize); | |||
|  | 			} | |||
|  | 
 | |||
|  | 			return managedArray; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		/// <summary> | |||
|  | 		/// Marshals the native representation to a IDictionary<string, string>. | |||
|  | 		/// </summary> | |||
|  | 		public static Dictionary<string, string> MarshalStringStringDictionary(IntPtr nativePairArrayPtr, int nativePairArraySize) { | |||
|  | 			if (nativePairArrayPtr == IntPtr.Zero) | |||
|  | 				throw new ArgumentNullException("nativePairArrayPtr"); | |||
|  | 
 | |||
|  | 			if (nativePairArraySize < 0) | |||
|  | 				throw new ArgumentOutOfRangeException("nativePairArraySize"); | |||
|  | 
 | |||
|  | 			Dictionary<string, string> dictionary = new Dictionary<string, string>(nativePairArraySize); | |||
|  | 			StringStringKeyValuePair[] pairs = MarshalNativeStructArray<StringStringKeyValuePair>(nativePairArrayPtr, nativePairArraySize); | |||
|  | 			foreach (StringStringKeyValuePair pair in pairs) { | |||
|  | 				dictionary.Add(pair.Key, pair.Value); | |||
|  | 			} | |||
|  | 			return dictionary; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		[StructLayout(LayoutKind.Sequential)] | |||
|  | 		public struct StringStringKeyValuePair { | |||
|  | 			public string Key; | |||
|  | 			public string Value; | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | #else | |||
|  | 	public override void Init(string apiKey){ | |||
|  | 		Debug.Log ("iOS Initializing - v"+this.SdkVersion); | |||
|  | 		ApiKey = apiKey; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void InitWithSharedSecret(string apiKey, string sharedSecret){ | |||
|  | 		Debug.Log("iOS Initializing with Shared Secret - v"+this.SdkVersion); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		SharedSecret = sharedSecret; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void InitWithAppSubversion(string apiKey, int appSubversion) | |||
|  | 	{ | |||
|  | 		Debug.Log("iOS Initializing with App Subversion: " + appSubversion + " v" +this.SdkVersion); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		AppSubversion = appSubversion; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void InitWithSharedSecretAppSubversion(string apiKey, string sharedSecret, int appSubversion) | |||
|  | 	{ | |||
|  | 		Debug.Log("iOS Initializing with Shared Secret + App Subversion: " + appSubversion +" v" +this.SdkVersion); | |||
|  | 		ApiKey = apiKey; | |||
|  | 		SharedSecret = sharedSecret; | |||
|  | 		AppSubversion = appSubversion; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void Connect(){ | |||
|  | 		Debug.Log ("iOS Connecting"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void Connect(string deferredDeeplink){ | |||
|  | 		Debug.Log ("Connecting with deferredDeeplink " + deferredDeeplink); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void SendEvent(string eventName){ | |||
|  | 		Debug.Log ("iOS Sending Event " + eventName); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void SendEvent(string eventName, string eventValue){ | |||
|  | 		Debug.Log ("iOS Sending Event " + eventName + " : " + eventValue); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void Transaction(string productId, string currencyCode, int quantity, double unitPrice, string transactionId, string receipt, string signature){ | |||
|  | 		Debug.Log ("iOS Transaction " + productId + ", " + currencyCode + ", " + quantity + ", " + unitPrice + ", " + transactionId + ", " + receipt + ", " + signature); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void GetDeeplink(Tenjin.DeferredDeeplinkDelegate deferredDeeplinkDelegate) { | |||
|  | 		Debug.Log ("Sending IosTenjin::GetDeeplink"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptIn(){ | |||
|  | 		Debug.Log ("iOS OptIn"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptOut(){ | |||
|  | 		Debug.Log ("iOS OptOut"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptInParams(List<string> parameters){ | |||
|  | 		Debug.Log ("iOS OptInParams"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void OptOutParams(List<string> parameters){ | |||
|  | 		Debug.Log ("iOS OptOutParams"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void RegisterAppForAdNetworkAttribution() | |||
|  | 	{ | |||
|  | 		Debug.Log("iOS RegisterAppForAdNetworkAttribution"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void UpdateConversionValue(int conversionValue) | |||
|  | 	{ | |||
|  | 		Debug.Log("iOS UpdateConversionValue: " + conversionValue); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void RequestTrackingAuthorizationWithCompletionHandler(Action<int> trackingAuthorizationCallback) | |||
|  |     { | |||
|  | 		Debug.Log("iOS RequestTrackingAuthorizationWithCompletionHandler"); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	public override void AppendAppSubversion(int subversion){ | |||
|  | 		Debug.Log("iOS AppendAppSubversion"); | |||
|  | 	} | |||
|  | 	 | |||
|  | 	public override void DebugLogs(){ | |||
|  | 		Debug.Log ("Setting debug logs "); | |||
|  | 	} | |||
|  | 	 | |||
|  |     public override void SubscribeMoPubImpressions() | |||
|  |     { | |||
|  |         Debug.Log("iOS SubscribeMoPubImpressions"); | |||
|  |     } | |||
|  | 
 | |||
|  | 	public override void SetAppStoreType(AppStoreType appStoreType) { | |||
|  | 		Debug.Log("iOS SetAppStoreType"); | |||
|  | 	} | |||
|  | #endif | |||
|  | } |