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
 | |
| }
 |