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