adjust归因
This commit is contained in:
parent
8a11506a78
commit
9e1dd78d95
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<application>
|
||||||
|
<activity android:name="com.unity3d.player.UnityPlayerActivity"
|
||||||
|
android:theme="@style/UnityThemeSelector">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
|
||||||
|
</manifest>
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 147d3bb1ca0da2b448667eec3a82bb26
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -833,6 +833,8 @@ GameObject:
|
||||||
- component: {fileID: 2137923634}
|
- component: {fileID: 2137923634}
|
||||||
- component: {fileID: 2137923635}
|
- component: {fileID: 2137923635}
|
||||||
- component: {fileID: 2137923636}
|
- component: {fileID: 2137923636}
|
||||||
|
- component: {fileID: 2137923637}
|
||||||
|
- component: {fileID: 2137923638}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: '[SDKManager]'
|
m_Name: '[SDKManager]'
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
|
|
@ -880,6 +882,30 @@ MonoBehaviour:
|
||||||
m_Script: {fileID: 11500000, guid: a550f9677d329f940876ee3d139f8289, type: 3}
|
m_Script: {fileID: 11500000, guid: a550f9677d329f940876ee3d139f8289, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!114 &2137923637
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2137923633}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 5019ae7cf0c6d3d4c89b8921e4beab15, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!114 &2137923638
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2137923633}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: f925ec84be5d37d4ba2ee62fc7ffb464, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
--- !u!1660057539 &9223372036854775807
|
--- !u!1660057539 &9223372036854775807
|
||||||
SceneRoots:
|
SceneRoots:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7612045c73134949a914f701ff109389
|
||||||
|
timeCreated: 1756549078
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using AdjustSdk;
|
||||||
|
using Unity.VisualScripting;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class AdjustManager : MonoBehaviour
|
||||||
|
{
|
||||||
|
private string appToken = "你的App Token"; // 替换为你的实际App Token
|
||||||
|
private AdjustEnvironment environment = AdjustEnvironment.Sandbox; // 测试用Sandbox,发布用Production
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void Awake()
|
||||||
|
{
|
||||||
|
AdjustConfig config = new AdjustConfig(appToken, environment);
|
||||||
|
|
||||||
|
// 设置归因变更回调函数
|
||||||
|
config.AttributionChangedDelegate = AttributionChangedDelegate;
|
||||||
|
|
||||||
|
// (可选)设置其他配置,如日志级别
|
||||||
|
config.LogLevel = AdjustLogLevel.Verbose;
|
||||||
|
|
||||||
|
// 初始化Adjust SDK
|
||||||
|
Adjust.InitSdk(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 归因信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="attribution"></param>
|
||||||
|
private void AttributionChangedDelegate(AdjustAttribution attribution)
|
||||||
|
{
|
||||||
|
Debug.Log("Attribution changed");
|
||||||
|
AdjustNetwork.SetNetwork(attribution.Network);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f925ec84be5d37d4ba2ee62fc7ffb464
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public static class AdjustNetwork
|
||||||
|
{
|
||||||
|
private const string KEY_USER_NETWORK = "KEY_USER_NETWORK";
|
||||||
|
|
||||||
|
public static void SetNetwork(string network)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(network))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (network.ToLower().Replace(" ", "") == "Organic".ToLower().Replace(" ", ""))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string curNetwork = PlayerPrefs.GetString(KEY_USER_NETWORK, "");
|
||||||
|
if (string.IsNullOrEmpty(curNetwork))
|
||||||
|
{
|
||||||
|
PlayerPrefs.SetString(KEY_USER_NETWORK, network);
|
||||||
|
PlayerPrefs.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否是自然量用户
|
||||||
|
/// 默认买量用户
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool InOrganic()
|
||||||
|
{
|
||||||
|
string network = PlayerPrefs.GetString(KEY_USER_NETWORK, "");
|
||||||
|
if (string.IsNullOrEmpty(network))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//去除大小写和空格之后再对比
|
||||||
|
if (network.ToLower().Replace(" ", "") == "Untrusted Devices".ToLower().Replace(" ", "") || network.ToLower().Replace(" ", "") == "Google Organic Search".ToLower().Replace(" ", ""))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9292edbac2294418af38b6f95a185127
|
||||||
|
timeCreated: 1756550070
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b7941c48bfc3e44aea0300ced4d12b47
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 48d8fb88fe43540d48dd33b18a151507
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 99903aebed26d46a2aa9f9aa2b17a339
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.unity3d.player"
|
||||||
|
android:installLocation="preferExternal"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<supports-screens
|
||||||
|
android:smallScreens="true"
|
||||||
|
android:normalScreens="true"
|
||||||
|
android:largeScreens="true"
|
||||||
|
android:xlargeScreens="true"
|
||||||
|
android:anyDensity="true"/>
|
||||||
|
|
||||||
|
<!-- Permissions needed by the Adjust SDK. -->
|
||||||
|
<!-- For more information, check: https://github.com/adjust/unity_sdk#post-build-android -->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE" />
|
||||||
|
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
|
||||||
|
|
||||||
|
<queries>
|
||||||
|
<package android:name="com.facebook.katana" />
|
||||||
|
</queries>
|
||||||
|
<queries>
|
||||||
|
<package android:name="com.instagram.android" />
|
||||||
|
</queries>
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:theme="@style/UnityThemeSelector"
|
||||||
|
android:icon="@drawable/app_icon"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:debuggable="true">
|
||||||
|
|
||||||
|
<!-- Adjust broadcast receiver used to capture referrer content from INSTALL_REFERRER intent. -->
|
||||||
|
<receiver
|
||||||
|
android:name="com.adjust.sdk.AdjustReferrerReceiver"
|
||||||
|
android:permission="android.permission.INSTALL_PACKAGES"
|
||||||
|
android:exported="true" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.android.vending.INSTALL_REFERRER" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="com.unity3d.player.UnityPlayerActivity"
|
||||||
|
android:label="@string/app_name">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a13ef442648c346a79f9ff24875c037a
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c11a8a7fc7bfd4937bac95b31f1fb273
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<dependencies>
|
||||||
|
<androidPackages>
|
||||||
|
<androidPackage spec="com.adjust.sdk:adjust-android:5.4.2">
|
||||||
|
</androidPackage>
|
||||||
|
<androidPackage spec="com.android.installreferrer:installreferrer:2.2">
|
||||||
|
</androidPackage>
|
||||||
|
</androidPackages>
|
||||||
|
<iosPods>
|
||||||
|
<iosPod name="Adjust" version="5.4.3" minTargetSdk="12.0"/>
|
||||||
|
</iosPods>
|
||||||
|
</dependencies>
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d4241857b233d46ee874c8f80bb65fdb
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c8400ff077d6c4583b0f85a46cd1d50b
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
//
|
||||||
|
// AdjustUnity.h
|
||||||
|
// Adjust SDK
|
||||||
|
//
|
||||||
|
// Created by Pedro Silva (@nonelse) on 27th March 2014.
|
||||||
|
// Copyright © 2012-2018 Adjust GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The main interface to Adjust Unity bridge.
|
||||||
|
*/
|
||||||
|
@interface AdjustUnity : NSObject
|
||||||
|
|
||||||
|
// app callbacks as method parameters
|
||||||
|
typedef void (*AdjustDelegateIsEnabledGetter)(bool isEnabled);
|
||||||
|
typedef void (*AdjustDelegateAttributionGetter)(const char* attribution);
|
||||||
|
typedef void (*AdjustDelegateAdidGetter)(const char* adid);
|
||||||
|
typedef void (*AdjustDelegateIdfaGetter)(const char* idfa);
|
||||||
|
typedef void (*AdjustDelegateIdfvGetter)(const char* idfv);
|
||||||
|
typedef void (*AdjustDelegateLastDeeplinkGetter)(const char* lastDeeplink);
|
||||||
|
typedef void (*AdjustDelegateSdkVersionGetter)(const char* sdkVersion);
|
||||||
|
typedef void (*AdjustDelegateAttCallback)(int status);
|
||||||
|
typedef void (*AdjustDelegatePurchaseVerificationCallback)(const char* verificationResult, int callbackId);
|
||||||
|
typedef void (*AdjustDelegateVerifyAndTrackCallback)(const char* verificationResult, int callbackId);
|
||||||
|
typedef void (*AdjustDelegateResolvedDeeplinkCallback)(const char* deeplink);
|
||||||
|
typedef void (*AdjustDelegateSkanErrorCallback)(const char* error);
|
||||||
|
|
||||||
|
// app callbacks as subscriptions
|
||||||
|
typedef void (*AdjustDelegateAttributionCallback)(const char* attribution);
|
||||||
|
typedef void (*AdjustDelegateSessionSuccessCallback)(const char* sessionSuccess);
|
||||||
|
typedef void (*AdjustDelegateSessionFailureCallback)(const char* sessionFailure);
|
||||||
|
typedef void (*AdjustDelegateEventSuccessCallback)(const char* eventSuccess);
|
||||||
|
typedef void (*AdjustDelegateEventFailureCallback)(const char* eventFailure);
|
||||||
|
typedef void (*AdjustDelegateDeferredDeeplinkCallback)(const char* deeplink);
|
||||||
|
typedef void (*AdjustDelegateSkanUpdatedCallback)(const char* skanData);
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9ffff8839c6ab418b983add4c597fb87
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
'': Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Android: 1
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude LinuxUniversal: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude WebGL: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
Exclude iOS: 0
|
||||||
|
Exclude tvOS: 1
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: ARMv7
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Facebook: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Facebook: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: LinuxUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,929 @@
|
||||||
|
//
|
||||||
|
// AdjustUnity.mm
|
||||||
|
// Adjust SDK
|
||||||
|
//
|
||||||
|
// Created by Pedro Silva (@nonelse) on 27th March 2014.
|
||||||
|
// Copyright © 2012-2018 Adjust GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <AdjustSdk/AdjustSdk.h>
|
||||||
|
#import "AdjustUnity.h"
|
||||||
|
#import "AdjustUnityDelegate.h"
|
||||||
|
#import "AdjustUnityAppDelegate.h"
|
||||||
|
|
||||||
|
@implementation AdjustUnity
|
||||||
|
|
||||||
|
#pragma mark - Object lifecycle methods
|
||||||
|
|
||||||
|
+ (void)load {
|
||||||
|
// swizzle AppDelegate on the load
|
||||||
|
// it should be done as early as possible
|
||||||
|
[AdjustUnityAppDelegate swizzleAppDelegateCallbacks];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
#pragma mark - Helper C methods
|
||||||
|
|
||||||
|
// method for converting JSON stirng parameters into NSArray object
|
||||||
|
NSArray* convertArrayParameters(const char* cStringJsonArrayParameters) {
|
||||||
|
if (cStringJsonArrayParameters == NULL) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
NSArray *arrayParameters = nil;
|
||||||
|
NSString *stringJsonArrayParameters = [NSString stringWithUTF8String:cStringJsonArrayParameters];
|
||||||
|
|
||||||
|
if (stringJsonArrayParameters != nil) {
|
||||||
|
NSData *dataJson = [stringJsonArrayParameters dataUsingEncoding:NSUTF8StringEncoding];
|
||||||
|
arrayParameters = [NSJSONSerialization JSONObjectWithData:dataJson options:0 error:&error];
|
||||||
|
}
|
||||||
|
if (error != nil) {
|
||||||
|
NSString *errorMessage = @"Failed to parse json parameters!";
|
||||||
|
NSLog(@"%@", errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return arrayParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL isStringValid(const char* cString) {
|
||||||
|
if (cString == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *objcString = [NSString stringWithUTF8String:cString];
|
||||||
|
if (objcString == nil) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ([objcString isEqualToString:@"ADJ_INVALID"]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addValueOrEmpty(NSMutableDictionary *dictionary, NSString *key, NSObject *value) {
|
||||||
|
if (nil != value) {
|
||||||
|
if ([value isKindOfClass:[NSString class]]) {
|
||||||
|
[dictionary setObject:[NSString stringWithFormat:@"%@", value] forKey:key];
|
||||||
|
} else if ([value isKindOfClass:[NSNumber class]]) {
|
||||||
|
[dictionary setObject:[NSString stringWithFormat:@"%@", [((NSNumber *)value) stringValue]] forKey:key];
|
||||||
|
} else {
|
||||||
|
[dictionary setObject:@"" forKey:key];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
[dictionary setObject:@"" forKey:key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Publicly available C methods
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
void _AdjustInitSdk(
|
||||||
|
const char* appToken,
|
||||||
|
const char* environment,
|
||||||
|
const char* sdkPrefix,
|
||||||
|
const char* defaultTracker,
|
||||||
|
const char* externalDeviceId,
|
||||||
|
const char* jsonUrlStrategyDomains,
|
||||||
|
const char* storeName,
|
||||||
|
const char* storeAppId,
|
||||||
|
int allowSuppressLogLevel,
|
||||||
|
int logLevel,
|
||||||
|
int attConsentWaitingInterval,
|
||||||
|
int eventDeduplicationIdsMaxSize,
|
||||||
|
int shouldUseSubdomains,
|
||||||
|
int isCoppaComplianceEnabled,
|
||||||
|
int isDataResidency,
|
||||||
|
int isSendingInBackgroundEnabled,
|
||||||
|
int isAdServicesEnabled,
|
||||||
|
int isIdfaReadingEnabled,
|
||||||
|
int isIdfvReadingEnabled,
|
||||||
|
int isSkanAttributionEnabled,
|
||||||
|
int isLinkMeEnabled,
|
||||||
|
int isCostDataInAttributionEnabled,
|
||||||
|
int isDeviceIdsReadingOnceEnabled,
|
||||||
|
int isAppTrackingTransparencyUsageEnabled,
|
||||||
|
int isFirstSessionDelayEnabled,
|
||||||
|
int isDeferredDeeplinkOpeningEnabled,
|
||||||
|
AdjustDelegateAttributionCallback attributionCallback,
|
||||||
|
AdjustDelegateEventSuccessCallback eventSuccessCallback,
|
||||||
|
AdjustDelegateEventFailureCallback eventFailureCallback,
|
||||||
|
AdjustDelegateSessionSuccessCallback sessionSuccessCallback,
|
||||||
|
AdjustDelegateSessionFailureCallback sessionFailureCallback,
|
||||||
|
AdjustDelegateDeferredDeeplinkCallback deferredDeeplinkCallback,
|
||||||
|
AdjustDelegateSkanUpdatedCallback skanUpdatedCallback) {
|
||||||
|
NSString *strAppToken = isStringValid(appToken) == true ? [NSString stringWithUTF8String:appToken] : nil;
|
||||||
|
NSString *strEnvironment = isStringValid(environment) == true ? [NSString stringWithUTF8String:environment] : nil;
|
||||||
|
NSString *strSdkPrefix = isStringValid(sdkPrefix) == true ? [NSString stringWithUTF8String:sdkPrefix] : nil;
|
||||||
|
NSString *strDefaultTracker = isStringValid(defaultTracker) == true ? [NSString stringWithUTF8String:defaultTracker] : nil;
|
||||||
|
NSString *strExternalDeviceId = isStringValid(externalDeviceId) == true ? [NSString stringWithUTF8String:externalDeviceId] : nil;
|
||||||
|
NSString *strStoreName = isStringValid(storeName) == true ? [NSString stringWithUTF8String:storeName] : nil;
|
||||||
|
NSString *strStoreAppId = isStringValid(storeAppId) == true ? [NSString stringWithUTF8String:storeAppId] : nil;
|
||||||
|
|
||||||
|
ADJConfig *adjustConfig;
|
||||||
|
|
||||||
|
if (allowSuppressLogLevel != -1) {
|
||||||
|
adjustConfig = [[ADJConfig alloc] initWithAppToken:strAppToken
|
||||||
|
environment:strEnvironment
|
||||||
|
suppressLogLevel:(BOOL)allowSuppressLogLevel];
|
||||||
|
} else {
|
||||||
|
adjustConfig = [[ADJConfig alloc] initWithAppToken:strAppToken
|
||||||
|
environment:strEnvironment];
|
||||||
|
}
|
||||||
|
|
||||||
|
// set SDK prefix
|
||||||
|
[adjustConfig setSdkPrefix:strSdkPrefix];
|
||||||
|
|
||||||
|
// check if user has selected to implement any of the callbacks
|
||||||
|
if (attributionCallback != nil ||
|
||||||
|
sessionSuccessCallback != nil ||
|
||||||
|
sessionFailureCallback != nil ||
|
||||||
|
eventSuccessCallback != nil ||
|
||||||
|
eventFailureCallback != nil ||
|
||||||
|
deferredDeeplinkCallback != nil ||
|
||||||
|
skanUpdatedCallback != nil) {
|
||||||
|
[adjustConfig setDelegate:
|
||||||
|
[AdjustUnityDelegate getInstanceWithAttributionCallback:attributionCallback
|
||||||
|
eventSuccessCallback:eventSuccessCallback
|
||||||
|
eventFailureCallback:eventFailureCallback
|
||||||
|
sessionSuccessCallback:sessionSuccessCallback
|
||||||
|
sessionFailureCallback:sessionFailureCallback
|
||||||
|
deferredDeeplinkCallback:deferredDeeplinkCallback
|
||||||
|
skanUpdatedCallback:skanUpdatedCallback
|
||||||
|
shouldLaunchDeferredDeeplink:isDeferredDeeplinkOpeningEnabled]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// log level
|
||||||
|
if (logLevel != -1) {
|
||||||
|
[adjustConfig setLogLevel:(ADJLogLevel)logLevel];
|
||||||
|
}
|
||||||
|
|
||||||
|
// COPPA compliance.
|
||||||
|
if (isCoppaComplianceEnabled != -1) {
|
||||||
|
if ((BOOL)isCoppaComplianceEnabled == YES) {
|
||||||
|
[adjustConfig enableCoppaCompliance];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send in background.
|
||||||
|
if (isSendingInBackgroundEnabled != -1) {
|
||||||
|
if ((BOOL)isSendingInBackgroundEnabled == YES) {
|
||||||
|
[adjustConfig enableSendingInBackground];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdServices.framework handling
|
||||||
|
if (isAdServicesEnabled != -1) {
|
||||||
|
if ((BOOL)isAdServicesEnabled == NO) {
|
||||||
|
[adjustConfig disableAdServices];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKAN attribution
|
||||||
|
if (isSkanAttributionEnabled != -1) {
|
||||||
|
if ((BOOL)isSkanAttributionEnabled == NO) {
|
||||||
|
[adjustConfig disableSkanAttribution];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IDFA reading
|
||||||
|
if (isIdfaReadingEnabled != -1) {
|
||||||
|
if ((BOOL)isIdfaReadingEnabled == NO) {
|
||||||
|
[adjustConfig disableIdfaReading];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IDFV reading
|
||||||
|
if (isIdfvReadingEnabled != -1) {
|
||||||
|
if ((BOOL)isIdfvReadingEnabled == NO) {
|
||||||
|
[adjustConfig disableIdfvReading];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LinkMe
|
||||||
|
if (isLinkMeEnabled != -1) {
|
||||||
|
if ((BOOL)isLinkMeEnabled == YES) {
|
||||||
|
[adjustConfig enableLinkMe];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ATT dialog delay
|
||||||
|
if (attConsentWaitingInterval != -1) {
|
||||||
|
[adjustConfig setAttConsentWaitingInterval:attConsentWaitingInterval];
|
||||||
|
}
|
||||||
|
|
||||||
|
// disable AppTrackingTransparency.framework interaction
|
||||||
|
if (isAppTrackingTransparencyUsageEnabled != -1) {
|
||||||
|
if ((BOOL)isAppTrackingTransparencyUsageEnabled == NO) {
|
||||||
|
[adjustConfig disableAppTrackingTransparencyUsage];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// first session delay
|
||||||
|
if (isFirstSessionDelayEnabled != -1) {
|
||||||
|
if ((BOOL)isFirstSessionDelayEnabled == YES) {
|
||||||
|
[adjustConfig enableFirstSessionDelay];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// deduplication IDs max number
|
||||||
|
if (eventDeduplicationIdsMaxSize != -1) {
|
||||||
|
[adjustConfig setEventDeduplicationIdsMaxSize:eventDeduplicationIdsMaxSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
// cost data in attribution callback
|
||||||
|
if (isCostDataInAttributionEnabled != -1) {
|
||||||
|
if ((BOOL)isCostDataInAttributionEnabled == YES) {
|
||||||
|
[adjustConfig enableCostDataInAttribution];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// read device info only once
|
||||||
|
if (isDeviceIdsReadingOnceEnabled != -1) {
|
||||||
|
if ((BOOL)isDeviceIdsReadingOnceEnabled == YES) {
|
||||||
|
[adjustConfig enableDeviceIdsReadingOnce];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default tracker
|
||||||
|
if (strDefaultTracker != nil) {
|
||||||
|
[adjustConfig setDefaultTracker:strDefaultTracker];
|
||||||
|
}
|
||||||
|
|
||||||
|
// external device identifier
|
||||||
|
if (strExternalDeviceId != nil) {
|
||||||
|
[adjustConfig setExternalDeviceId:strExternalDeviceId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL strategy
|
||||||
|
if (shouldUseSubdomains != -1 && isDataResidency != -1) {
|
||||||
|
NSArray *urlStrategyDomains = convertArrayParameters(jsonUrlStrategyDomains);
|
||||||
|
if (urlStrategyDomains != nil) {
|
||||||
|
[adjustConfig setUrlStrategy:urlStrategyDomains
|
||||||
|
useSubdomains:(BOOL)shouldUseSubdomains
|
||||||
|
isDataResidency:(BOOL)isDataResidency];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// custom store
|
||||||
|
if (strStoreName != nil) {
|
||||||
|
ADJStoreInfo *storeInfo = [[ADJStoreInfo alloc] initWithStoreName:strStoreName];
|
||||||
|
if (strStoreAppId != nil) {
|
||||||
|
[storeInfo setStoreAppId:strStoreAppId];
|
||||||
|
}
|
||||||
|
[adjustConfig setStoreInfo:storeInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize the SDK
|
||||||
|
[Adjust initSdk:adjustConfig];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustTrackEvent(const char* eventToken,
|
||||||
|
double revenue,
|
||||||
|
const char* currency,
|
||||||
|
const char* productId,
|
||||||
|
const char* transactionId,
|
||||||
|
const char* callbackId,
|
||||||
|
const char* deduplicationId,
|
||||||
|
const char* jsonCallbackParameters,
|
||||||
|
const char* jsonPartnerParameters) {
|
||||||
|
NSString *strEventToken = isStringValid(eventToken) == true ? [NSString stringWithUTF8String:eventToken] : nil;
|
||||||
|
ADJEvent *event = [[ADJEvent alloc] initWithEventToken:strEventToken];
|
||||||
|
|
||||||
|
// revenue and currency
|
||||||
|
if (revenue != -1 && currency != NULL) {
|
||||||
|
NSString *stringCurrency = [NSString stringWithUTF8String:currency];
|
||||||
|
[event setRevenue:revenue currency:stringCurrency];
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback parameters
|
||||||
|
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
|
||||||
|
if (arrayCallbackParameters != nil) {
|
||||||
|
NSUInteger count = [arrayCallbackParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayCallbackParameters[i++];
|
||||||
|
NSString *value = arrayCallbackParameters[i++];
|
||||||
|
[event addCallbackParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// partner parameters
|
||||||
|
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
|
||||||
|
if (arrayPartnerParameters != nil) {
|
||||||
|
NSUInteger count = [arrayPartnerParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayPartnerParameters[i++];
|
||||||
|
NSString *value = arrayPartnerParameters[i++];
|
||||||
|
[event addPartnerParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// transaction ID
|
||||||
|
if (transactionId != NULL) {
|
||||||
|
NSString *strTransactionId = [NSString stringWithUTF8String:transactionId];
|
||||||
|
[event setTransactionId:strTransactionId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// product ID
|
||||||
|
if (productId != NULL) {
|
||||||
|
NSString *strProductId = [NSString stringWithUTF8String:productId];
|
||||||
|
[event setProductId:strProductId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback ID
|
||||||
|
if (callbackId != NULL) {
|
||||||
|
NSString *strCallbackId = [NSString stringWithUTF8String:callbackId];
|
||||||
|
[event setCallbackId:strCallbackId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// deduplication ID
|
||||||
|
if (deduplicationId != NULL) {
|
||||||
|
NSString *strDeduplicationId = [NSString stringWithUTF8String:deduplicationId];
|
||||||
|
[event setDeduplicationId:strDeduplicationId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// track event
|
||||||
|
[Adjust trackEvent:event];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustTrackSubsessionStart() {
|
||||||
|
[Adjust trackSubsessionStart];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustTrackSubsessionEnd() {
|
||||||
|
[Adjust trackSubsessionEnd];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustEnable() {
|
||||||
|
[Adjust enable];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustDisable() {
|
||||||
|
[Adjust disable];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustSwitchToOfflineMode() {
|
||||||
|
[Adjust switchToOfflineMode];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustSwitchBackToOnlineMode() {
|
||||||
|
[Adjust switchBackToOnlineMode];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustSetPushToken(const char* pushToken) {
|
||||||
|
if (pushToken != NULL) {
|
||||||
|
NSString *strPushToken = [NSString stringWithUTF8String:pushToken];
|
||||||
|
[Adjust setPushTokenAsString:strPushToken];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustProcessDeeplink(const char* deeplink, const char* referrer) {
|
||||||
|
if (deeplink != NULL) {
|
||||||
|
NSString *strDeeplink = [NSString stringWithUTF8String:deeplink];
|
||||||
|
NSURL *urlDeeplink = [NSURL URLWithString:strDeeplink];
|
||||||
|
ADJDeeplink *adjustDeeplink = [[ADJDeeplink alloc] initWithDeeplink:urlDeeplink];
|
||||||
|
|
||||||
|
if (referrer != NULL) {
|
||||||
|
NSString *strReferrer = [NSString stringWithUTF8String:referrer];
|
||||||
|
NSURL *urlReferrer = [NSURL URLWithString:strReferrer];
|
||||||
|
[adjustDeeplink setReferrer:urlReferrer];
|
||||||
|
}
|
||||||
|
[Adjust processDeeplink:adjustDeeplink];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustIsEnabled(AdjustDelegateIsEnabledGetter callback) {
|
||||||
|
[Adjust isEnabledWithCompletionHandler:^(BOOL isEnabled) {
|
||||||
|
callback(isEnabled);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGetAttribution(AdjustDelegateAttributionGetter callback) {
|
||||||
|
[Adjust attributionWithCompletionHandler:^(ADJAttribution * _Nullable attribution) {
|
||||||
|
// TODO: nil checks
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
addValueOrEmpty(dictionary, @"trackerToken", attribution.trackerToken);
|
||||||
|
addValueOrEmpty(dictionary, @"trackerName", attribution.trackerName);
|
||||||
|
addValueOrEmpty(dictionary, @"network", attribution.network);
|
||||||
|
addValueOrEmpty(dictionary, @"campaign", attribution.campaign);
|
||||||
|
addValueOrEmpty(dictionary, @"creative", attribution.creative);
|
||||||
|
addValueOrEmpty(dictionary, @"adgroup", attribution.adgroup);
|
||||||
|
addValueOrEmpty(dictionary, @"clickLabel", attribution.clickLabel);
|
||||||
|
addValueOrEmpty(dictionary, @"costType", attribution.costType);
|
||||||
|
addValueOrEmpty(dictionary, @"costAmount", attribution.costAmount);
|
||||||
|
addValueOrEmpty(dictionary, @"costCurrency", attribution.costCurrency);
|
||||||
|
if (attribution.jsonResponse != nil) {
|
||||||
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:attribution.jsonResponse
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *strJsonResponse = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||||
|
addValueOrEmpty(dictionary, @"jsonResponse", strJsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataAttribution = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *stringAttribution = [[NSString alloc] initWithBytes:[dataAttribution bytes]
|
||||||
|
length:[dataAttribution length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* attributionCString = [stringAttribution UTF8String];
|
||||||
|
callback(attributionCString);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGetAdid(AdjustDelegateAdidGetter callback) {
|
||||||
|
[Adjust adidWithCompletionHandler:^(NSString * _Nullable adid) {
|
||||||
|
// TODO: nil checks
|
||||||
|
callback([adid UTF8String]);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGetIdfa(AdjustDelegateIdfaGetter callback) {
|
||||||
|
[Adjust idfaWithCompletionHandler:^(NSString * _Nullable idfa) {
|
||||||
|
// TODO: nil checks
|
||||||
|
callback([idfa UTF8String]);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGetIdfv(AdjustDelegateIdfvGetter callback) {
|
||||||
|
[Adjust idfvWithCompletionHandler:^(NSString * _Nullable idfv) {
|
||||||
|
// TODO: nil checks
|
||||||
|
callback([idfv UTF8String]);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGetLastDeeplink(AdjustDelegateLastDeeplinkGetter callback) {
|
||||||
|
[Adjust lastDeeplinkWithCompletionHandler:^(NSURL * _Nullable lastDeeplink) {
|
||||||
|
// TODO: nil checks
|
||||||
|
NSString *strLastDeeplink = [lastDeeplink absoluteString];
|
||||||
|
callback([strLastDeeplink UTF8String]);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGetSdkVersion(AdjustDelegateSdkVersionGetter callback) {
|
||||||
|
[Adjust sdkVersionWithCompletionHandler:^(NSString * _Nullable sdkVersion) {
|
||||||
|
// TODO: nil checks
|
||||||
|
callback([sdkVersion UTF8String]);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustGdprForgetMe() {
|
||||||
|
[Adjust gdprForgetMe];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustAddGlobalPartnerParameter(const char* key, const char* value) {
|
||||||
|
if (key != NULL && value != NULL) {
|
||||||
|
NSString *strKey = [NSString stringWithUTF8String:key];
|
||||||
|
NSString *strValue = [NSString stringWithUTF8String:value];
|
||||||
|
[Adjust addGlobalPartnerParameter:strValue forKey:strKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustAddGlobalCallbackParameter(const char* key, const char* value) {
|
||||||
|
if (key != NULL && value != NULL) {
|
||||||
|
NSString *strKey = [NSString stringWithUTF8String:key];
|
||||||
|
NSString *strValue = [NSString stringWithUTF8String:value];
|
||||||
|
[Adjust addGlobalCallbackParameter:strValue forKey:strKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustRemoveGlobalPartnerParameter(const char* key) {
|
||||||
|
if (key != NULL) {
|
||||||
|
NSString *strKey = [NSString stringWithUTF8String:key];
|
||||||
|
[Adjust removeGlobalPartnerParameterForKey:strKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustRemoveGlobalCallbackParameter(const char* key) {
|
||||||
|
if (key != NULL) {
|
||||||
|
NSString *strKey = [NSString stringWithUTF8String:key];
|
||||||
|
[Adjust removeGlobalCallbackParameterForKey:strKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustRemoveGlobalPartnerParameters() {
|
||||||
|
[Adjust removeGlobalPartnerParameters];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustRemoveGlobalCallbackParameters() {
|
||||||
|
[Adjust removeGlobalCallbackParameters];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustTrackAdRevenue(const char* source,
|
||||||
|
double revenue,
|
||||||
|
const char* currency,
|
||||||
|
int adImpressionsCount,
|
||||||
|
const char* adRevenueNetwork,
|
||||||
|
const char* adRevenueUnit,
|
||||||
|
const char* adRevenuePlacement,
|
||||||
|
const char* jsonCallbackParameters,
|
||||||
|
const char* jsonPartnerParameters) {
|
||||||
|
NSString *stringSource = isStringValid(source) == true ? [NSString stringWithUTF8String:source] : nil;
|
||||||
|
ADJAdRevenue *adRevenue = [[ADJAdRevenue alloc] initWithSource:stringSource];
|
||||||
|
|
||||||
|
// revenue and currency
|
||||||
|
if (revenue != -1 && currency != NULL) {
|
||||||
|
NSString *stringCurrency = [NSString stringWithUTF8String:currency];
|
||||||
|
[adRevenue setRevenue:revenue currency:stringCurrency];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ad impressions count
|
||||||
|
if (adImpressionsCount != -1) {
|
||||||
|
[adRevenue setAdImpressionsCount:adImpressionsCount];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ad revenue network
|
||||||
|
if (adRevenueNetwork != NULL) {
|
||||||
|
NSString *stringAdRevenueNetwork = [NSString stringWithUTF8String:adRevenueNetwork];
|
||||||
|
[adRevenue setAdRevenueNetwork:stringAdRevenueNetwork];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ad revenue unit
|
||||||
|
if (adRevenueUnit != NULL) {
|
||||||
|
NSString *stringAdRevenueUnit = [NSString stringWithUTF8String:adRevenueUnit];
|
||||||
|
[adRevenue setAdRevenueUnit:stringAdRevenueUnit];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ad revenue placement
|
||||||
|
if (adRevenuePlacement != NULL) {
|
||||||
|
NSString *stringAdRevenuePlacement = [NSString stringWithUTF8String:adRevenuePlacement];
|
||||||
|
[adRevenue setAdRevenuePlacement:stringAdRevenuePlacement];
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback parameters
|
||||||
|
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
|
||||||
|
if (arrayCallbackParameters != nil) {
|
||||||
|
NSUInteger count = [arrayCallbackParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayCallbackParameters[i++];
|
||||||
|
NSString *value = arrayCallbackParameters[i++];
|
||||||
|
[adRevenue addCallbackParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// partner parameters
|
||||||
|
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
|
||||||
|
if (arrayPartnerParameters != nil) {
|
||||||
|
NSUInteger count = [arrayPartnerParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayPartnerParameters[i++];
|
||||||
|
NSString *value = arrayPartnerParameters[i++];
|
||||||
|
[adRevenue addPartnerParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// track ad revenue
|
||||||
|
[Adjust trackAdRevenue:adRevenue];
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: consider non-string types for some fields?
|
||||||
|
void _AdjustTrackAppStoreSubscription(const char* price,
|
||||||
|
const char* currency,
|
||||||
|
const char* transactionId,
|
||||||
|
const char* transactionDate,
|
||||||
|
const char* salesRegion,
|
||||||
|
const char* jsonCallbackParameters,
|
||||||
|
const char* jsonPartnerParameters) {
|
||||||
|
// mandatory fields
|
||||||
|
NSDecimalNumber *mPrice;
|
||||||
|
NSString *mCurrency;
|
||||||
|
NSString *mTransactionId;
|
||||||
|
|
||||||
|
// price
|
||||||
|
if (price != NULL) {
|
||||||
|
mPrice = [NSDecimalNumber decimalNumberWithString:[NSString stringWithUTF8String:price]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// currency
|
||||||
|
if (currency != NULL) {
|
||||||
|
mCurrency = [NSString stringWithUTF8String:currency];
|
||||||
|
}
|
||||||
|
|
||||||
|
// transaction ID
|
||||||
|
if (transactionId != NULL) {
|
||||||
|
mTransactionId = [NSString stringWithUTF8String:transactionId];
|
||||||
|
}
|
||||||
|
|
||||||
|
ADJAppStoreSubscription *subscription =
|
||||||
|
[[ADJAppStoreSubscription alloc] initWithPrice:mPrice
|
||||||
|
currency:mCurrency
|
||||||
|
transactionId:mTransactionId];
|
||||||
|
|
||||||
|
// optional fields below
|
||||||
|
|
||||||
|
// transaction date
|
||||||
|
if (transactionDate != NULL) {
|
||||||
|
NSTimeInterval transactionDateInterval = [[NSString stringWithUTF8String:transactionDate] doubleValue] / 1000.0;
|
||||||
|
NSDate *oTransactionDate = [NSDate dateWithTimeIntervalSince1970:transactionDateInterval];
|
||||||
|
[subscription setTransactionDate:oTransactionDate];
|
||||||
|
}
|
||||||
|
|
||||||
|
// sales region
|
||||||
|
if (salesRegion != NULL) {
|
||||||
|
NSString *oSalesRegion = [NSString stringWithUTF8String:salesRegion];
|
||||||
|
[subscription setSalesRegion:oSalesRegion];
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback parameters
|
||||||
|
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
|
||||||
|
if (arrayCallbackParameters != nil) {
|
||||||
|
NSUInteger count = [arrayCallbackParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayCallbackParameters[i++];
|
||||||
|
NSString *value = arrayCallbackParameters[i++];
|
||||||
|
[subscription addCallbackParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// partner parameters
|
||||||
|
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
|
||||||
|
if (arrayPartnerParameters != nil) {
|
||||||
|
NSUInteger count = [arrayPartnerParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayPartnerParameters[i++];
|
||||||
|
NSString *value = arrayPartnerParameters[i++];
|
||||||
|
[subscription addPartnerParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// track subscription
|
||||||
|
[Adjust trackAppStoreSubscription:subscription];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustTrackThirdPartySharing(int enabled, const char* jsonGranularOptions, const char* jsonPartnerSharingSettings) {
|
||||||
|
NSNumber *nEnabled = enabled >= 0 ? [NSNumber numberWithInt:enabled] : nil;
|
||||||
|
ADJThirdPartySharing *adjustThirdPartySharing = [[ADJThirdPartySharing alloc] initWithIsEnabled:nEnabled];
|
||||||
|
|
||||||
|
NSArray *arrayGranularOptions = convertArrayParameters(jsonGranularOptions);
|
||||||
|
if (arrayGranularOptions != nil) {
|
||||||
|
for (int i = 0; i < [arrayGranularOptions count];) {
|
||||||
|
NSString *partnerName = arrayGranularOptions[i++];
|
||||||
|
NSString *key = arrayGranularOptions[i++];
|
||||||
|
NSString *value = arrayGranularOptions[i++];
|
||||||
|
[adjustThirdPartySharing addGranularOption:partnerName
|
||||||
|
key:key
|
||||||
|
value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSArray *arrayPartnerSharingSettings = convertArrayParameters(jsonPartnerSharingSettings);
|
||||||
|
if (arrayPartnerSharingSettings != nil) {
|
||||||
|
for (int i = 0; i < [arrayPartnerSharingSettings count];) {
|
||||||
|
NSString *partnerName = arrayPartnerSharingSettings[i++];
|
||||||
|
NSString *key = arrayPartnerSharingSettings[i++];
|
||||||
|
NSString *value = arrayPartnerSharingSettings[i++];
|
||||||
|
[adjustThirdPartySharing addPartnerSharingSetting:partnerName
|
||||||
|
key:key
|
||||||
|
value:[value boolValue]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Adjust trackThirdPartySharing:adjustThirdPartySharing];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustTrackMeasurementConsent(int enabled) {
|
||||||
|
BOOL bEnabled = (BOOL)enabled;
|
||||||
|
[Adjust trackMeasurementConsent:bEnabled];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustRequestAppTrackingAuthorization(AdjustDelegateAttCallback callback) {
|
||||||
|
[Adjust requestAppTrackingAuthorizationWithCompletionHandler:^(NSUInteger status) {
|
||||||
|
callback((int)status);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustUpdateSkanConversionValue(int conversionValue,
|
||||||
|
const char* coarseValue,
|
||||||
|
int lockWindow,
|
||||||
|
AdjustDelegateSkanErrorCallback callback) {
|
||||||
|
if (coarseValue != NULL) {
|
||||||
|
NSString *strCoarseValue = [NSString stringWithUTF8String:coarseValue];
|
||||||
|
BOOL bLockWindow = (BOOL)lockWindow;
|
||||||
|
[Adjust updateSkanConversionValue:conversionValue
|
||||||
|
coarseValue:strCoarseValue
|
||||||
|
lockWindow:[NSNumber numberWithBool:bLockWindow]
|
||||||
|
withCompletionHandler:^(NSError * _Nullable error) {
|
||||||
|
// TODO: nil checks
|
||||||
|
NSString *errorString = [error localizedDescription];
|
||||||
|
const char* errorChar = [errorString UTF8String];
|
||||||
|
callback(errorChar);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _AdjustGetAppTrackingAuthorizationStatus() {
|
||||||
|
return [Adjust appTrackingAuthorizationStatus];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustVerifyAppStorePurchase(const char* transactionId,
|
||||||
|
const char* productId,
|
||||||
|
int callbackId,
|
||||||
|
AdjustDelegatePurchaseVerificationCallback callback) {
|
||||||
|
NSString *strTransactionId;
|
||||||
|
NSString *strProductId;
|
||||||
|
|
||||||
|
// transaction ID
|
||||||
|
if (transactionId != NULL) {
|
||||||
|
strTransactionId = [NSString stringWithUTF8String:transactionId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// product ID
|
||||||
|
if (productId != NULL) {
|
||||||
|
strProductId = [NSString stringWithUTF8String:productId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify the purchase
|
||||||
|
ADJAppStorePurchase *purchase =
|
||||||
|
[[ADJAppStorePurchase alloc] initWithTransactionId:strTransactionId
|
||||||
|
productId:strProductId];
|
||||||
|
|
||||||
|
[Adjust verifyAppStorePurchase:purchase
|
||||||
|
withCompletionHandler:^(ADJPurchaseVerificationResult * _Nonnull verificationResult) {
|
||||||
|
// TODO: nil checks
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
addValueOrEmpty(dictionary, @"verificationStatus", verificationResult.verificationStatus);
|
||||||
|
addValueOrEmpty(dictionary, @"code", [NSString stringWithFormat:@"%d", verificationResult.code]);
|
||||||
|
addValueOrEmpty(dictionary, @"message", verificationResult.message);
|
||||||
|
|
||||||
|
NSData *dataVerificationInfo = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *strVerificationInfo = [[NSString alloc] initWithBytes:[dataVerificationInfo bytes]
|
||||||
|
length:[dataVerificationInfo length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* verificationInfoCString = [strVerificationInfo UTF8String];
|
||||||
|
callback(verificationInfoCString, callbackId);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustProcessAndResolveDeeplink(const char* deeplink, AdjustDelegateResolvedDeeplinkCallback callback) {
|
||||||
|
if (deeplink != NULL) {
|
||||||
|
NSString *strDeeplink = [NSString stringWithUTF8String:deeplink];
|
||||||
|
NSURL *urlDeeplink = [NSURL URLWithString:strDeeplink];
|
||||||
|
ADJDeeplink *deeplink = [[ADJDeeplink alloc] initWithDeeplink:urlDeeplink];
|
||||||
|
[Adjust processAndResolveDeeplink:deeplink withCompletionHandler:^(NSString * _Nullable resolvedLink) {
|
||||||
|
// TODO: nil checks
|
||||||
|
const char* resolvedLinkCString = [resolvedLink UTF8String];
|
||||||
|
callback(resolvedLinkCString);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustVerifyAndTrackAppStorePurchase(
|
||||||
|
const char* eventToken,
|
||||||
|
double revenue,
|
||||||
|
const char* currency,
|
||||||
|
const char* productId,
|
||||||
|
const char* transactionId,
|
||||||
|
const char* callbackId,
|
||||||
|
const char* deduplicationId,
|
||||||
|
const char* jsonCallbackParameters,
|
||||||
|
const char* jsonPartnerParameters,
|
||||||
|
int verificationCallbackId,
|
||||||
|
AdjustDelegateVerifyAndTrackCallback callback) {
|
||||||
|
NSString *strEventToken = isStringValid(eventToken) == true ? [NSString stringWithUTF8String:eventToken] : nil;
|
||||||
|
ADJEvent *event = [[ADJEvent alloc] initWithEventToken:strEventToken];
|
||||||
|
|
||||||
|
// revenue and currency
|
||||||
|
if (revenue != -1 && currency != NULL) {
|
||||||
|
NSString *stringCurrency = [NSString stringWithUTF8String:currency];
|
||||||
|
[event setRevenue:revenue currency:stringCurrency];
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback parameters
|
||||||
|
NSArray *arrayCallbackParameters = convertArrayParameters(jsonCallbackParameters);
|
||||||
|
if (arrayCallbackParameters != nil) {
|
||||||
|
NSUInteger count = [arrayCallbackParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayCallbackParameters[i++];
|
||||||
|
NSString *value = arrayCallbackParameters[i++];
|
||||||
|
[event addCallbackParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// partner parameters
|
||||||
|
NSArray *arrayPartnerParameters = convertArrayParameters(jsonPartnerParameters);
|
||||||
|
if (arrayPartnerParameters != nil) {
|
||||||
|
NSUInteger count = [arrayPartnerParameters count];
|
||||||
|
for (int i = 0; i < count;) {
|
||||||
|
NSString *key = arrayPartnerParameters[i++];
|
||||||
|
NSString *value = arrayPartnerParameters[i++];
|
||||||
|
[event addPartnerParameter:key value:value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// transaction ID
|
||||||
|
if (transactionId != NULL) {
|
||||||
|
NSString *strTransactionId = [NSString stringWithUTF8String:transactionId];
|
||||||
|
[event setTransactionId:strTransactionId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// product ID
|
||||||
|
if (productId != NULL) {
|
||||||
|
NSString *strProductId = [NSString stringWithUTF8String:productId];
|
||||||
|
[event setProductId:strProductId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// callback ID
|
||||||
|
if (callbackId != NULL) {
|
||||||
|
NSString *strCallbackId = [NSString stringWithUTF8String:callbackId];
|
||||||
|
[event setCallbackId:strCallbackId];
|
||||||
|
}
|
||||||
|
|
||||||
|
// deduplication ID
|
||||||
|
if (deduplicationId != NULL) {
|
||||||
|
NSString *strDeduplicationId = [NSString stringWithUTF8String:deduplicationId];
|
||||||
|
[event setDeduplicationId:strDeduplicationId];
|
||||||
|
}
|
||||||
|
|
||||||
|
[Adjust verifyAndTrackAppStorePurchase:event
|
||||||
|
withCompletionHandler:^(ADJPurchaseVerificationResult * _Nonnull verificationResult) {
|
||||||
|
// TODO: nil checks
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
addValueOrEmpty(dictionary, @"verificationStatus", verificationResult.verificationStatus);
|
||||||
|
addValueOrEmpty(dictionary, @"code", [NSString stringWithFormat:@"%d", verificationResult.code]);
|
||||||
|
addValueOrEmpty(dictionary, @"message", verificationResult.message);
|
||||||
|
|
||||||
|
NSData *dataVerificationInfo = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *strVerificationInfo = [[NSString alloc] initWithBytes:[dataVerificationInfo bytes]
|
||||||
|
length:[dataVerificationInfo length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* verificationInfoCString = [strVerificationInfo UTF8String];
|
||||||
|
callback(verificationInfoCString, verificationCallbackId);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustEndFirstSessionDelay() {
|
||||||
|
[Adjust endFirstSessionDelay];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustEnableCoppaComplianceInDelay() {
|
||||||
|
[Adjust enableCoppaComplianceInDelay];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustDisableCoppaComplianceInDelay() {
|
||||||
|
[Adjust disableCoppaComplianceInDelay];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustSetExternalDeviceIdInDelay(const char* externalDeviceId) {
|
||||||
|
if (externalDeviceId != NULL) {
|
||||||
|
NSString *strExternalDeviceId = [NSString stringWithUTF8String:externalDeviceId];
|
||||||
|
[Adjust setExternalDeviceIdInDelay:strExternalDeviceId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _AdjustSetTestOptions(const char* overwriteUrl,
|
||||||
|
const char* extraPath,
|
||||||
|
long timerIntervalInMilliseconds,
|
||||||
|
long timerStartInMilliseconds,
|
||||||
|
long sessionIntervalInMilliseconds,
|
||||||
|
long subsessionIntervalInMilliseconds,
|
||||||
|
int teardown,
|
||||||
|
int deleteState,
|
||||||
|
int noBackoffWait,
|
||||||
|
int adServicesFrameworkEnabled,
|
||||||
|
int attStatus,
|
||||||
|
const char *idfa) {
|
||||||
|
NSMutableDictionary *testOptions = [NSMutableDictionary dictionary];
|
||||||
|
|
||||||
|
NSString *strOverwriteUrl = isStringValid(overwriteUrl) == true ? [NSString stringWithUTF8String:overwriteUrl] : nil;
|
||||||
|
if (strOverwriteUrl != nil) {
|
||||||
|
testOptions[@"testUrlOverwrite"] = strOverwriteUrl;
|
||||||
|
}
|
||||||
|
NSString *strExtraPath = isStringValid(extraPath) == true ? [NSString stringWithUTF8String:extraPath] : nil;
|
||||||
|
if (strExtraPath != nil && [strExtraPath length] > 0) {
|
||||||
|
testOptions[@"extraPath"] = strExtraPath;
|
||||||
|
}
|
||||||
|
NSString *strIdfa = isStringValid(idfa) == true ? [NSString stringWithUTF8String:idfa] : nil;
|
||||||
|
if (strIdfa != nil && [strIdfa length] > 0) {
|
||||||
|
testOptions[@"idfa"] = strIdfa;
|
||||||
|
}
|
||||||
|
|
||||||
|
testOptions[@"timerIntervalInMilliseconds"] = [NSNumber numberWithLong:timerIntervalInMilliseconds];
|
||||||
|
testOptions[@"timerStartInMilliseconds"] = [NSNumber numberWithLong:timerStartInMilliseconds];
|
||||||
|
testOptions[@"sessionIntervalInMilliseconds"] = [NSNumber numberWithLong:sessionIntervalInMilliseconds];
|
||||||
|
testOptions[@"subsessionIntervalInMilliseconds"] = [NSNumber numberWithLong:subsessionIntervalInMilliseconds];
|
||||||
|
testOptions[@"attStatusInt"] = [NSNumber numberWithInt:attStatus];
|
||||||
|
|
||||||
|
if (teardown != -1) {
|
||||||
|
[AdjustUnityDelegate teardown];
|
||||||
|
testOptions[@"teardown"] = [NSNumber numberWithInt:teardown];
|
||||||
|
}
|
||||||
|
if (deleteState != -1) {
|
||||||
|
testOptions[@"deleteState"] = [NSNumber numberWithInt:deleteState];
|
||||||
|
}
|
||||||
|
if (noBackoffWait != -1) {
|
||||||
|
testOptions[@"noBackoffWait"] = [NSNumber numberWithInt:noBackoffWait];
|
||||||
|
}
|
||||||
|
if (adServicesFrameworkEnabled != -1) {
|
||||||
|
testOptions[@"adServicesFrameworkEnabled"] = [NSNumber numberWithInt:adServicesFrameworkEnabled];
|
||||||
|
}
|
||||||
|
|
||||||
|
[Adjust setTestOptions:testOptions];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,131 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3e17e20d987e4449489d9e3accbd8602
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
'': Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Android: 1
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude LinuxUniversal: 1
|
||||||
|
Exclude OSXIntel: 1
|
||||||
|
Exclude OSXIntel64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude WebGL: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
Exclude iOS: 0
|
||||||
|
Exclude tvOS: 1
|
||||||
|
- first:
|
||||||
|
'': Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: ARMv7
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Facebook: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Facebook: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: LinuxUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: OSXIntel
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXIntel64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
//
|
||||||
|
// AdjustUnityAppDelegate.h
|
||||||
|
// Adjust SDK
|
||||||
|
//
|
||||||
|
// Copyright © 2012-2021 Adjust GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The interface to Adjust App Delegate. Used to do callback methods swizzling for deep linking.
|
||||||
|
*/
|
||||||
|
@interface AdjustUnityAppDelegate : NSObject
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Swizzle AppDelegate deep linking callbacks.
|
||||||
|
*/
|
||||||
|
+ (void)swizzleAppDelegateCallbacks;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -0,0 +1,115 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ac4b0b80967dd499b94e6bd430ac6662
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
'': Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Android: 1
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude LinuxUniversal: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude WebGL: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
Exclude iOS: 0
|
||||||
|
Exclude tvOS: 1
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: ARMv7
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Facebook: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Facebook: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: LinuxUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
WebGL: WebGL
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
//
|
||||||
|
// AdjustUnityAppDelegate.mm
|
||||||
|
// Adjust SDK
|
||||||
|
//
|
||||||
|
// Copyright © 2012-2021 Adjust GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
#import <AdjustSdk/AdjustSdk.h>
|
||||||
|
#import "AdjustUnityAppDelegate.h"
|
||||||
|
|
||||||
|
typedef BOOL (*openURL_t)(id, SEL, UIApplication *, NSURL *, NSDictionary *);
|
||||||
|
typedef BOOL (*continueUserActivity_t)(id, SEL, UIApplication *, NSUserActivity *, void (^)(NSArray *restorableObjects));
|
||||||
|
static openURL_t original_openURL = NULL;
|
||||||
|
static continueUserActivity_t original_continueUserActivity = NULL;
|
||||||
|
|
||||||
|
@implementation AdjustUnityAppDelegate
|
||||||
|
|
||||||
|
+ (void)swizzleAppDelegateCallbacks {
|
||||||
|
NSLog(@"[Adjust] Swizzling AppDelegate callbacks...");
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
original_openURL = (openURL_t)[self swizzleOriginalSelector:@selector(application:openURL:options:)
|
||||||
|
withSelector:@selector(adjust_application:openURL:options:)];
|
||||||
|
original_continueUserActivity = (continueUserActivity_t)[self swizzleOriginalSelector:@selector(application:continueUserActivity:restorationHandler:)
|
||||||
|
withSelector:@selector(adjust_application:continueUserActivity:restorationHandler:)];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (IMP)swizzleOriginalSelector:(SEL)originalSelector
|
||||||
|
withSelector:(SEL)swizzledSelector {
|
||||||
|
// The Unity base app controller class name.
|
||||||
|
extern const char* AppControllerClassName;
|
||||||
|
Class originalClass = NSClassFromString([NSString stringWithUTF8String:AppControllerClassName]);
|
||||||
|
Class swizzledClass = [self class];
|
||||||
|
IMP originalImp = NULL;
|
||||||
|
IMP swizzledImp = class_getMethodImplementation(swizzledClass, swizzledSelector);
|
||||||
|
|
||||||
|
// Replace original implementation by the custom one.
|
||||||
|
Method originalMethod = class_getInstanceMethod(originalClass, originalSelector);
|
||||||
|
if (originalMethod) {
|
||||||
|
originalImp = method_setImplementation(originalMethod, swizzledImp);
|
||||||
|
} else if (![originalClass instancesRespondToSelector:originalSelector]) {
|
||||||
|
// Add the method to the original class if it doesn't implement the selector.
|
||||||
|
Method swizzledMethod = class_getInstanceMethod(swizzledClass, swizzledSelector);
|
||||||
|
BOOL methodAdded = class_addMethod(originalClass, originalSelector, swizzledImp, method_getTypeEncoding(swizzledMethod));
|
||||||
|
if (!methodAdded) {
|
||||||
|
NSLog(@"[Adjust] Cannot swizzle selector '%@' of class '%@'.", NSStringFromSelector(originalSelector), originalClass);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NSLog(@"[Adjust] Selector '%@' of class '%@' is swizzled.", NSStringFromSelector(originalSelector), originalClass);
|
||||||
|
return originalImp;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)adjust_application:(UIApplication *)application
|
||||||
|
openURL:(NSURL *)url
|
||||||
|
options:(NSDictionary *)options {
|
||||||
|
ADJDeeplink *deeplink = [[ADJDeeplink alloc] initWithDeeplink:url];
|
||||||
|
[Adjust processDeeplink:deeplink];
|
||||||
|
return original_openURL ? original_openURL(self, _cmd, application, url, options) : YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)adjust_application:(UIApplication *)application
|
||||||
|
continueUserActivity:(NSUserActivity *)userActivity
|
||||||
|
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
|
||||||
|
if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
|
||||||
|
NSURL *url = [userActivity webpageURL];
|
||||||
|
ADJDeeplink *deeplink = [[ADJDeeplink alloc] initWithDeeplink:url];
|
||||||
|
[Adjust processDeeplink:deeplink];
|
||||||
|
}
|
||||||
|
return original_continueUserActivity ? original_continueUserActivity(self, _cmd, application, userActivity, restorationHandler) : YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ea1bc374f78b747f8a81fcc82cd77d96
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
'': Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Android: 1
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude LinuxUniversal: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude WebGL: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
Exclude iOS: 0
|
||||||
|
Exclude tvOS: 1
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Facebook: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Facebook: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: LinuxUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
//
|
||||||
|
// AdjustUnityDelegate.h
|
||||||
|
// Adjust SDK
|
||||||
|
//
|
||||||
|
// Created by Uglješa Erceg (@uerceg) on 5th December 2016.
|
||||||
|
// Copyright © 2012-Present Adjust GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <AdjustSdk/AdjustSdk.h>
|
||||||
|
#import "AdjustUnity.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The main interface to Adjust Unity delegate. Used to do callback methods swizzling where needed.
|
||||||
|
*/
|
||||||
|
@interface AdjustUnityDelegate : NSObject<AdjustDelegate>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Boolean indicating whether deferred deep link should be launched by SDK or not.
|
||||||
|
*/
|
||||||
|
@property (nonatomic) BOOL shouldLaunchDeferredDeeplink;
|
||||||
|
|
||||||
|
@property (nonatomic) AdjustDelegateAttributionCallback attributionCallback;
|
||||||
|
@property (nonatomic) AdjustDelegateEventSuccessCallback eventSuccessCallback;
|
||||||
|
@property (nonatomic) AdjustDelegateEventFailureCallback eventFailureCallback;
|
||||||
|
@property (nonatomic) AdjustDelegateSessionSuccessCallback sessionSuccessCallback;
|
||||||
|
@property (nonatomic) AdjustDelegateSessionFailureCallback sessionFailureCallback;
|
||||||
|
@property (nonatomic) AdjustDelegateDeferredDeeplinkCallback deferredDeeplinkCallback;
|
||||||
|
@property (nonatomic) AdjustDelegateSkanUpdatedCallback skanUpdatedCallback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get instance of the AdjustUnityDelegate with properly swizzled callback methods.
|
||||||
|
*
|
||||||
|
* @param swizzleAttributionCallback Indicator whether attribution callback should be swizzled or not.
|
||||||
|
* @param swizzleEventSuccessCallback Indicator whether event success callback should be swizzled or not.
|
||||||
|
* @param swizzleEventFailureCallback Indicator whether event failure callback should be swizzled or not.
|
||||||
|
* @param swizzleSessionSuccessCallback Indicator whether session success callback should be swizzled or not.
|
||||||
|
* @param swizzleSessionFailureCallback Indicator whether session failure callback should be swizzled or not.
|
||||||
|
* @param swizzleDeferredDeeplinkCallback Indicator whether deferred deep link callback should be swizzled or not.
|
||||||
|
* @param swizzleSkanUpdatedCallback Indicator whether SKAD conversion value update callback should be swizzled or not.
|
||||||
|
* @param shouldLaunchDeferredDeeplink Indicator whether SDK should launch deferred deep link by default or not.
|
||||||
|
* @param adjustUnityGameObjectName Name of the Unity game object that loads Adjust script.
|
||||||
|
*
|
||||||
|
* @return AdjustUnityDelegate object instance with properly swizzled callback methods.
|
||||||
|
*/
|
||||||
|
+ (id)getInstanceWithAttributionCallback:(AdjustDelegateAttributionCallback)attributionCallback
|
||||||
|
eventSuccessCallback:(AdjustDelegateEventSuccessCallback)eventSuccessCallback
|
||||||
|
eventFailureCallback:(AdjustDelegateEventFailureCallback)eventFailureCallback
|
||||||
|
sessionSuccessCallback:(AdjustDelegateSessionSuccessCallback)sessionSuccessCallback
|
||||||
|
sessionFailureCallback:(AdjustDelegateSessionFailureCallback)sessionFailureCallback
|
||||||
|
deferredDeeplinkCallback:(AdjustDelegateDeferredDeeplinkCallback)deferredDeeplinkCallback
|
||||||
|
skanUpdatedCallback:(AdjustDelegateSkanUpdatedCallback)skanUpdatedCallback
|
||||||
|
shouldLaunchDeferredDeeplink:(BOOL)shouldLaunchDeferredDeeplink;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Teardown method used to reset static AdjustUnityDelegate instance.
|
||||||
|
* Used for testing purposes only.
|
||||||
|
*/
|
||||||
|
+ (void)teardown;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -0,0 +1,131 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5d2beef19c617f74fbca612cc97e3c60
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
'': Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Android: 1
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude LinuxUniversal: 1
|
||||||
|
Exclude OSXIntel: 1
|
||||||
|
Exclude OSXIntel64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude WebGL: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
Exclude iOS: 0
|
||||||
|
Exclude tvOS: 1
|
||||||
|
- first:
|
||||||
|
'': Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: ARMv7
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Facebook: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Facebook: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: LinuxUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: OSXIntel
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXIntel64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,345 @@
|
||||||
|
//
|
||||||
|
// AdjustUnityDelegate.mm
|
||||||
|
// Adjust SDK
|
||||||
|
//
|
||||||
|
// Created by Uglješa Erceg (@uerceg) on 5th December 2016.
|
||||||
|
// Copyright © 2012-2018 Adjust GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
#import "AdjustUnityDelegate.h"
|
||||||
|
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
static AdjustUnityDelegate *defaultInstance = nil;
|
||||||
|
|
||||||
|
@implementation AdjustUnityDelegate
|
||||||
|
|
||||||
|
#pragma mark - Object lifecycle methods
|
||||||
|
|
||||||
|
- (id)init {
|
||||||
|
self = [super init];
|
||||||
|
if (nil == self) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Public methods
|
||||||
|
|
||||||
|
+ (id)getInstanceWithAttributionCallback:(AdjustDelegateAttributionCallback)attributionCallback
|
||||||
|
eventSuccessCallback:(AdjustDelegateEventSuccessCallback)eventSuccessCallback
|
||||||
|
eventFailureCallback:(AdjustDelegateEventFailureCallback)eventFailureCallback
|
||||||
|
sessionSuccessCallback:(AdjustDelegateSessionSuccessCallback)sessionSuccessCallback
|
||||||
|
sessionFailureCallback:(AdjustDelegateSessionFailureCallback)sessionFailureCallback
|
||||||
|
deferredDeeplinkCallback:(AdjustDelegateDeferredDeeplinkCallback)deferredDeeplinkCallback
|
||||||
|
skanUpdatedCallback:(AdjustDelegateSkanUpdatedCallback)skanUpdatedCallback
|
||||||
|
shouldLaunchDeferredDeeplink:(BOOL)shouldLaunchDeferredDeeplink {
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
defaultInstance = [[AdjustUnityDelegate alloc] init];
|
||||||
|
|
||||||
|
// Do the swizzling where and if needed.
|
||||||
|
if (attributionCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustAttributionChanged:)
|
||||||
|
withSelector:@selector(adjustAttributionChangedWannabe:)];
|
||||||
|
}
|
||||||
|
if (eventSuccessCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustEventTrackingSucceeded:)
|
||||||
|
withSelector:@selector(adjustEventTrackingSucceededWannabe:)];
|
||||||
|
}
|
||||||
|
if (eventFailureCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustEventTrackingFailed:)
|
||||||
|
withSelector:@selector(adjustEventTrackingFailedWannabe:)];
|
||||||
|
}
|
||||||
|
if (sessionSuccessCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustSessionTrackingSucceeded:)
|
||||||
|
withSelector:@selector(adjustSessionTrackingSucceededWannabe:)];
|
||||||
|
}
|
||||||
|
if (sessionFailureCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustSessionTrackingFailed:)
|
||||||
|
withSelector:@selector(adjustSessionTrackingFailedWannabe:)];
|
||||||
|
}
|
||||||
|
if (deferredDeeplinkCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustDeferredDeeplinkReceived:)
|
||||||
|
withSelector:@selector(adjustDeferredDeeplinkReceivedWannabe:)];
|
||||||
|
}
|
||||||
|
if (skanUpdatedCallback != nil) {
|
||||||
|
[defaultInstance swizzleOriginalSelector:@selector(adjustSkanUpdatedWithConversionData:)
|
||||||
|
withSelector:@selector(adjustSkanUpdatedWithConversionDataWannabe:)];
|
||||||
|
}
|
||||||
|
|
||||||
|
[defaultInstance setAttributionCallback:attributionCallback];
|
||||||
|
[defaultInstance setEventSuccessCallback:eventSuccessCallback];
|
||||||
|
[defaultInstance setEventFailureCallback:eventFailureCallback];
|
||||||
|
[defaultInstance setSessionSuccessCallback:sessionSuccessCallback];
|
||||||
|
[defaultInstance setSessionFailureCallback:sessionFailureCallback];
|
||||||
|
[defaultInstance setDeferredDeeplinkCallback:deferredDeeplinkCallback];
|
||||||
|
[defaultInstance setSkanUpdatedCallback:skanUpdatedCallback];
|
||||||
|
[defaultInstance setShouldLaunchDeferredDeeplink:shouldLaunchDeferredDeeplink];
|
||||||
|
});
|
||||||
|
|
||||||
|
return defaultInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)teardown {
|
||||||
|
defaultInstance = nil;
|
||||||
|
onceToken = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Private & helper methods
|
||||||
|
|
||||||
|
- (void)adjustAttributionChangedWannabe:(ADJAttribution *)attribution {
|
||||||
|
if (attribution == nil || _attributionCallback == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.trackerToken
|
||||||
|
forKey:@"trackerToken"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.trackerName
|
||||||
|
forKey:@"trackerName"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.network
|
||||||
|
forKey:@"network"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.campaign
|
||||||
|
forKey:@"campaign"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.creative
|
||||||
|
forKey:@"creative"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.adgroup
|
||||||
|
forKey:@"adgroup"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.clickLabel
|
||||||
|
forKey:@"clickLabel"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.costType
|
||||||
|
forKey:@"costType"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.costAmount
|
||||||
|
forKey:@"costAmount"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:attribution.costCurrency
|
||||||
|
forKey:@"costCurrency"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
|
||||||
|
if (attribution.jsonResponse != nil) {
|
||||||
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:attribution.jsonResponse
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *strJsonResponse = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||||
|
[self addValueOrEmpty:strJsonResponse
|
||||||
|
forKey:@"jsonResponse"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataAttribution = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *stringAttribution = [[NSString alloc] initWithBytes:[dataAttribution bytes]
|
||||||
|
length:[dataAttribution length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* charArrayAttribution = [stringAttribution UTF8String];
|
||||||
|
_attributionCallback(charArrayAttribution);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)adjustEventTrackingSucceededWannabe:(ADJEventSuccess *)eventSuccessResponseData {
|
||||||
|
if (nil == eventSuccessResponseData || _eventSuccessCallback == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
[self addValueOrEmpty:eventSuccessResponseData.message
|
||||||
|
forKey:@"message"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventSuccessResponseData.timestamp
|
||||||
|
forKey:@"timestamp"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventSuccessResponseData.adid
|
||||||
|
forKey:@"adid"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventSuccessResponseData.eventToken
|
||||||
|
forKey:@"eventToken"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventSuccessResponseData.callbackId
|
||||||
|
forKey:@"callbackId"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
if (eventSuccessResponseData.jsonResponse != nil) {
|
||||||
|
[dictionary setObject:eventSuccessResponseData.jsonResponse
|
||||||
|
forKey:@"jsonResponse"];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataEventSuccess = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *stringEventSuccess = [[NSString alloc] initWithBytes:[dataEventSuccess bytes]
|
||||||
|
length:[dataEventSuccess length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* charArrayEventSuccess = [stringEventSuccess UTF8String];
|
||||||
|
_eventSuccessCallback(charArrayEventSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)adjustEventTrackingFailedWannabe:(ADJEventFailure *)eventFailureResponseData {
|
||||||
|
if (nil == eventFailureResponseData || _eventFailureCallback == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
[self addValueOrEmpty:eventFailureResponseData.message
|
||||||
|
forKey:@"message"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventFailureResponseData.timestamp
|
||||||
|
forKey:@"timestamp"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventFailureResponseData.adid
|
||||||
|
forKey:@"adid"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventFailureResponseData.eventToken
|
||||||
|
forKey:@"eventToken"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:eventFailureResponseData.callbackId
|
||||||
|
forKey:@"callbackId"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[dictionary setObject:(eventFailureResponseData.willRetry ? @"true" : @"false")
|
||||||
|
forKey:@"willRetry"];
|
||||||
|
if (eventFailureResponseData.jsonResponse != nil) {
|
||||||
|
[dictionary setObject:eventFailureResponseData.jsonResponse
|
||||||
|
forKey:@"jsonResponse"];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataEventFailure = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *stringEventFailure = [[NSString alloc] initWithBytes:[dataEventFailure bytes]
|
||||||
|
length:[dataEventFailure length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* charArrayEventFailure = [stringEventFailure UTF8String];
|
||||||
|
_eventFailureCallback(charArrayEventFailure);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)adjustSessionTrackingSucceededWannabe:(ADJSessionSuccess *)sessionSuccessResponseData {
|
||||||
|
if (nil == sessionSuccessResponseData || _sessionSuccessCallback == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
[self addValueOrEmpty:sessionSuccessResponseData.message
|
||||||
|
forKey:@"message"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:sessionSuccessResponseData.timestamp
|
||||||
|
forKey:@"timestamp"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:sessionSuccessResponseData.adid
|
||||||
|
forKey:@"adid"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
if (sessionSuccessResponseData.jsonResponse != nil) {
|
||||||
|
[dictionary setObject:sessionSuccessResponseData.jsonResponse
|
||||||
|
forKey:@"jsonResponse"];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataSessionSuccess = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *stringSessionSuccess = [[NSString alloc] initWithBytes:[dataSessionSuccess bytes]
|
||||||
|
length:[dataSessionSuccess length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* charArraySessionSuccess = [stringSessionSuccess UTF8String];
|
||||||
|
_sessionSuccessCallback(charArraySessionSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)adjustSessionTrackingFailedWannabe:(ADJSessionFailure *)sessionFailureResponseData {
|
||||||
|
if (nil == sessionFailureResponseData || _sessionFailureCallback == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
|
||||||
|
[self addValueOrEmpty:sessionFailureResponseData.message
|
||||||
|
forKey:@"message"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:sessionFailureResponseData.timestamp
|
||||||
|
forKey:@"timestamp"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[self addValueOrEmpty:sessionFailureResponseData.adid
|
||||||
|
forKey:@"adid"
|
||||||
|
toDictionary:dictionary];
|
||||||
|
[dictionary setObject:(sessionFailureResponseData.willRetry ? @"true" : @"false")
|
||||||
|
forKey:@"willRetry"];
|
||||||
|
if (sessionFailureResponseData.jsonResponse != nil) {
|
||||||
|
[dictionary setObject:sessionFailureResponseData.jsonResponse
|
||||||
|
forKey:@"jsonResponse"];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataSessionFailure = [NSJSONSerialization dataWithJSONObject:dictionary
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *stringSessionFailure = [[NSString alloc] initWithBytes:[dataSessionFailure bytes]
|
||||||
|
length:[dataSessionFailure length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* charArraySessionFailure = [stringSessionFailure UTF8String];
|
||||||
|
_sessionFailureCallback(charArraySessionFailure);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)adjustDeferredDeeplinkReceivedWannabe:(NSURL *)deeplink {
|
||||||
|
if (_deferredDeeplinkCallback != nil) {
|
||||||
|
NSString *stringDeeplink = [deeplink absoluteString];
|
||||||
|
const char* charDeeplink = [stringDeeplink UTF8String];
|
||||||
|
_deferredDeeplinkCallback(charDeeplink);
|
||||||
|
}
|
||||||
|
return _shouldLaunchDeferredDeeplink;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)adjustSkanUpdatedWithConversionDataWannabe:(NSDictionary<NSString *,NSString *> *)data {
|
||||||
|
if (data == nil || _skanUpdatedCallback == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData *dataSkanUpdatedData = [NSJSONSerialization dataWithJSONObject:data
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *strSkanUpdatedData = [[NSString alloc] initWithBytes:[dataSkanUpdatedData bytes]
|
||||||
|
length:[dataSkanUpdatedData length]
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
const char* charSkanUpdatedData = [strSkanUpdatedData UTF8String];
|
||||||
|
_skanUpdatedCallback(charSkanUpdatedData);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)swizzleOriginalSelector:(SEL)originalSelector
|
||||||
|
withSelector:(SEL)swizzledSelector {
|
||||||
|
Class className = [self class];
|
||||||
|
Method originalMethod = class_getInstanceMethod(className, originalSelector);
|
||||||
|
Method swizzledMethod = class_getInstanceMethod(className, swizzledSelector);
|
||||||
|
|
||||||
|
BOOL didAddMethod = class_addMethod(className,
|
||||||
|
originalSelector,
|
||||||
|
method_getImplementation(swizzledMethod),
|
||||||
|
method_getTypeEncoding(swizzledMethod));
|
||||||
|
if (didAddMethod) {
|
||||||
|
class_replaceMethod(className,
|
||||||
|
swizzledSelector,
|
||||||
|
method_getImplementation(originalMethod),
|
||||||
|
method_getTypeEncoding(originalMethod));
|
||||||
|
} else {
|
||||||
|
method_exchangeImplementations(originalMethod, swizzledMethod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)addValueOrEmpty:(NSObject *)value
|
||||||
|
forKey:(NSString *)key
|
||||||
|
toDictionary:(NSMutableDictionary *)dictionary {
|
||||||
|
if (nil != value) {
|
||||||
|
if ([value isKindOfClass:[NSString class]]) {
|
||||||
|
[dictionary setObject:[NSString stringWithFormat:@"%@", value]
|
||||||
|
forKey:key];
|
||||||
|
} else if ([value isKindOfClass:[NSNumber class]]) {
|
||||||
|
[dictionary setObject:[NSString stringWithFormat:@"%@", [((NSNumber *)value) stringValue]]
|
||||||
|
forKey:key];
|
||||||
|
} else {
|
||||||
|
[dictionary setObject:@"" forKey:key];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
[dictionary setObject:@"" forKey:key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 81438eed05b2e4b489f13efc94d5476a
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
'': Any
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
Exclude Android: 1
|
||||||
|
Exclude Editor: 1
|
||||||
|
Exclude Linux: 1
|
||||||
|
Exclude Linux64: 1
|
||||||
|
Exclude LinuxUniversal: 1
|
||||||
|
Exclude OSXIntel: 1
|
||||||
|
Exclude OSXIntel64: 1
|
||||||
|
Exclude OSXUniversal: 1
|
||||||
|
Exclude WebGL: 1
|
||||||
|
Exclude Win: 1
|
||||||
|
Exclude Win64: 1
|
||||||
|
Exclude iOS: 0
|
||||||
|
Exclude tvOS: 1
|
||||||
|
- first:
|
||||||
|
'': Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
OS: AnyOS
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: ARMv7
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Facebook: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Facebook: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Linux64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: LinuxUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: OSXIntel
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXIntel64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
- first:
|
||||||
|
Standalone: OSXUniversal
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: x86
|
||||||
|
- first:
|
||||||
|
Standalone: Win
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
Standalone: Win64
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: None
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CompileFlags:
|
||||||
|
FrameworkDependencies:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0acdd227ad1b8d147ade044242671e15
|
||||||
|
folderAsset: yes
|
||||||
|
timeCreated: 1578652549
|
||||||
|
licenseType: Pro
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &115478
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
serializedVersion: 5
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 415478}
|
||||||
|
- component: {fileID: 114179903453641630}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Adjust
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &415478
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 115478}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_RootOrder: 0
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1001 &100100000
|
||||||
|
Prefab:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
m_TransformParent: {fileID: 0}
|
||||||
|
m_Modifications: []
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_ParentPrefab: {fileID: 0}
|
||||||
|
m_RootGameObject: {fileID: 115478}
|
||||||
|
m_IsPrefabParent: 1
|
||||||
|
--- !u!114 &114179903453641630
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 1
|
||||||
|
m_PrefabParentObject: {fileID: 0}
|
||||||
|
m_PrefabInternal: {fileID: 100100000}
|
||||||
|
m_GameObject: {fileID: 115478}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 525ece82a472e4dea837e1ef938fd15d, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
startManually: 1
|
||||||
|
appToken:
|
||||||
|
environment: 0
|
||||||
|
logLevel: 3
|
||||||
|
eventBuffering: 0
|
||||||
|
sendInBackground: 0
|
||||||
|
launchDeferredDeeplink: 1
|
||||||
|
needsCost: 0
|
||||||
|
coppaCompliant: 0
|
||||||
|
linkMe: 0
|
||||||
|
defaultTracker:
|
||||||
|
urlStrategy: 0
|
||||||
|
startDelay: 0
|
||||||
|
secretId: 0
|
||||||
|
info1: 0
|
||||||
|
info2: 0
|
||||||
|
info3: 0
|
||||||
|
info4: 0
|
||||||
|
preinstallTracking: 0
|
||||||
|
preinstallFilePath:
|
||||||
|
playStoreKidsApp: 0
|
||||||
|
adServicesInfoReading: 1
|
||||||
|
idfaInfoReading: 1
|
||||||
|
skAdNetworkHandling: 1
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a3267720e82aa41c1a05ab29824902b4
|
||||||
|
NativeFormatImporter:
|
||||||
|
mainObjectFileID: -1
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9688945324d3a44699534d71c3e55cb
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: ea4d495dc6d5ba64b90db7afda6a48a4, type: 3}
|
||||||
|
m_Name: AdjustSettings
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
_iOSFrameworkAdSupport: 1
|
||||||
|
_iOSFrameworkAdServices: 0
|
||||||
|
_iOSFrameworkAppTrackingTransparency: 0
|
||||||
|
_iOSFrameworkStoreKit: 0
|
||||||
|
_androidPermissionInternet: 1
|
||||||
|
_androidPermissionInstallReferrerService: 1
|
||||||
|
_androidPermissionAdId: 1
|
||||||
|
_androidPermissionAccessNetworkState: 0
|
||||||
|
_iOSUserTrackingUsageDescription:
|
||||||
|
_iOSUrlIdentifier:
|
||||||
|
_iOSUrlSchemes: []
|
||||||
|
_iOSUniversalLinksDomains: []
|
||||||
|
androidUriSchemes: []
|
||||||
|
_androidCustomActivityName:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 998d67a1c15bc8b4ea727ddd95230724
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0e5ecfef4e691483199f0cdae3eebff2
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,839 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class Adjust : MonoBehaviour
|
||||||
|
{
|
||||||
|
private const string errorMsgEditor = "[Adjust]: SDK can not be used in Editor.";
|
||||||
|
private const string errorMsgStart = "[Adjust]: SDK not started. Start it manually using the 'start' method.";
|
||||||
|
private const string errorMsgPlatform = "[Adjust]: SDK can only be used in Android and iOS apps.";
|
||||||
|
|
||||||
|
// [Header("SDK SETTINGS:")]
|
||||||
|
// [Space(5)]
|
||||||
|
// [Tooltip("If selected, it is expected from you to initialize Adjust SDK from your app code. " +
|
||||||
|
// "Any SDK configuration settings from prefab will be ignored in that case.")]
|
||||||
|
[HideInInspector]
|
||||||
|
public bool startManually = true;
|
||||||
|
[HideInInspector]
|
||||||
|
public string appToken;
|
||||||
|
[HideInInspector]
|
||||||
|
public AdjustEnvironment environment = AdjustEnvironment.Sandbox;
|
||||||
|
[HideInInspector]
|
||||||
|
public AdjustLogLevel logLevel = AdjustLogLevel.Info;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool coppaCompliance = false;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool sendInBackground = false;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool launchDeferredDeeplink = true;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool costDataInAttribution = false;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool linkMe = false;
|
||||||
|
[HideInInspector]
|
||||||
|
public string defaultTracker;
|
||||||
|
|
||||||
|
// [Header("ANDROID SPECIFIC FEATURES:")]
|
||||||
|
// [Space(5)]
|
||||||
|
[HideInInspector]
|
||||||
|
public bool preinstallTracking = false;
|
||||||
|
[HideInInspector]
|
||||||
|
public string preinstallFilePath;
|
||||||
|
|
||||||
|
// [Header("iOS SPECIFIC FEATURES:")]
|
||||||
|
// [Space(5)]
|
||||||
|
[HideInInspector]
|
||||||
|
public bool adServices = true;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool idfaReading = true;
|
||||||
|
[HideInInspector]
|
||||||
|
public bool skanAttribution = true;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DontDestroyOnLoad(transform.gameObject);
|
||||||
|
|
||||||
|
// TODO: double-check the state of Unity on deep linking nowadays
|
||||||
|
#if UNITY_ANDROID && UNITY_2019_2_OR_NEWER
|
||||||
|
Application.deepLinkActivated += (deeplink) =>
|
||||||
|
{
|
||||||
|
Adjust.ProcessDeeplink(new AdjustDeeplink(deeplink));
|
||||||
|
};
|
||||||
|
if (!string.IsNullOrEmpty(Application.absoluteURL))
|
||||||
|
{
|
||||||
|
// cold start and Application.absoluteURL not null so process deep link
|
||||||
|
Adjust.ProcessDeeplink(new AdjustDeeplink(Application.absoluteURL));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!this.startManually)
|
||||||
|
{
|
||||||
|
AdjustConfig adjustConfig = new AdjustConfig(
|
||||||
|
this.appToken,
|
||||||
|
this.environment,
|
||||||
|
(this.logLevel == AdjustLogLevel.Suppress));
|
||||||
|
adjustConfig.LogLevel = this.logLevel;
|
||||||
|
adjustConfig.IsSendingInBackgroundEnabled = this.sendInBackground;
|
||||||
|
adjustConfig.IsDeferredDeeplinkOpeningEnabled = this.launchDeferredDeeplink;
|
||||||
|
adjustConfig.DefaultTracker = this.defaultTracker;
|
||||||
|
// TODO: URL strategy
|
||||||
|
adjustConfig.IsCoppaComplianceEnabled = this.coppaCompliance;
|
||||||
|
adjustConfig.IsCostDataInAttributionEnabled = this.costDataInAttribution;
|
||||||
|
adjustConfig.IsPreinstallTrackingEnabled = this.preinstallTracking;
|
||||||
|
adjustConfig.PreinstallFilePath = this.preinstallFilePath;
|
||||||
|
adjustConfig.IsAdServicesEnabled = this.adServices;
|
||||||
|
adjustConfig.IsIdfaReadingEnabled = this.idfaReading;
|
||||||
|
adjustConfig.IsLinkMeEnabled = this.linkMe;
|
||||||
|
adjustConfig.IsSkanAttributionEnabled = this.skanAttribution;
|
||||||
|
Adjust.InitSdk(adjustConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void InitSdk(AdjustConfig adjustConfig)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adjustConfig == null)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Missing config to start.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.InitSdk(adjustConfig);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.InitSdk(adjustConfig);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TrackEvent(AdjustEvent adjustEvent)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adjustEvent == null)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Missing event to track.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.TrackEvent(adjustEvent);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.TrackEvent(adjustEvent);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Enable()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.Enable();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.Enable();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Disable()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.Disable();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.Disable();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void IsEnabled(Action<bool> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.IsEnabled(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.IsEnabled(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SwitchToOfflineMode()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.SwitchToOfflineMode();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.SwitchToOfflineMode();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SwitchBackToOnlineMode()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.SwitchBackToOnlineMode();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.SwitchBackToOnlineMode();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetPushToken(string pushToken)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.SetPushToken(pushToken);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.SetPushToken(pushToken);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GdprForgetMe()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GdprForgetMe();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GdprForgetMe();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ProcessDeeplink(AdjustDeeplink deeplink)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.ProcessDeeplink(deeplink);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.ProcessDeeplink(deeplink);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddGlobalPartnerParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.AddGlobalPartnerParameter(key, value);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.AddGlobalPartnerParameter(key, value);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddGlobalCallbackParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.AddGlobalCallbackParameter(key, value);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.AddGlobalCallbackParameter(key, value);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveGlobalPartnerParameter(string key)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.RemoveGlobalPartnerParameter(key);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.RemoveGlobalPartnerParameter(key);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveGlobalCallbackParameter(string key)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.RemoveGlobalCallbackParameter(key);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.RemoveGlobalCallbackParameter(key);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveGlobalPartnerParameters()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.RemoveGlobalPartnerParameters();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.RemoveGlobalPartnerParameters();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveGlobalCallbackParameters()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.RemoveGlobalCallbackParameters();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.RemoveGlobalCallbackParameters();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TrackAdRevenue(AdjustAdRevenue adRevenue)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.TrackAdRevenue(adRevenue);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.TrackAdRevenue(adRevenue);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TrackAppStoreSubscription(AdjustAppStoreSubscription subscription)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.TrackAppStoreSubscription(subscription);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: App Store subscription tracking is only supported for iOS platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TrackPlayStoreSubscription(AdjustPlayStoreSubscription subscription)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Play Store subscription tracking is only supported for Android platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.TrackPlayStoreSubscription(subscription);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TrackThirdPartySharing(AdjustThirdPartySharing thirdPartySharing)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.TrackThirdPartySharing(thirdPartySharing);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.TrackThirdPartySharing(thirdPartySharing);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TrackMeasurementConsent(bool measurementConsent)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.TrackMeasurementConsent(measurementConsent);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.TrackMeasurementConsent(measurementConsent);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RequestAppTrackingAuthorization(Action<int> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.RequestAppTrackingAuthorization(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: Requesting tracking authorization is only supported for iOS platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateSkanConversionValue(
|
||||||
|
int conversionValue,
|
||||||
|
string coarseValue,
|
||||||
|
bool lockWindow,
|
||||||
|
Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.UpdateSkanConversionValue(conversionValue, coarseValue, lockWindow, callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: Updating SKAdNetwork conversion value is only supported for iOS platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetAppTrackingAuthorizationStatus()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
return AdjustiOS.GetAppTrackingAuthorizationStatus();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: Error! App tracking authorization status is only supported for iOS platform.");
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetAdid(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GetAdid(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GetAdid(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetAttribution(Action<AdjustAttribution> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GetAttribution(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GetAttribution(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetIdfa(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GetIdfa(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: Error! IDFA is not available on Android platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetIdfv(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GetIdfv(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: Error! IDFV is not available on Android platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetGoogleAdId(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Error! Google Advertising ID is not available on iOS platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GetGoogleAdId(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetAmazonAdId(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Error! Amazon Fire Advertising ID is not available on iOS platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GetAmazonAdId(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetSdkVersion(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GetSdkVersion(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GetSdkVersion(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetLastDeeplink(Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.GetLastDeeplink(callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.GetLastDeeplink(callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void VerifyAppStorePurchase(
|
||||||
|
AdjustAppStorePurchase purchase,
|
||||||
|
Action<AdjustPurchaseVerificationResult> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.VerifyAppStorePurchase(purchase, callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: App Store purchase verification is only supported for iOS platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void VerifyPlayStorePurchase(
|
||||||
|
AdjustPlayStorePurchase purchase,
|
||||||
|
Action<AdjustPurchaseVerificationResult> verificationResultCallback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Play Store purchase verification is only supported for Android platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.VerifyPlayStorePurchase(purchase, verificationResultCallback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ProcessAndResolveDeeplink(AdjustDeeplink deeplink, Action<string> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.ProcessAndResolveDeeplink(deeplink, callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.ProcessAndResolveDeeplink(deeplink, callback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void VerifyAndTrackAppStorePurchase(
|
||||||
|
AdjustEvent adjustEvent,
|
||||||
|
Action<AdjustPurchaseVerificationResult> callback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.VerifyAndTrackAppStorePurchase(adjustEvent, callback);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
Debug.Log("[Adjust]: App Store purchase verification is only supported for iOS platform.");
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void VerifyAndTrackPlayStorePurchase(
|
||||||
|
AdjustEvent adjustEvent,
|
||||||
|
Action<AdjustPurchaseVerificationResult> verificationResultCallback)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Play Store purchase verification is only supported for Android platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.VerifyAndTrackPlayStorePurchase(adjustEvent, verificationResultCallback);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EndFirstSessionDelay()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.EndFirstSessionDelay();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.EndFirstSessionDelay();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EnableCoppaComplianceInDelay()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.EnableCoppaComplianceInDelay();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.EnableCoppaComplianceInDelay();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DisableCoppaComplianceInDelay()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.DisableCoppaComplianceInDelay();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.DisableCoppaComplianceInDelay();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EnablePlayStoreKidsComplianceInDelay()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Play Store kids feature is only supported for Android platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.EnablePlayStoreKidsComplianceInDelay();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DisablePlayStoreKidsComplianceInDelay()
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Play Store kids feature is only supported for Android platform.");
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.DisablePlayStoreKidsComplianceInDelay();
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetExternalDeviceIdInDelay(string externalDeviceId)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.SetExternalDeviceIdInDelay(externalDeviceId);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.SetExternalDeviceIdInDelay(externalDeviceId);
|
||||||
|
#else
|
||||||
|
Debug.Log(errorMsgPlatform);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsEditor()
|
||||||
|
{
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
Debug.Log(errorMsgEditor);
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetTestOptions(Dictionary<string, string> testOptions)
|
||||||
|
{
|
||||||
|
if (IsEditor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
AdjustiOS.SetTestOptions(testOptions);
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
AdjustAndroid.SetTestOptions(testOptions);
|
||||||
|
#else
|
||||||
|
Debug.Log("[Adjust]: Cannot run integration tests. None of the supported platforms selected.");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 525ece82a472e4dea837e1ef938fd15d
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustAdRevenue
|
||||||
|
{
|
||||||
|
private List<string> innerCallbackParameters;
|
||||||
|
private List<string> innerPartnerParameters;
|
||||||
|
|
||||||
|
public string Source { get; private set; }
|
||||||
|
public double? Revenue { get; private set; }
|
||||||
|
public string Currency { get; private set; }
|
||||||
|
public int? AdImpressionsCount { get; set; }
|
||||||
|
public string AdRevenueNetwork { get; set; }
|
||||||
|
public string AdRevenueUnit { get; set; }
|
||||||
|
public string AdRevenuePlacement { get; set; }
|
||||||
|
public ReadOnlyCollection<string> CallbackParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerCallbackParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ReadOnlyCollection<string> PartnerParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerPartnerParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustAdRevenue(string source)
|
||||||
|
{
|
||||||
|
this.Source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetRevenue(double revenue, string currency)
|
||||||
|
{
|
||||||
|
this.Revenue = revenue;
|
||||||
|
this.Currency = currency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCallbackParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
this.innerCallbackParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerCallbackParameters.Add(key);
|
||||||
|
this.innerCallbackParameters.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPartnerParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
this.innerPartnerParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerPartnerParameters.Add(key);
|
||||||
|
this.innerPartnerParameters.Add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 776a9d4b715bc44c68724248a5a75cb9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 04f57a99ef137445992d048a89c36788
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustAppStorePurchase
|
||||||
|
{
|
||||||
|
public string TransactionId { get; private set; }
|
||||||
|
public string ProductId { get; private set; }
|
||||||
|
|
||||||
|
public AdjustAppStorePurchase(string transactionId, string productId)
|
||||||
|
{
|
||||||
|
this.TransactionId = transactionId;
|
||||||
|
this.ProductId = productId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 828a981c8c96741afa5d16ccb679e5af
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustAppStoreSubscription
|
||||||
|
{
|
||||||
|
private List<string> innerCallbackParameters;
|
||||||
|
private List<string> innerPartnerParameters;
|
||||||
|
|
||||||
|
public string Price { get; private set; }
|
||||||
|
public string Currency { get; private set; }
|
||||||
|
public string TransactionId { get; private set; }
|
||||||
|
public string TransactionDate { get; set; }
|
||||||
|
public string SalesRegion { get; set; }
|
||||||
|
public ReadOnlyCollection<string> CallbackParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerCallbackParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ReadOnlyCollection<string> PartnerParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerPartnerParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustAppStoreSubscription(string price, string currency, string transactionId)
|
||||||
|
{
|
||||||
|
this.Price = price;
|
||||||
|
this.Currency = currency;
|
||||||
|
this.TransactionId = transactionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCallbackParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
this.innerCallbackParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerCallbackParameters.Add(key);
|
||||||
|
this.innerCallbackParameters.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPartnerParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
this.innerPartnerParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerPartnerParameters.Add(key);
|
||||||
|
this.innerPartnerParameters.Add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7e2d69221b1124370a4c016edce5a95a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,117 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustAttribution
|
||||||
|
{
|
||||||
|
public string TrackerToken { get; set; }
|
||||||
|
public string TrackerName { get; set; }
|
||||||
|
public string Network { get; set; }
|
||||||
|
public string Campaign { get; set; }
|
||||||
|
public string Adgroup { get; set; }
|
||||||
|
public string Creative { get; set; }
|
||||||
|
public string ClickLabel { get; set; }
|
||||||
|
public string CostType { get; set; }
|
||||||
|
public double? CostAmount { get; set; }
|
||||||
|
public string CostCurrency { get; set; }
|
||||||
|
public Dictionary<string, object> JsonResponse { get; set; }
|
||||||
|
// Android only
|
||||||
|
public string FbInstallReferrer { get; set; }
|
||||||
|
|
||||||
|
public AdjustAttribution() {}
|
||||||
|
|
||||||
|
public AdjustAttribution(string jsonString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.TrackerName = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyTrackerName);
|
||||||
|
this.TrackerToken = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyTrackerToken);
|
||||||
|
this.Network = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyNetwork);
|
||||||
|
this.Campaign = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCampaign);
|
||||||
|
this.Adgroup = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdgroup);
|
||||||
|
this.Creative = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCreative);
|
||||||
|
this.ClickLabel = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyClickLabel);
|
||||||
|
this.CostType = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCostType);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.CostAmount = double.Parse(
|
||||||
|
AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCostAmount),
|
||||||
|
System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// attribution response doesn't contain cost amount attached
|
||||||
|
// value will default to null
|
||||||
|
}
|
||||||
|
this.CostCurrency = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCostCurrency);
|
||||||
|
this.FbInstallReferrer = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyFbInstallReferrer);
|
||||||
|
|
||||||
|
var jsonResponseValue = jsonNode[AdjustUtils.KeyJsonResponse];
|
||||||
|
if (jsonResponseValue == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.JsonResponse = AdjustUtils.GetAttributionJsonResponse(jsonResponseValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustAttribution(Dictionary<string, string> dicAttributionData)
|
||||||
|
{
|
||||||
|
if (dicAttributionData == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.TrackerName = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyTrackerName);
|
||||||
|
this.TrackerToken = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyTrackerToken);
|
||||||
|
this.Network = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyNetwork);
|
||||||
|
this.Campaign = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCampaign);
|
||||||
|
this.Adgroup = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyAdgroup);
|
||||||
|
this.Creative = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCreative);
|
||||||
|
this.ClickLabel = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyClickLabel);
|
||||||
|
this.CostType = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCostType);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.CostAmount = double.Parse(
|
||||||
|
AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCostAmount),
|
||||||
|
System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// attribution response doesn't contain cost amount attached
|
||||||
|
// value will default to null
|
||||||
|
}
|
||||||
|
this.CostCurrency = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCostCurrency);
|
||||||
|
this.FbInstallReferrer = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyFbInstallReferrer);
|
||||||
|
|
||||||
|
string jsonResponseString = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyJsonResponse);
|
||||||
|
var jsonResponseNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonResponseNode != null && jsonResponseNode.AsObject != null)
|
||||||
|
{
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, this.JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildJsonResponseFromString(string jsonResponseString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetJsonResponseAsString()
|
||||||
|
{
|
||||||
|
return AdjustUtils.GetJsonResponseCompact(JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cc46748ad0e664f6d839a4f1a23d9f47
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustConfig
|
||||||
|
{
|
||||||
|
public string AppToken { get; private set; }
|
||||||
|
public string DefaultTracker { get; set; }
|
||||||
|
public string ExternalDeviceId { get; set; }
|
||||||
|
public bool? IsCoppaComplianceEnabled { get; set; }
|
||||||
|
public bool? IsSendingInBackgroundEnabled { get; set; }
|
||||||
|
public bool? IsCostDataInAttributionEnabled { get; set; }
|
||||||
|
public bool? IsDeviceIdsReadingOnceEnabled { get; set; }
|
||||||
|
public bool? IsDeferredDeeplinkOpeningEnabled { get; set; }
|
||||||
|
public bool? IsAppTrackingTransparencyUsageEnabled { get; set; }
|
||||||
|
public bool? IsFirstSessionDelayEnabled { get; set; }
|
||||||
|
public bool? AllowSuppressLogLevel { get; private set; }
|
||||||
|
public bool? IsDataResidency { get; private set; }
|
||||||
|
public bool? ShouldUseSubdomains { get; private set; }
|
||||||
|
public int? EventDeduplicationIdsMaxSize { get; set; }
|
||||||
|
public List<string> UrlStrategyDomains { get; private set; }
|
||||||
|
public AdjustLogLevel? LogLevel { get; set; }
|
||||||
|
public AdjustEnvironment Environment { get; private set; }
|
||||||
|
public AdjustStoreInfo StoreInfo { get; set; }
|
||||||
|
public Action<AdjustAttribution> AttributionChangedDelegate { get; set; }
|
||||||
|
public Action<AdjustEventSuccess> EventSuccessDelegate { get; set; }
|
||||||
|
public Action<AdjustEventFailure> EventFailureDelegate { get; set; }
|
||||||
|
public Action<AdjustSessionSuccess> SessionSuccessDelegate { get; set; }
|
||||||
|
public Action<AdjustSessionFailure> SessionFailureDelegate { get; set; }
|
||||||
|
public Action<string> DeferredDeeplinkDelegate { get; set; }
|
||||||
|
public Action<Dictionary<string, string>> SkanUpdatedDelegate { get; set; }
|
||||||
|
|
||||||
|
// iOS specific
|
||||||
|
public bool? IsAdServicesEnabled { get; set; }
|
||||||
|
public bool? IsIdfaReadingEnabled { get; set; }
|
||||||
|
public bool? IsIdfvReadingEnabled { get; set; }
|
||||||
|
public bool? IsSkanAttributionEnabled { get; set; }
|
||||||
|
public bool? IsLinkMeEnabled { get; set; }
|
||||||
|
public int? AttConsentWaitingInterval { get; set; }
|
||||||
|
|
||||||
|
// Android specific
|
||||||
|
public bool? IsPlayStoreKidsComplianceEnabled { get; set; }
|
||||||
|
public bool? IsPreinstallTrackingEnabled { get; set; }
|
||||||
|
public string PreinstallFilePath { get; set; }
|
||||||
|
public string FbAppId { get; set; }
|
||||||
|
|
||||||
|
public AdjustConfig(string appToken, AdjustEnvironment environment)
|
||||||
|
{
|
||||||
|
this.AppToken = appToken;
|
||||||
|
this.Environment = environment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustConfig(string appToken, AdjustEnvironment environment, bool allowSuppressLogLevel)
|
||||||
|
{
|
||||||
|
this.AppToken = appToken;
|
||||||
|
this.Environment = environment;
|
||||||
|
this.AllowSuppressLogLevel = allowSuppressLogLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetUrlStrategy(
|
||||||
|
List<string> urlStrategyDomains,
|
||||||
|
bool shouldUseSubdomains,
|
||||||
|
bool isDataResidency)
|
||||||
|
{
|
||||||
|
this.UrlStrategyDomains = urlStrategyDomains;
|
||||||
|
this.ShouldUseSubdomains = shouldUseSubdomains;
|
||||||
|
this.IsDataResidency = isDataResidency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 02d4cad14fc094b17afde3b685897e5e
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustDeeplink
|
||||||
|
{
|
||||||
|
public string Deeplink { get; private set; }
|
||||||
|
public string Referrer { get; set; }
|
||||||
|
|
||||||
|
public AdjustDeeplink(string deeplink)
|
||||||
|
{
|
||||||
|
this.Deeplink = deeplink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 40e25efef61754d66a47cd3e62a7f6bc
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
public enum AdjustEnvironment
|
||||||
|
{
|
||||||
|
Sandbox,
|
||||||
|
Production
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AdjustEnvironmentExtension
|
||||||
|
{
|
||||||
|
public static string ToLowercaseString(this AdjustEnvironment adjustEnvironment)
|
||||||
|
{
|
||||||
|
switch (adjustEnvironment)
|
||||||
|
{
|
||||||
|
case AdjustEnvironment.Sandbox:
|
||||||
|
return "sandbox";
|
||||||
|
case AdjustEnvironment.Production:
|
||||||
|
return "production";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 633f6fa279b2244fdb999db0441f9aac
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustEvent
|
||||||
|
{
|
||||||
|
private List<string> innerCallbackParameters;
|
||||||
|
private List<string> innerPartnerParameters;
|
||||||
|
|
||||||
|
public string EventToken { get; private set; }
|
||||||
|
public double? Revenue { get; private set; }
|
||||||
|
public string Currency { get; private set; }
|
||||||
|
public string CallbackId { get; set; }
|
||||||
|
public string DeduplicationId { get; set; }
|
||||||
|
public string ProductId { get; set; }
|
||||||
|
public ReadOnlyCollection<string> CallbackParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerCallbackParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ReadOnlyCollection<string> PartnerParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerPartnerParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ios specific
|
||||||
|
public string TransactionId { get; set; }
|
||||||
|
// android specific
|
||||||
|
public string PurchaseToken;
|
||||||
|
|
||||||
|
public AdjustEvent(string eventToken)
|
||||||
|
{
|
||||||
|
this.EventToken = eventToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetRevenue(double amount, string currency)
|
||||||
|
{
|
||||||
|
this.Revenue = amount;
|
||||||
|
this.Currency = currency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCallbackParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
this.innerCallbackParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerCallbackParameters.Add(key);
|
||||||
|
this.innerCallbackParameters.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPartnerParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
this.innerPartnerParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerPartnerParameters.Add(key);
|
||||||
|
this.innerPartnerParameters.Add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cd89f7713977f497a862f1a1b6f60933
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustEventFailure
|
||||||
|
{
|
||||||
|
public string Adid { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
public string Timestamp { get; set; }
|
||||||
|
public string EventToken { get; set; }
|
||||||
|
public string CallbackId { get; set; }
|
||||||
|
public bool WillRetry { get; set; }
|
||||||
|
public Dictionary<string, object> JsonResponse { get; set; }
|
||||||
|
|
||||||
|
public AdjustEventFailure() {}
|
||||||
|
|
||||||
|
public AdjustEventFailure(Dictionary<string, string> eventFailureDataMap)
|
||||||
|
{
|
||||||
|
if (eventFailureDataMap == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyTimestamp);
|
||||||
|
this.EventToken = AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyEventToken);
|
||||||
|
this.CallbackId = AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyCallbackId);
|
||||||
|
|
||||||
|
bool willRetry;
|
||||||
|
if (bool.TryParse(AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyWillRetry), out willRetry))
|
||||||
|
{
|
||||||
|
this.WillRetry = willRetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
string jsonResponseString = AdjustUtils.TryGetValue(eventFailureDataMap, AdjustUtils.KeyJsonResponse);
|
||||||
|
var jsonResponseNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonResponseNode != null && jsonResponseNode.AsObject != null)
|
||||||
|
{
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustEventFailure(string jsonString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyTimestamp);
|
||||||
|
this.EventToken = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyEventToken);
|
||||||
|
this.CallbackId = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCallbackId);
|
||||||
|
this.WillRetry = Convert.ToBoolean(AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyWillRetry));
|
||||||
|
|
||||||
|
var jsonResponseNode = jsonNode[AdjustUtils.KeyJsonResponse];
|
||||||
|
if (jsonResponseNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (jsonResponseNode.AsObject == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildJsonResponseFromString(string jsonResponseString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetJsonResponseAsString()
|
||||||
|
{
|
||||||
|
return AdjustUtils.GetJsonResponseCompact(JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ea86cd4e1c6d0496397920902d0f0b5f
|
||||||
|
timeCreated: 1458128791
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustEventSuccess
|
||||||
|
{
|
||||||
|
public string Adid { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
public string Timestamp { get; set; }
|
||||||
|
public string EventToken { get; set; }
|
||||||
|
public string CallbackId { get; set; }
|
||||||
|
public Dictionary<string, object> JsonResponse { get; set; }
|
||||||
|
|
||||||
|
public AdjustEventSuccess() {}
|
||||||
|
|
||||||
|
public AdjustEventSuccess(Dictionary<string, string> eventSuccessDataMap)
|
||||||
|
{
|
||||||
|
if (eventSuccessDataMap == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.TryGetValue(eventSuccessDataMap, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.TryGetValue(eventSuccessDataMap, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.TryGetValue(eventSuccessDataMap, AdjustUtils.KeyTimestamp);
|
||||||
|
this.EventToken = AdjustUtils.TryGetValue(eventSuccessDataMap, AdjustUtils.KeyEventToken);
|
||||||
|
this.CallbackId = AdjustUtils.TryGetValue(eventSuccessDataMap, AdjustUtils.KeyCallbackId);
|
||||||
|
|
||||||
|
string jsonResponseString = AdjustUtils.TryGetValue(eventSuccessDataMap, AdjustUtils.KeyJsonResponse);
|
||||||
|
var jsonResponseNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonResponseNode != null && jsonResponseNode.AsObject != null)
|
||||||
|
{
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustEventSuccess(string jsonString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyTimestamp);
|
||||||
|
this.EventToken = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyEventToken);
|
||||||
|
this.CallbackId = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCallbackId);
|
||||||
|
|
||||||
|
var jsonResponseNode = jsonNode[AdjustUtils.KeyJsonResponse];
|
||||||
|
if (jsonResponseNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (jsonResponseNode.AsObject == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildJsonResponseFromString(string jsonResponseString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetJsonResponseAsString()
|
||||||
|
{
|
||||||
|
return AdjustUtils.GetJsonResponseCompact(JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1957a0e6e9aa14f0e8adefa2120f1e02
|
||||||
|
timeCreated: 1458128791
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
public enum AdjustLogLevel
|
||||||
|
{
|
||||||
|
Verbose = 1,
|
||||||
|
Debug,
|
||||||
|
Info,
|
||||||
|
Warn,
|
||||||
|
Error,
|
||||||
|
Assert,
|
||||||
|
Suppress
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AdjustLogLevelExtension
|
||||||
|
{
|
||||||
|
public static string ToLowercaseString(this AdjustLogLevel AdjustLogLevel)
|
||||||
|
{
|
||||||
|
switch (AdjustLogLevel)
|
||||||
|
{
|
||||||
|
case AdjustLogLevel.Verbose:
|
||||||
|
return "verbose";
|
||||||
|
case AdjustLogLevel.Debug:
|
||||||
|
return "debug";
|
||||||
|
case AdjustLogLevel.Info:
|
||||||
|
return "info";
|
||||||
|
case AdjustLogLevel.Warn:
|
||||||
|
return "warn";
|
||||||
|
case AdjustLogLevel.Error:
|
||||||
|
return "error";
|
||||||
|
case AdjustLogLevel.Assert:
|
||||||
|
return "assert";
|
||||||
|
case AdjustLogLevel.Suppress:
|
||||||
|
return "suppress";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToUppercaseString(this AdjustLogLevel AdjustLogLevel)
|
||||||
|
{
|
||||||
|
switch (AdjustLogLevel)
|
||||||
|
{
|
||||||
|
case AdjustLogLevel.Verbose:
|
||||||
|
return "VERBOSE";
|
||||||
|
case AdjustLogLevel.Debug:
|
||||||
|
return "DEBUG";
|
||||||
|
case AdjustLogLevel.Info:
|
||||||
|
return "INFO";
|
||||||
|
case AdjustLogLevel.Warn:
|
||||||
|
return "WARN";
|
||||||
|
case AdjustLogLevel.Error:
|
||||||
|
return "ERROR";
|
||||||
|
case AdjustLogLevel.Assert:
|
||||||
|
return "ASSERT";
|
||||||
|
case AdjustLogLevel.Suppress:
|
||||||
|
return "SUPPRESS";
|
||||||
|
default:
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 428ab44990df24973902248a9d2b43dd
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustPlayStorePurchase
|
||||||
|
{
|
||||||
|
public string ProductId { get; private set; }
|
||||||
|
public string PurchaseToken { get; private set; }
|
||||||
|
|
||||||
|
public AdjustPlayStorePurchase(string productId, string purchaseToken)
|
||||||
|
{
|
||||||
|
this.ProductId = productId;
|
||||||
|
this.PurchaseToken = purchaseToken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d875a71a5aeb1496d93afac749ab17f6
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustPlayStoreSubscription
|
||||||
|
{
|
||||||
|
private List<string> innerCallbackParameters;
|
||||||
|
private List<string> innerPartnerParameters;
|
||||||
|
|
||||||
|
public string Price { get; private set; }
|
||||||
|
public string Currency { get; private set; }
|
||||||
|
public string ProductId { get; private set; }
|
||||||
|
public string OrderId { get; private set; }
|
||||||
|
public string Signature { get; private set; }
|
||||||
|
public string PurchaseToken { get; private set; }
|
||||||
|
public string PurchaseTime { get; set; }
|
||||||
|
public ReadOnlyCollection<string> CallbackParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerCallbackParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ReadOnlyCollection<string> PartnerParameters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerPartnerParameters.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustPlayStoreSubscription(
|
||||||
|
string price,
|
||||||
|
string currency,
|
||||||
|
string productId,
|
||||||
|
string orderId,
|
||||||
|
string signature,
|
||||||
|
string purchaseToken)
|
||||||
|
{
|
||||||
|
this.Price = price;
|
||||||
|
this.Currency = currency;
|
||||||
|
this.ProductId = productId;
|
||||||
|
this.OrderId = orderId;
|
||||||
|
this.Signature = signature;
|
||||||
|
this.PurchaseToken = purchaseToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCallbackParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerCallbackParameters == null)
|
||||||
|
{
|
||||||
|
this.innerCallbackParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerCallbackParameters.Add(key);
|
||||||
|
this.innerCallbackParameters.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPartnerParameter(string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerPartnerParameters == null)
|
||||||
|
{
|
||||||
|
this.innerPartnerParameters = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerPartnerParameters.Add(key);
|
||||||
|
this.innerPartnerParameters.Add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 69e7a4074abb44758b3f011d8352a57a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustPurchaseVerificationResult
|
||||||
|
{
|
||||||
|
public int Code { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
public string VerificationStatus { get; set; }
|
||||||
|
|
||||||
|
public AdjustPurchaseVerificationResult() {}
|
||||||
|
|
||||||
|
public AdjustPurchaseVerificationResult(string jsonString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string strCode = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCode);
|
||||||
|
this.Code = int.Parse(strCode);
|
||||||
|
this.Message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage);
|
||||||
|
this.VerificationStatus = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyVerificationStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cbd451b59ec374fa7b72f226b1cef0b4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"name": "AdjustSdk.Scripts",
|
||||||
|
"references": [],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": []
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7d8924c6e6beb44e18f19e8c0b5068cd
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustSessionFailure
|
||||||
|
{
|
||||||
|
public string Adid { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
public string Timestamp { get; set; }
|
||||||
|
public bool WillRetry { get; set; }
|
||||||
|
public Dictionary<string, object> JsonResponse { get; set; }
|
||||||
|
|
||||||
|
public AdjustSessionFailure() {}
|
||||||
|
|
||||||
|
public AdjustSessionFailure(Dictionary<string, string> sessionFailureDataMap)
|
||||||
|
{
|
||||||
|
if (sessionFailureDataMap == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.TryGetValue(sessionFailureDataMap, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.TryGetValue(sessionFailureDataMap, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.TryGetValue(sessionFailureDataMap, AdjustUtils.KeyTimestamp);
|
||||||
|
|
||||||
|
bool willRetry;
|
||||||
|
if (bool.TryParse(AdjustUtils.TryGetValue(sessionFailureDataMap, AdjustUtils.KeyWillRetry), out willRetry))
|
||||||
|
{
|
||||||
|
this.WillRetry = willRetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
string jsonResponseString = AdjustUtils.TryGetValue(sessionFailureDataMap, AdjustUtils.KeyJsonResponse);
|
||||||
|
var jsonResponseNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonResponseNode != null && jsonResponseNode.AsObject != null)
|
||||||
|
{
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustSessionFailure(string jsonString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyTimestamp);
|
||||||
|
this.WillRetry = Convert.ToBoolean(AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyWillRetry));
|
||||||
|
|
||||||
|
var jsonResponseNode = jsonNode[AdjustUtils.KeyJsonResponse];
|
||||||
|
if (jsonResponseNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (jsonResponseNode.AsObject == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildJsonResponseFromString(string jsonResponseString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetJsonResponseAsString()
|
||||||
|
{
|
||||||
|
return AdjustUtils.GetJsonResponseCompact(JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b4de268ab985448a594fb82264190742
|
||||||
|
timeCreated: 1458128791
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustSessionSuccess
|
||||||
|
{
|
||||||
|
public string Adid { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
public string Timestamp { get; set; }
|
||||||
|
public Dictionary<string, object> JsonResponse { get; set; }
|
||||||
|
|
||||||
|
public AdjustSessionSuccess() {}
|
||||||
|
|
||||||
|
public AdjustSessionSuccess(Dictionary<string, string> sessionSuccessDataMap)
|
||||||
|
{
|
||||||
|
if (sessionSuccessDataMap == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.TryGetValue(sessionSuccessDataMap, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.TryGetValue(sessionSuccessDataMap, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.TryGetValue(sessionSuccessDataMap, AdjustUtils.KeyTimestamp);
|
||||||
|
|
||||||
|
string jsonResponseString = AdjustUtils.TryGetValue(sessionSuccessDataMap, AdjustUtils.KeyJsonResponse);
|
||||||
|
var jsonResponseNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonResponseNode != null && jsonResponseNode.AsObject != null)
|
||||||
|
{
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustSessionSuccess(string jsonString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Adid = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdid);
|
||||||
|
this.Message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage);
|
||||||
|
this.Timestamp = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyTimestamp);
|
||||||
|
|
||||||
|
var jsonResponseNode = jsonNode[AdjustUtils.KeyJsonResponse];
|
||||||
|
if (jsonResponseNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (jsonResponseNode.AsObject == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonResponseNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildJsonResponseFromString(string jsonResponseString)
|
||||||
|
{
|
||||||
|
var jsonNode = JSON.Parse(jsonResponseString);
|
||||||
|
if (jsonNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.JsonResponse = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(jsonNode.AsObject, JsonResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetJsonResponseAsString()
|
||||||
|
{
|
||||||
|
return AdjustUtils.GetJsonResponseCompact(JsonResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c23847e7a1f464d7a8c7f9b35829af17
|
||||||
|
timeCreated: 1458128791
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustStoreInfo
|
||||||
|
{
|
||||||
|
public string StoreName { get; private set; }
|
||||||
|
public string StoreAppId { get; set; }
|
||||||
|
|
||||||
|
public AdjustStoreInfo(string storeName)
|
||||||
|
{
|
||||||
|
this.StoreName = storeName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 09215b0ccf65143ae91e6fa6cdca34b9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustThirdPartySharing
|
||||||
|
{
|
||||||
|
private List<string> innerGranularOptions;
|
||||||
|
private List<string> innerPartnerSharingSettings;
|
||||||
|
|
||||||
|
public bool? IsEnabled { get; private set; }
|
||||||
|
public ReadOnlyCollection<string> GranularOptions
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerGranularOptions == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerGranularOptions.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ReadOnlyCollection<string> PartnerSharingSettings
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (innerPartnerSharingSettings == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return innerPartnerSharingSettings.AsReadOnly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdjustThirdPartySharing(bool? isEnabled)
|
||||||
|
{
|
||||||
|
this.IsEnabled = isEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddGranularOption(string partnerName, string key, string value)
|
||||||
|
{
|
||||||
|
if (this.innerGranularOptions == null)
|
||||||
|
{
|
||||||
|
this.innerGranularOptions = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerGranularOptions.Add(partnerName);
|
||||||
|
this.innerGranularOptions.Add(key);
|
||||||
|
this.innerGranularOptions.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddPartnerSharingSetting(string partnerName, string key, bool value)
|
||||||
|
{
|
||||||
|
if (this.innerPartnerSharingSettings == null)
|
||||||
|
{
|
||||||
|
this.innerPartnerSharingSettings = new List<string>();
|
||||||
|
}
|
||||||
|
this.innerPartnerSharingSettings.Add(partnerName);
|
||||||
|
this.innerPartnerSharingSettings.Add(key);
|
||||||
|
this.innerPartnerSharingSettings.Add(value.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dcb2591dfab904327904b8879af699ca
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class AdjustThreadDispatcher : MonoBehaviour
|
||||||
|
{
|
||||||
|
private static readonly Queue<Action> executionQueue = new Queue<Action>();
|
||||||
|
private static AdjustThreadDispatcher instance;
|
||||||
|
|
||||||
|
public static void RunOnMainThread(Action action)
|
||||||
|
{
|
||||||
|
if (action == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (executionQueue)
|
||||||
|
{
|
||||||
|
executionQueue.Enqueue(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
while (executionQueue.Count > 0)
|
||||||
|
{
|
||||||
|
Action action;
|
||||||
|
lock (executionQueue)
|
||||||
|
{
|
||||||
|
action = executionQueue.Dequeue();
|
||||||
|
}
|
||||||
|
if (action != null)
|
||||||
|
{
|
||||||
|
action.Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
||||||
|
private static void Initialize()
|
||||||
|
{
|
||||||
|
if (instance == null)
|
||||||
|
{
|
||||||
|
GameObject obj = new GameObject("AdjustThreadDispatcher");
|
||||||
|
instance = obj.AddComponent<AdjustThreadDispatcher>();
|
||||||
|
DontDestroyOnLoad(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 068759bba95d0411895637c9165b2f99
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,448 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustUtils
|
||||||
|
{
|
||||||
|
public static string KeyAdid = "adid";
|
||||||
|
public static string KeyMessage = "message";
|
||||||
|
public static string KeyNetwork = "network";
|
||||||
|
public static string KeyAdgroup = "adgroup";
|
||||||
|
public static string KeyCampaign = "campaign";
|
||||||
|
public static string KeyCreative = "creative";
|
||||||
|
public static string KeyWillRetry = "willRetry";
|
||||||
|
public static string KeyTimestamp = "timestamp";
|
||||||
|
public static string KeyCallbackId = "callbackId";
|
||||||
|
public static string KeyEventToken = "eventToken";
|
||||||
|
public static string KeyClickLabel = "clickLabel";
|
||||||
|
public static string KeyTrackerName = "trackerName";
|
||||||
|
public static string KeyTrackerToken = "trackerToken";
|
||||||
|
public static string KeyJsonResponse = "jsonResponse";
|
||||||
|
public static string KeyCostType = "costType";
|
||||||
|
public static string KeyCostAmount = "costAmount";
|
||||||
|
public static string KeyCostCurrency = "costCurrency";
|
||||||
|
public static string KeyFbInstallReferrer = "fbInstallReferrer";
|
||||||
|
public static string KeySkanConversionValue = "fineValue";
|
||||||
|
public static string KeySkanCoarseValue = "coarseValue";
|
||||||
|
public static string KeySkanLockWindow = "lockWindow";
|
||||||
|
public static string KeyCode = "code";
|
||||||
|
public static string KeyVerificationStatus = "verificationStatus";
|
||||||
|
|
||||||
|
// For testing purposes.
|
||||||
|
public static string KeyTestOptionsBaseUrl = "baseUrl";
|
||||||
|
public static string KeyTestOptionsGdprUrl = "gdprUrl";
|
||||||
|
public static string KeyTestOptionsSubscriptionUrl = "subscriptionUrl";
|
||||||
|
public static string KeyTestOptionsPurchaseVerificationUrl = "purchaseVerificationUrl";
|
||||||
|
public static string KeyTestOptionsOverwriteUrl = "urlOverwrite";
|
||||||
|
public static string KeyTestOptionsExtraPath = "extraPath";
|
||||||
|
public static string KeyTestOptionsBasePath = "basePath";
|
||||||
|
public static string KeyTestOptionsGdprPath = "gdprPath";
|
||||||
|
public static string KeyTestOptionsDeleteState = "deleteState";
|
||||||
|
public static string KeyTestOptionsUseTestConnectionOptions = "useTestConnectionOptions";
|
||||||
|
public static string KeyTestOptionsTimerIntervalInMilliseconds = "timerIntervalInMilliseconds";
|
||||||
|
public static string KeyTestOptionsTimerStartInMilliseconds = "timerStartInMilliseconds";
|
||||||
|
public static string KeyTestOptionsSessionIntervalInMilliseconds = "sessionIntervalInMilliseconds";
|
||||||
|
public static string KeyTestOptionsSubsessionIntervalInMilliseconds = "subsessionIntervalInMilliseconds";
|
||||||
|
public static string KeyTestOptionsTeardown = "teardown";
|
||||||
|
public static string KeyTestOptionsNoBackoffWait = "noBackoffWait";
|
||||||
|
public static string KeyTestOptionsAdServicesFrameworkEnabled = "adServicesFrameworkEnabled";
|
||||||
|
public static string KeyTestOptionsAttStatus = "attStatus";
|
||||||
|
public static string KeyTestOptionsIdfa = "idfa";
|
||||||
|
public static string KeyTestOptionsIgnoreSystemLifecycleBootstrap = "ignoreSystemLifecycleBootstrap";
|
||||||
|
|
||||||
|
public static int ConvertLogLevel(AdjustLogLevel? logLevel)
|
||||||
|
{
|
||||||
|
if (logLevel == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)logLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ConvertBool(bool? value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (value.Value)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double ConvertDouble(double? value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (double)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ConvertInt(int? value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ConvertLong(long? value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (long)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ConvertReadOnlyCollectionToJson(ReadOnlyCollection<string> list)
|
||||||
|
{
|
||||||
|
if (list == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<string> processedList = new List<string>();
|
||||||
|
for (int i = 0; i < list.Count; i += 1)
|
||||||
|
{
|
||||||
|
string item = list[i];
|
||||||
|
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
processedList.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create JSON array
|
||||||
|
var jsonArray = new JSONArray();
|
||||||
|
foreach (var listItem in processedList)
|
||||||
|
{
|
||||||
|
jsonArray.Add(new JSONData(listItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonArray.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ConvertReadOnlyCollectionOfPairsToJson(ReadOnlyCollection<string> list)
|
||||||
|
{
|
||||||
|
if (list == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// list of callback / partner parameters must contain even number of elements
|
||||||
|
if (list.Count % 2 != 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<string> processedList = new List<string>();
|
||||||
|
for (int i = 0; i < list.Count; i += 2)
|
||||||
|
{
|
||||||
|
string key = list[i];
|
||||||
|
string value = list[i + 1];
|
||||||
|
|
||||||
|
if (key == null || value == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
processedList.Add(key);
|
||||||
|
processedList.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create JSON array
|
||||||
|
var jsonArray = new JSONArray();
|
||||||
|
foreach (var listItem in processedList)
|
||||||
|
{
|
||||||
|
jsonArray.Add(new JSONData(listItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonArray.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ConvertReadOnlyCollectionOfTripletsToJson(ReadOnlyCollection<string> list)
|
||||||
|
{
|
||||||
|
if (list == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// list of third party sharing parameters must contain number of elements divisible by 3
|
||||||
|
if (list.Count % 3 != 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<string> processedList = new List<string>();
|
||||||
|
for (int i = 0; i < list.Count; i += 3)
|
||||||
|
{
|
||||||
|
string partnerName = list[i];
|
||||||
|
string key = list[i + 1];
|
||||||
|
string value = list[i + 2];
|
||||||
|
|
||||||
|
if (partnerName == null || key == null || value == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
processedList.Add(partnerName);
|
||||||
|
processedList.Add(key);
|
||||||
|
processedList.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create JSON array
|
||||||
|
var jsonArray = new JSONArray();
|
||||||
|
foreach (var listItem in processedList)
|
||||||
|
{
|
||||||
|
jsonArray.Add(new JSONData(listItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonArray.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetJsonResponseCompact(Dictionary<string, object> dictionary)
|
||||||
|
{
|
||||||
|
string logJsonResponse = "";
|
||||||
|
|
||||||
|
if (dictionary == null)
|
||||||
|
{
|
||||||
|
return logJsonResponse;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int preLoopCounter = 0;
|
||||||
|
logJsonResponse += "{";
|
||||||
|
|
||||||
|
foreach (KeyValuePair<string, object> pair in dictionary)
|
||||||
|
{
|
||||||
|
string valueString = pair.Value as string;
|
||||||
|
|
||||||
|
if (valueString != null)
|
||||||
|
{
|
||||||
|
if (++preLoopCounter > 1)
|
||||||
|
{
|
||||||
|
logJsonResponse += ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the value is another JSON/complex-structure
|
||||||
|
if (valueString.StartsWith("{") && valueString.EndsWith("}"))
|
||||||
|
{
|
||||||
|
logJsonResponse += "\"" + pair.Key + "\"" + ":" + valueString;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logJsonResponse += "\"" + pair.Key + "\"" + ":" + "\"" + valueString + "\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary<string, object> valueDictionary = pair.Value as Dictionary<string, object>;
|
||||||
|
|
||||||
|
if (++preLoopCounter > 1)
|
||||||
|
{
|
||||||
|
logJsonResponse += ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
logJsonResponse += "\"" + pair.Key + "\"" + ":";
|
||||||
|
logJsonResponse += GetJsonResponseCompact(valueDictionary);
|
||||||
|
}
|
||||||
|
|
||||||
|
logJsonResponse += "}";
|
||||||
|
}
|
||||||
|
|
||||||
|
return logJsonResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetJsonString(JSONNode node, string key)
|
||||||
|
{
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Access value object and cast it to JSONData.
|
||||||
|
var nodeValue = node[key] as JSONData;
|
||||||
|
|
||||||
|
if (nodeValue == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/adjust/unity_sdk/issues/137
|
||||||
|
if (nodeValue == "")
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodeValue.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteJsonResponseDictionary(JSONClass jsonObject, Dictionary<string, object> output)
|
||||||
|
{
|
||||||
|
foreach (KeyValuePair<string, JSONNode> pair in jsonObject)
|
||||||
|
{
|
||||||
|
// Try to cast value as a complex object.
|
||||||
|
var subNode = pair.Value.AsObject;
|
||||||
|
var key = pair.Key;
|
||||||
|
|
||||||
|
// Value is not a complex object.
|
||||||
|
if (subNode == null)
|
||||||
|
{
|
||||||
|
var value = pair.Value.Value;
|
||||||
|
output.Add(key, value);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create new dictionary for complex type.
|
||||||
|
var newSubDictionary = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
// Save it in the current dictionary.
|
||||||
|
output.Add(key, newSubDictionary);
|
||||||
|
|
||||||
|
// Recursive call to fill new dictionary.
|
||||||
|
WriteJsonResponseDictionary(subNode, newSubDictionary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string TryGetValue(Dictionary<string, string> dictionary, string key)
|
||||||
|
{
|
||||||
|
string value;
|
||||||
|
if (dictionary.TryGetValue(key, out value))
|
||||||
|
{
|
||||||
|
// https://github.com/adjust/unity_sdk/issues/137
|
||||||
|
if (value == "")
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Dictionary<string, string> GetSkanUpdateDataDictionary(string skanUpdateData)
|
||||||
|
{
|
||||||
|
Dictionary<string, string> skanUpdateDataDictionary = new Dictionary<string, string>();
|
||||||
|
var skanUpdateDataNode = JSON.Parse(skanUpdateData);
|
||||||
|
if (skanUpdateDataNode != null && skanUpdateDataNode.AsObject != null)
|
||||||
|
{
|
||||||
|
Dictionary<string, object> temp = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(skanUpdateDataNode.AsObject, temp);
|
||||||
|
foreach (KeyValuePair<string, object> entry in temp)
|
||||||
|
{
|
||||||
|
skanUpdateDataDictionary.Add(entry.Key, entry.Value.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return skanUpdateDataDictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Dictionary<string, object> GetAttributionJsonResponse(string attributionJsonResponse)
|
||||||
|
{
|
||||||
|
Dictionary<string, object> attributionJsonResponseDictionary = new Dictionary<string, object>();
|
||||||
|
var attributionJsonResponseNode = JSON.Parse(attributionJsonResponse);
|
||||||
|
if (attributionJsonResponseNode != null && attributionJsonResponseNode.AsObject != null)
|
||||||
|
{
|
||||||
|
Dictionary<string, object> temp = new Dictionary<string, object>();
|
||||||
|
AdjustUtils.WriteJsonResponseDictionary(attributionJsonResponseNode.AsObject, temp);
|
||||||
|
foreach (KeyValuePair<string, object> entry in temp)
|
||||||
|
{
|
||||||
|
attributionJsonResponseDictionary.Add(entry.Key, entry.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return attributionJsonResponseDictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetValueOrEmptyToNull(string value)
|
||||||
|
{
|
||||||
|
return string.IsNullOrEmpty(value) ? null : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
public static AndroidJavaObject TestOptionsMap2AndroidJavaObject(Dictionary<string, string> testOptionsMap, AndroidJavaObject ajoCurrentActivity)
|
||||||
|
{
|
||||||
|
AndroidJavaObject ajoTestOptions = new AndroidJavaObject("com.adjust.sdk.AdjustTestOptions");
|
||||||
|
ajoTestOptions.Set<string>("baseUrl", testOptionsMap[KeyTestOptionsBaseUrl]);
|
||||||
|
ajoTestOptions.Set<string>("gdprUrl", testOptionsMap[KeyTestOptionsGdprUrl]);
|
||||||
|
ajoTestOptions.Set<string>("subscriptionUrl", testOptionsMap[KeyTestOptionsSubscriptionUrl]);
|
||||||
|
ajoTestOptions.Set<string>("purchaseVerificationUrl", testOptionsMap[KeyTestOptionsPurchaseVerificationUrl]);
|
||||||
|
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsExtraPath) && !string.IsNullOrEmpty(testOptionsMap[KeyTestOptionsExtraPath]))
|
||||||
|
{
|
||||||
|
ajoTestOptions.Set<string>("basePath", testOptionsMap[KeyTestOptionsExtraPath]);
|
||||||
|
ajoTestOptions.Set<string>("gdprPath", testOptionsMap[KeyTestOptionsExtraPath]);
|
||||||
|
ajoTestOptions.Set<string>("subscriptionPath", testOptionsMap[KeyTestOptionsExtraPath]);
|
||||||
|
ajoTestOptions.Set<string>("purchaseVerificationPath", testOptionsMap[KeyTestOptionsExtraPath]);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsDeleteState) && ajoCurrentActivity != null)
|
||||||
|
{
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("context", ajoCurrentActivity);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsUseTestConnectionOptions))
|
||||||
|
{
|
||||||
|
bool useTestConnectionOptions = testOptionsMap[KeyTestOptionsUseTestConnectionOptions].ToLower() == "true";
|
||||||
|
AndroidJavaObject ajoUseTestConnectionOptions = new AndroidJavaObject("java.lang.Boolean", useTestConnectionOptions);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("useTestConnectionOptions", ajoUseTestConnectionOptions);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsTimerIntervalInMilliseconds))
|
||||||
|
{
|
||||||
|
var timerIntervalInMilliseconds = long.Parse(testOptionsMap[KeyTestOptionsTimerIntervalInMilliseconds]);
|
||||||
|
AndroidJavaObject ajoTimerIntervalInMilliseconds = new AndroidJavaObject("java.lang.Long", timerIntervalInMilliseconds);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("timerIntervalInMilliseconds", ajoTimerIntervalInMilliseconds);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsTimerStartInMilliseconds))
|
||||||
|
{
|
||||||
|
var timerStartInMilliseconds = long.Parse(testOptionsMap[KeyTestOptionsTimerStartInMilliseconds]);
|
||||||
|
AndroidJavaObject ajoTimerStartInMilliseconds = new AndroidJavaObject("java.lang.Long", timerStartInMilliseconds);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("timerStartInMilliseconds", ajoTimerStartInMilliseconds);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsSessionIntervalInMilliseconds))
|
||||||
|
{
|
||||||
|
var sessionIntervalInMilliseconds = long.Parse(testOptionsMap[KeyTestOptionsSessionIntervalInMilliseconds]);
|
||||||
|
AndroidJavaObject ajoSessionIntervalInMilliseconds = new AndroidJavaObject("java.lang.Long", sessionIntervalInMilliseconds);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("sessionIntervalInMilliseconds", ajoSessionIntervalInMilliseconds);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsSubsessionIntervalInMilliseconds))
|
||||||
|
{
|
||||||
|
var subsessionIntervalInMilliseconds = long.Parse(testOptionsMap[KeyTestOptionsSubsessionIntervalInMilliseconds]);
|
||||||
|
AndroidJavaObject ajoSubsessionIntervalInMilliseconds = new AndroidJavaObject("java.lang.Long", subsessionIntervalInMilliseconds);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("subsessionIntervalInMilliseconds", ajoSubsessionIntervalInMilliseconds);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsTeardown))
|
||||||
|
{
|
||||||
|
bool teardown = testOptionsMap[KeyTestOptionsTeardown].ToLower() == "true";
|
||||||
|
AndroidJavaObject ajoTeardown = new AndroidJavaObject("java.lang.Boolean", teardown);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("teardown", ajoTeardown);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsNoBackoffWait))
|
||||||
|
{
|
||||||
|
bool noBackoffWait = testOptionsMap[KeyTestOptionsNoBackoffWait].ToLower() == "true";
|
||||||
|
AndroidJavaObject ajoNoBackoffWait = new AndroidJavaObject("java.lang.Boolean", noBackoffWait);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("noBackoffWait", ajoNoBackoffWait);
|
||||||
|
}
|
||||||
|
if (testOptionsMap.ContainsKey(KeyTestOptionsIgnoreSystemLifecycleBootstrap))
|
||||||
|
{
|
||||||
|
// TODO: fix native logic not to have negation in naming throughout the chain of calls
|
||||||
|
bool doNotIgnoreSystemLifecycleBootstrap = testOptionsMap[KeyTestOptionsIgnoreSystemLifecycleBootstrap].ToLower() == "true";
|
||||||
|
AndroidJavaObject ajoDoNotIgnoreSystemLifecycleBootstrap = new AndroidJavaObject("java.lang.Boolean", doNotIgnoreSystemLifecycleBootstrap);
|
||||||
|
ajoTestOptions.Set<AndroidJavaObject>("ignoreSystemLifecycleBootstrap", ajoDoNotIgnoreSystemLifecycleBootstrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ajoTestOptions;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 98e51a1481cc24ddebf93f61f6c1eb9d
|
||||||
|
timeCreated: 1458230617
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1b9e944cddaba4b74b96cf2c01f5aee3
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fd79158f62f184079b58f414302dd242
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.SceneManagement;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(Adjust))]
|
||||||
|
public class AdjustCustomEditor : Editor
|
||||||
|
{
|
||||||
|
private Editor settingsEditor;
|
||||||
|
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
|
||||||
|
var adjust = target as Adjust;
|
||||||
|
GUIStyle darkerCyanTextFieldStyles = new GUIStyle(EditorStyles.boldLabel);
|
||||||
|
darkerCyanTextFieldStyles.normal.textColor = new Color(0f/255f, 190f/255f, 190f/255f);
|
||||||
|
|
||||||
|
// Not gonna ask: http://answers.unity.com/answers/1244650/view.html
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
var origFontStyle = EditorStyles.label.fontStyle;
|
||||||
|
EditorStyles.label.fontStyle = FontStyle.Bold;
|
||||||
|
adjust.startManually = EditorGUILayout.Toggle("START SDK MANUALLY", adjust.startManually, EditorStyles.toggle);
|
||||||
|
EditorStyles.label.fontStyle = origFontStyle;
|
||||||
|
|
||||||
|
using (new EditorGUI.DisabledScope(adjust.startManually))
|
||||||
|
{
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("MULTIPLATFORM SETTINGS:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
adjust.appToken = EditorGUILayout.TextField("App Token", adjust.appToken);
|
||||||
|
adjust.environment = (AdjustEnvironment)EditorGUILayout.EnumPopup("Environment", adjust.environment);
|
||||||
|
adjust.logLevel = (AdjustLogLevel)EditorGUILayout.EnumPopup("Log Level", adjust.logLevel);
|
||||||
|
// TODO: URL strategy missing
|
||||||
|
adjust.sendInBackground = EditorGUILayout.Toggle("Send In Background", adjust.sendInBackground);
|
||||||
|
adjust.launchDeferredDeeplink = EditorGUILayout.Toggle("Launch Deferred Deep Link", adjust.launchDeferredDeeplink);
|
||||||
|
adjust.costDataInAttribution = EditorGUILayout.Toggle("Cost Data In Attribution Callback", adjust.costDataInAttribution);
|
||||||
|
adjust.linkMe = EditorGUILayout.Toggle("LinkMe", adjust.linkMe);
|
||||||
|
adjust.defaultTracker = EditorGUILayout.TextField("Default Tracker", adjust.defaultTracker);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("ANDROID SETTINGS:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
adjust.preinstallTracking = EditorGUILayout.Toggle("Preinstall Tracking", adjust.preinstallTracking);
|
||||||
|
adjust.preinstallFilePath = EditorGUILayout.TextField("Preinstall File Path", adjust.preinstallFilePath);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("IOS SETTINGS:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
adjust.adServices = EditorGUILayout.Toggle("AdServices Info Reading", adjust.adServices);
|
||||||
|
adjust.idfaReading = EditorGUILayout.Toggle("IDFA Info Reading", adjust.idfaReading);
|
||||||
|
adjust.skanAttribution = EditorGUILayout.Toggle("SKAdNetwork Handling", adjust.skanAttribution);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsEditor == null)
|
||||||
|
{
|
||||||
|
settingsEditor = CreateEditor(AdjustSettings.Instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
settingsEditor.OnInspectorGUI();
|
||||||
|
|
||||||
|
if (GUI.changed)
|
||||||
|
{
|
||||||
|
EditorUtility.SetDirty(adjust);
|
||||||
|
EditorSceneManager.MarkSceneDirty(adjust.gameObject.scene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1772b9461c24c4df0ad55f51f81c7345
|
||||||
|
timeCreated: 1617868100
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,343 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Callbacks;
|
||||||
|
#if UNITY_IOS
|
||||||
|
using UnityEditor.iOS.Xcode;
|
||||||
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
using UnityEditor.iOS.Xcode.Extensions;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustEditor : AssetPostprocessor
|
||||||
|
{
|
||||||
|
private const int AdjustEditorPostProcesssBuildPriority = 90;
|
||||||
|
private const string TargetUnityIphonePodfileLine = "target 'Unity-iPhone' do";
|
||||||
|
private const string UseFrameworksPodfileLine = "use_frameworks!";
|
||||||
|
private const string UseFrameworksDynamicPodfileLine = "use_frameworks! :linkage => :dynamic";
|
||||||
|
private const string UseFrameworksStaticPodfileLine = "use_frameworks! :linkage => :static";
|
||||||
|
|
||||||
|
[PostProcessBuild(AdjustEditorPostProcesssBuildPriority)]
|
||||||
|
public static void OnPostprocessBuild(BuildTarget target, string projectPath)
|
||||||
|
{
|
||||||
|
RunPostBuildScript(target: target, projectPath: projectPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RunPostBuildScript(BuildTarget target, string projectPath = "")
|
||||||
|
{
|
||||||
|
if (target == BuildTarget.iOS)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log("[Adjust]: Starting to perform post build tasks for iOS platform.");
|
||||||
|
|
||||||
|
string xcodeProjectPath = projectPath + "/Unity-iPhone.xcodeproj/project.pbxproj";
|
||||||
|
|
||||||
|
PBXProject xcodeProject = new PBXProject();
|
||||||
|
xcodeProject.ReadFromFile(xcodeProjectPath);
|
||||||
|
|
||||||
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
string xcodeTarget = xcodeProject.GetUnityMainTargetGuid();
|
||||||
|
#else
|
||||||
|
string xcodeTarget = xcodeProject.TargetGuidByName("Unity-iPhone");
|
||||||
|
#endif
|
||||||
|
HandlePlistIosChanges(projectPath);
|
||||||
|
|
||||||
|
if (AdjustSettings.iOSUniversalLinksDomains.Length > 0)
|
||||||
|
{
|
||||||
|
AddUniversalLinkDomains(xcodeProject, xcodeProjectPath, xcodeTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If enabled by the user, Adjust SDK will try to add following frameworks to your project:
|
||||||
|
// - AdSupport.framework (needed for access to IDFA value)
|
||||||
|
// - AdServices.framework (needed in case you are running ASA campaigns)
|
||||||
|
// - StoreKit.framework (needed for communication with SKAdNetwork framework)
|
||||||
|
// - AppTrackingTransparency.framework (needed for information about user's consent to be tracked)
|
||||||
|
// In case you don't need any of these, feel free to remove them from your app.
|
||||||
|
|
||||||
|
if (AdjustSettings.iOSFrameworkAdSupport)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Adding AdSupport.framework to Xcode project.");
|
||||||
|
xcodeProject.AddFrameworkToProject(xcodeTarget, "AdSupport.framework", true);
|
||||||
|
Debug.Log("[Adjust]: AdSupport.framework added successfully.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Skipping AdSupport.framework linking.");
|
||||||
|
}
|
||||||
|
if (AdjustSettings.iOSFrameworkAdServices)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Adding AdServices.framework to Xcode project.");
|
||||||
|
xcodeProject.AddFrameworkToProject(xcodeTarget, "AdServices.framework", true);
|
||||||
|
Debug.Log("[Adjust]: AdServices.framework added successfully.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Skipping AdServices.framework linking.");
|
||||||
|
}
|
||||||
|
if (AdjustSettings.iOSFrameworkStoreKit)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Adding StoreKit.framework to Xcode project.");
|
||||||
|
xcodeProject.AddFrameworkToProject(xcodeTarget, "StoreKit.framework", true);
|
||||||
|
Debug.Log("[Adjust]: StoreKit.framework added successfully.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Skipping StoreKit.framework linking.");
|
||||||
|
}
|
||||||
|
if (AdjustSettings.iOSFrameworkAppTrackingTransparency)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Adding AppTrackingTransparency.framework to Xcode project.");
|
||||||
|
xcodeProject.AddFrameworkToProject(xcodeTarget, "AppTrackingTransparency.framework", true);
|
||||||
|
Debug.Log("[Adjust]: AppTrackingTransparency.framework added successfully.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Skipping AppTrackingTransparency.framework linking.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Adjust SDK needs to have Obj-C exceptions enabled.
|
||||||
|
// GCC_ENABLE_OBJC_EXCEPTIONS=YES
|
||||||
|
string xcodeTargetUnityFramework = xcodeProject.TargetGuidByName("UnityFramework");
|
||||||
|
Debug.Log("[Adjust]: Enabling Obj-C exceptions by setting GCC_ENABLE_OBJC_EXCEPTIONS value to YES.");
|
||||||
|
xcodeProject.AddBuildProperty(xcodeTarget, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
|
||||||
|
Debug.Log("[Adjust]: Obj-C exceptions enabled successfully.");
|
||||||
|
if (!string.IsNullOrEmpty(xcodeTargetUnityFramework))
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Enabling Obj-C exceptions by setting GCC_ENABLE_OBJC_EXCEPTIONS value to YES.");
|
||||||
|
xcodeProject.AddBuildProperty(xcodeTargetUnityFramework, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
|
||||||
|
Debug.Log("[Adjust]: Obj-C exceptions enabled successfully.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// potential AdjustSigSdk.xcframework embedding
|
||||||
|
Debug.Log("[Adjust]: Checking whether AdjustSigSdk.xcframework needs to be embedded or not...");
|
||||||
|
EmbedAdjustSignatureIfNeeded(projectPath, xcodeProject, xcodeTarget);
|
||||||
|
|
||||||
|
// Save the changes to Xcode project file.
|
||||||
|
xcodeProject.WriteToFile(xcodeProjectPath);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
// dynamic xcframework embedding logic adjusted and taken from:
|
||||||
|
// https://github.com/AppLovin/AppLovin-MAX-Unity-Plugin/blob/master/DemoApp/Assets/MaxSdk/Scripts/IntegrationManager/Editor/AppLovinPostProcessiOS.cs
|
||||||
|
private static void EmbedAdjustSignatureIfNeeded(string buildPath, PBXProject project, string targetGuid)
|
||||||
|
{
|
||||||
|
var podsDirectory = Path.Combine(buildPath, "Pods");
|
||||||
|
|
||||||
|
if (!Directory.Exists(podsDirectory) || !ShouldEmbedDynamicLibraries(buildPath))
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: No need to embed AdjustSigSdk.xcframework.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dynamicLibraryPathToEmbed = GetAdjustSignaturePathToEmbed(podsDirectory, buildPath);
|
||||||
|
if (dynamicLibraryPathToEmbed == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: It needs to be embedded. Starting the embedding process...");
|
||||||
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
var fileGuid = project.AddFile(dynamicLibraryPathToEmbed, dynamicLibraryPathToEmbed);
|
||||||
|
project.AddFileToEmbedFrameworks(targetGuid, fileGuid);
|
||||||
|
#else
|
||||||
|
string runpathSearchPaths;
|
||||||
|
runpathSearchPaths = project.GetBuildPropertyForAnyConfig(targetGuid, "LD_RUNPATH_SEARCH_PATHS");
|
||||||
|
runpathSearchPaths += string.IsNullOrEmpty(runpathSearchPaths) ? "" : " ";
|
||||||
|
|
||||||
|
// check if runtime search paths already contains the required search paths for dynamic libraries
|
||||||
|
if (runpathSearchPaths.Contains("@executable_path/Frameworks")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
runpathSearchPaths += "@executable_path/Frameworks";
|
||||||
|
project.SetBuildProperty(targetGuid, "LD_RUNPATH_SEARCH_PATHS", runpathSearchPaths);
|
||||||
|
#endif
|
||||||
|
Debug.Log("[Adjust]: Embedding process completed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool ShouldEmbedDynamicLibraries(string buildPath)
|
||||||
|
{
|
||||||
|
var podfilePath = Path.Combine(buildPath, "Podfile");
|
||||||
|
if (!File.Exists(podfilePath)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the Podfile doesn't have a `Unity-iPhone` target, we should embed the dynamic libraries
|
||||||
|
var lines = File.ReadAllLines(podfilePath);
|
||||||
|
var containsUnityIphoneTarget = lines.Any(line => line.Contains(TargetUnityIphonePodfileLine));
|
||||||
|
if (!containsUnityIphoneTarget) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the Podfile does not have a `use_frameworks! :linkage => static` line, we should not embed the dynamic libraries
|
||||||
|
var useFrameworksStaticLineIndex = Array.FindIndex(lines, line => line.Contains(UseFrameworksStaticPodfileLine));
|
||||||
|
if (useFrameworksStaticLineIndex == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if more than one of the `use_frameworks!` lines are present, CocoaPods will use the last one
|
||||||
|
var useFrameworksLineIndex = Array.FindIndex(lines, line => line.Trim() == UseFrameworksPodfileLine); // check for exact line to avoid matching `use_frameworks! :linkage => static/dynamic`
|
||||||
|
var useFrameworksDynamicLineIndex = Array.FindIndex(lines, line => line.Contains(UseFrameworksDynamicPodfileLine));
|
||||||
|
|
||||||
|
// check if `use_frameworks! :linkage => :static` is the last line of the three
|
||||||
|
// if it is, we should embed the dynamic libraries
|
||||||
|
return useFrameworksLineIndex < useFrameworksStaticLineIndex && useFrameworksDynamicLineIndex < useFrameworksStaticLineIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetAdjustSignaturePathToEmbed(string podsDirectory, string buildPath)
|
||||||
|
{
|
||||||
|
var adjustSignatureFrameworkToEmbed = "AdjustSigSdk.xcframework";
|
||||||
|
|
||||||
|
// both .framework and .xcframework are directories, not files
|
||||||
|
var directories = Directory.GetDirectories(podsDirectory, adjustSignatureFrameworkToEmbed, SearchOption.AllDirectories);
|
||||||
|
if (directories.Length <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dynamicLibraryAbsolutePath = directories[0];
|
||||||
|
var relativePath = GetDynamicLibraryRelativePath(dynamicLibraryAbsolutePath);
|
||||||
|
return relativePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetDynamicLibraryRelativePath(string dynamicLibraryAbsolutePath)
|
||||||
|
{
|
||||||
|
var index = dynamicLibraryAbsolutePath.LastIndexOf("Pods", StringComparison.Ordinal);
|
||||||
|
return dynamicLibraryAbsolutePath.Substring(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void HandlePlistIosChanges(string projectPath)
|
||||||
|
{
|
||||||
|
const string UserTrackingUsageDescriptionKey = "NSUserTrackingUsageDescription";
|
||||||
|
|
||||||
|
// Check if needs to do any info plist change.
|
||||||
|
bool hasUserTrackingDescription =
|
||||||
|
!string.IsNullOrEmpty(AdjustSettings.iOSUserTrackingUsageDescription);
|
||||||
|
bool hasUrlSchemesDeepLinksEnabled = AdjustSettings.iOSUrlSchemes.Length > 0;
|
||||||
|
|
||||||
|
if (!hasUserTrackingDescription && !hasUrlSchemesDeepLinksEnabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get and read info plist.
|
||||||
|
var plistPath = Path.Combine(projectPath, "Info.plist");
|
||||||
|
var plist = new PlistDocument();
|
||||||
|
plist.ReadFromFile(plistPath);
|
||||||
|
var plistRoot = plist.root;
|
||||||
|
|
||||||
|
// Do the info plist changes.
|
||||||
|
if (hasUserTrackingDescription)
|
||||||
|
{
|
||||||
|
if (plistRoot[UserTrackingUsageDescriptionKey] != null)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Overwritting User Tracking Usage Description.");
|
||||||
|
}
|
||||||
|
plistRoot.SetString(UserTrackingUsageDescriptionKey,
|
||||||
|
AdjustSettings.iOSUserTrackingUsageDescription);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasUrlSchemesDeepLinksEnabled)
|
||||||
|
{
|
||||||
|
AddUrlSchemesIOS(plistRoot, AdjustSettings.iOSUrlIdentifier, AdjustSettings.iOSUrlSchemes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write any info plist change.
|
||||||
|
File.WriteAllText(plistPath, plist.WriteToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddUrlSchemesIOS(PlistElementDict plistRoot, string urlIdentifier, string[] urlSchemes)
|
||||||
|
{
|
||||||
|
// Set Array for futher deeplink values.
|
||||||
|
var urlTypesArray = CreatePlistElementArray(plistRoot, "CFBundleURLTypes");
|
||||||
|
|
||||||
|
// Array will contain just one deeplink dictionary
|
||||||
|
var urlSchemesItems = CreatePlistElementDict(urlTypesArray);
|
||||||
|
urlSchemesItems.SetString("CFBundleURLName", urlIdentifier);
|
||||||
|
var urlSchemesArray = CreatePlistElementArray(urlSchemesItems, "CFBundleURLSchemes");
|
||||||
|
|
||||||
|
// Delete old deferred deeplinks URIs
|
||||||
|
Debug.Log("[Adjust]: Removing deeplinks that already exist in the array to avoid duplicates.");
|
||||||
|
foreach (var link in urlSchemes)
|
||||||
|
{
|
||||||
|
urlSchemesArray.values.RemoveAll(
|
||||||
|
element => element != null && element.AsString().Equals(link));
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: Adding new deep links.");
|
||||||
|
foreach (var link in urlSchemes.Distinct())
|
||||||
|
{
|
||||||
|
urlSchemesArray.AddString(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PlistElementArray CreatePlistElementArray(PlistElementDict root, string key)
|
||||||
|
{
|
||||||
|
if (!root.values.ContainsKey(key))
|
||||||
|
{
|
||||||
|
Debug.Log(string.Format("[Adjust]: {0} not found in Info.plist. Creating a new one.", key));
|
||||||
|
return root.CreateArray(key);
|
||||||
|
}
|
||||||
|
var result = root.values[key].AsArray();
|
||||||
|
return result != null ? result : root.CreateArray(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PlistElementDict CreatePlistElementDict(PlistElementArray rootArray)
|
||||||
|
{
|
||||||
|
if (rootArray.values.Count == 0)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Deeplinks array doesn't contain dictionary for deeplinks. Creating a new one.");
|
||||||
|
return rootArray.AddDict();
|
||||||
|
}
|
||||||
|
|
||||||
|
var urlSchemesItems = rootArray.values[0].AsDict();
|
||||||
|
Debug.Log("[Adjust]: Reading deeplinks array");
|
||||||
|
if (urlSchemesItems == null)
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Deeplinks array doesn't contain dictionary for deeplinks. Creating a new one.");
|
||||||
|
urlSchemesItems = rootArray.AddDict();
|
||||||
|
}
|
||||||
|
|
||||||
|
return urlSchemesItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddUniversalLinkDomains(PBXProject project, string xCodeProjectPath, string xCodeTarget)
|
||||||
|
{
|
||||||
|
string entitlementsFileName = project.GetBuildPropertyForAnyConfig(xCodeTarget, "CODE_SIGN_ENTITLEMENTS");
|
||||||
|
if (entitlementsFileName == null)
|
||||||
|
{
|
||||||
|
entitlementsFileName = "Unity-iPhone.entitlements";
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: Adding associated domains to entitlements file.");
|
||||||
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
var projectCapabilityManager = new ProjectCapabilityManager(xCodeProjectPath, entitlementsFileName, null, project.GetUnityMainTargetGuid());
|
||||||
|
#else
|
||||||
|
var projectCapabilityManager = new ProjectCapabilityManager(xCodeProjectPath, entitlementsFileName, PBXProject.GetUnityTargetName());
|
||||||
|
#endif
|
||||||
|
var uniqueDomains = AdjustSettings.iOSUniversalLinksDomains.Distinct().ToArray();
|
||||||
|
const string applinksPrefix = "applinks:";
|
||||||
|
for (int i = 0; i < uniqueDomains.Length; i++)
|
||||||
|
{
|
||||||
|
if (!uniqueDomains[i].StartsWith(applinksPrefix))
|
||||||
|
{
|
||||||
|
uniqueDomains[i] = applinksPrefix + uniqueDomains[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
projectCapabilityManager.AddAssociatedDomains(uniqueDomains);
|
||||||
|
projectCapabilityManager.WriteToFile();
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: Enabling Associated Domains capability with created entitlements file.");
|
||||||
|
project.AddCapability(xCodeTarget, PBXCapabilityType.AssociatedDomains, entitlementsFileName);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fc5962e0096e9495bbad76934c842619
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
|
@ -0,0 +1,367 @@
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.Build;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.Xml;
|
||||||
|
using System;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
#if UNITY_2018_1_OR_NEWER
|
||||||
|
public class AdjustEditorPreprocessor : IPreprocessBuildWithReport
|
||||||
|
#else
|
||||||
|
public class AdjustEditorPreprocessor : IPreprocessBuild
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
public int callbackOrder
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if UNITY_2018_1_OR_NEWER
|
||||||
|
public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
|
||||||
|
{
|
||||||
|
OnPreprocessBuild(report.summary.platform, string.Empty);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public void OnPreprocessBuild(BuildTarget target, string path)
|
||||||
|
{
|
||||||
|
if (target == BuildTarget.Android)
|
||||||
|
{
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
RunPostProcessTasksAndroid();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
private static void RunPostProcessTasksAndroid()
|
||||||
|
{
|
||||||
|
var isAdjustManifestUsed = false;
|
||||||
|
var androidPluginsPath = Path.Combine(Application.dataPath, "Plugins/Android");
|
||||||
|
var adjustManifestPath = Path.Combine(Application.dataPath, "Adjust/Native/Android/AdjustAndroidManifest.xml");
|
||||||
|
var appManifestPath = Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml");
|
||||||
|
|
||||||
|
// Check if user has already created AndroidManifest.xml file in its location.
|
||||||
|
// If not, use already predefined AdjustAndroidManifest.xml as default one.
|
||||||
|
if (!File.Exists(appManifestPath))
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(androidPluginsPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(androidPluginsPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
isAdjustManifestUsed = true;
|
||||||
|
File.Copy(adjustManifestPath, appManifestPath);
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: User defined AndroidManifest.xml file not found in Plugins/Android folder.");
|
||||||
|
Debug.Log("[Adjust]: Creating default app's AndroidManifest.xml from AdjustAndroidManifest.xml file.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: User defined AndroidManifest.xml file located in Plugins/Android folder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's open the app's AndroidManifest.xml file.
|
||||||
|
var manifestFile = new XmlDocument();
|
||||||
|
manifestFile.Load(appManifestPath);
|
||||||
|
|
||||||
|
var manifestHasChanged = false;
|
||||||
|
|
||||||
|
// If Adjust manifest is used, we have already set up everything in it so that
|
||||||
|
// our native Android SDK can be used properly.
|
||||||
|
if (!isAdjustManifestUsed)
|
||||||
|
{
|
||||||
|
// However, if you already had your own AndroidManifest.xml, we'll now run
|
||||||
|
// some checks on it and tweak it a bit if needed to add some stuff which
|
||||||
|
// our native Android SDK needs so that it can run properly.
|
||||||
|
|
||||||
|
// Add needed permissions if they are missing.
|
||||||
|
manifestHasChanged |= AddPermissions(manifestFile);
|
||||||
|
|
||||||
|
// Add intent filter to main activity if it is missing.
|
||||||
|
manifestHasChanged |= AddBroadcastReceiver(manifestFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add intent filter to URL schemes for deeplinking
|
||||||
|
manifestHasChanged |= AddURISchemes(manifestFile);
|
||||||
|
|
||||||
|
if (manifestHasChanged)
|
||||||
|
{
|
||||||
|
// Save the changes.
|
||||||
|
manifestFile.Save(appManifestPath);
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: App's AndroidManifest.xml file check and potential modification completed.");
|
||||||
|
Debug.Log("[Adjust]: Please check if any error message was displayed during this process "
|
||||||
|
+ "and make sure to fix all issues in order to properly use the Adjust SDK in your app.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: App's AndroidManifest.xml file check completed.");
|
||||||
|
Debug.Log("[Adjust]: No modifications performed due to app's AndroidManifest.xml file compatibility.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AddURISchemes(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
if (AdjustSettings.AndroidUriSchemes.Length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Debug.Log("[Adjust]: Start addition of URI schemes");
|
||||||
|
|
||||||
|
// Check if user has defined a custom Android activity name.
|
||||||
|
string androidActivityName = "com.unity3d.player.UnityPlayerActivity";
|
||||||
|
if (AdjustSettings.AndroidCustomActivityName.Length != 0)
|
||||||
|
{
|
||||||
|
androidActivityName = AdjustSettings.AndroidCustomActivityName;
|
||||||
|
}
|
||||||
|
|
||||||
|
var intentRoot = manifest.DocumentElement.SelectSingleNode("/manifest/application/activity[@android:name='"
|
||||||
|
+ androidActivityName + "']", GetNamespaceManager(manifest));
|
||||||
|
var usedIntentFiltersChanged = false;
|
||||||
|
foreach (var uriScheme in AdjustSettings.AndroidUriSchemes)
|
||||||
|
{
|
||||||
|
Uri uri;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// The first element is android:scheme and the second one is android:host.
|
||||||
|
uri = new Uri(uriScheme);
|
||||||
|
|
||||||
|
// Uri class converts implicit file paths to explicit file paths with the file:// scheme.
|
||||||
|
if (!uriScheme.StartsWith(uri.Scheme))
|
||||||
|
{
|
||||||
|
throw new UriFormatException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (UriFormatException)
|
||||||
|
{
|
||||||
|
Debug.LogError(string.Format("[Adjust]: Android deeplink URI scheme \"{0}\" is invalid and will be ignored.", uriScheme));
|
||||||
|
Debug.LogWarning(string.Format("[Adjust]: Make sure that your URI scheme entry ends with ://"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DoesIntentFilterAlreadyExist(manifest, uri))
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: Adding new URI with scheme: " + uri.Scheme + ", and host: " + uri.Host);
|
||||||
|
var newIntentFilter = GetNewIntentFilter(manifest);
|
||||||
|
var androidSchemeNode = manifest.CreateElement("data");
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "scheme", uri.Scheme, androidSchemeNode);
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "host", uri.Host, androidSchemeNode);
|
||||||
|
newIntentFilter.AppendChild(androidSchemeNode);
|
||||||
|
intentRoot.AppendChild(newIntentFilter);
|
||||||
|
Debug.Log(string.Format("[Adjust]: Android deeplink URI scheme \"{0}\" successfully added to your app's AndroidManifest.xml file.", uriScheme));
|
||||||
|
usedIntentFiltersChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return usedIntentFiltersChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static XmlElement GetNewIntentFilter(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
const string androidName = "name";
|
||||||
|
const string category = "category";
|
||||||
|
|
||||||
|
var intentFilter = manifest.CreateElement("intent-filter");
|
||||||
|
|
||||||
|
var actionElement = manifest.CreateElement("action");
|
||||||
|
AddAndroidNamespaceAttribute(manifest, androidName, "android.intent.action.VIEW", actionElement);
|
||||||
|
intentFilter.AppendChild(actionElement);
|
||||||
|
|
||||||
|
var defaultCategory = manifest.CreateElement(category);
|
||||||
|
AddAndroidNamespaceAttribute(manifest, androidName, "android.intent.category.DEFAULT", defaultCategory);
|
||||||
|
intentFilter.AppendChild(defaultCategory);
|
||||||
|
|
||||||
|
var browsableCategory = manifest.CreateElement(category);
|
||||||
|
AddAndroidNamespaceAttribute(manifest, androidName, "android.intent.category.BROWSABLE", browsableCategory);
|
||||||
|
intentFilter.AppendChild(browsableCategory);
|
||||||
|
|
||||||
|
return intentFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool DoesIntentFilterAlreadyExist(XmlDocument manifest, Uri link)
|
||||||
|
{
|
||||||
|
var xpath = string.Format("/manifest/application/activity/intent-filter/data[@android:scheme='{0}' and @android:host='{1}']", link.Scheme, link.Host);
|
||||||
|
return manifest.DocumentElement.SelectSingleNode(xpath, GetNamespaceManager(manifest)) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AddPermissions(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
// The Adjust SDK needs two permissions to be added to you app's manifest file:
|
||||||
|
// <uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
// <uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE" />
|
||||||
|
// <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
|
||||||
|
// <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: Checking if all permissions needed for the Adjust SDK are present in the app's AndroidManifest.xml file.");
|
||||||
|
|
||||||
|
var manifestHasChanged = false;
|
||||||
|
|
||||||
|
// If enabled by the user && android.permission.INTERNET permission is missing, add it.
|
||||||
|
if (AdjustSettings.androidPermissionInternet == true)
|
||||||
|
{
|
||||||
|
manifestHasChanged |= AddPermission(manifest, "android.permission.INTERNET");
|
||||||
|
}
|
||||||
|
// If enabled by the user && com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE permission is missing, add it.
|
||||||
|
if (AdjustSettings.androidPermissionInstallReferrerService == true)
|
||||||
|
{
|
||||||
|
manifestHasChanged |= AddPermission(manifest, "com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE");
|
||||||
|
}
|
||||||
|
// If enabled by the user && com.google.android.gms.permission.AD_ID permission is missing, add it.
|
||||||
|
if (AdjustSettings.androidPermissionAdId == true)
|
||||||
|
{
|
||||||
|
manifestHasChanged |= AddPermission(manifest, "com.google.android.gms.permission.AD_ID");
|
||||||
|
}
|
||||||
|
// If enabled by the user && android.permission.ACCESS_NETWORK_STATE permission is missing, add it.
|
||||||
|
if (AdjustSettings.androidPermissionAccessNetworkState == true)
|
||||||
|
{
|
||||||
|
manifestHasChanged |= AddPermission(manifest, "android.permission.ACCESS_NETWORK_STATE");
|
||||||
|
}
|
||||||
|
|
||||||
|
return manifestHasChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AddPermission(XmlDocument manifest, string permissionValue)
|
||||||
|
{
|
||||||
|
if (DoesPermissionExist(manifest, permissionValue))
|
||||||
|
{
|
||||||
|
Debug.Log(string.Format("[Adjust]: Your app's AndroidManifest.xml file already contains {0} permission.", permissionValue));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var element = manifest.CreateElement("uses-permission");
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "name", permissionValue, element);
|
||||||
|
manifest.DocumentElement.AppendChild(element);
|
||||||
|
Debug.Log(string.Format("[Adjust]: {0} permission successfully added to your app's AndroidManifest.xml file.", permissionValue));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool DoesPermissionExist(XmlDocument manifest, string permissionValue)
|
||||||
|
{
|
||||||
|
var xpath = string.Format("/manifest/uses-permission[@android:name='{0}']", permissionValue);
|
||||||
|
return manifest.DocumentElement.SelectSingleNode(xpath, GetNamespaceManager(manifest)) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AddBroadcastReceiver(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
// We're looking for existence of broadcast receiver in the AndroidManifest.xml
|
||||||
|
// Check out the example below how that usually looks like:
|
||||||
|
|
||||||
|
// <manifest
|
||||||
|
// <!-- ... -->>
|
||||||
|
//
|
||||||
|
// <supports-screens
|
||||||
|
// <!-- ... -->/>
|
||||||
|
//
|
||||||
|
// <application
|
||||||
|
// <!-- ... -->>
|
||||||
|
// <receiver
|
||||||
|
// android:name="com.adjust.sdk.AdjustReferrerReceiver"
|
||||||
|
// android:permission="android.permission.INSTALL_PACKAGES"
|
||||||
|
// android:exported="true" >
|
||||||
|
//
|
||||||
|
// <intent-filter>
|
||||||
|
// <action android:name="com.android.vending.INSTALL_REFERRER" />
|
||||||
|
// </intent-filter>
|
||||||
|
// </receiver>
|
||||||
|
//
|
||||||
|
// <activity android:name="com.unity3d.player.UnityPlayerActivity"
|
||||||
|
// <!-- ... -->
|
||||||
|
// </activity>
|
||||||
|
// </application>
|
||||||
|
//
|
||||||
|
// <!-- ... -->>
|
||||||
|
//
|
||||||
|
// </manifest>
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: Checking if app's AndroidManifest.xml file contains receiver for INSTALL_REFERRER intent.");
|
||||||
|
|
||||||
|
// Find the application node
|
||||||
|
var applicationNodeXpath = "/manifest/application";
|
||||||
|
var applicationNode = manifest.DocumentElement.SelectSingleNode(applicationNodeXpath);
|
||||||
|
|
||||||
|
// If there's no application node, something is really wrong with your AndroidManifest.xml.
|
||||||
|
if (applicationNode == null)
|
||||||
|
{
|
||||||
|
Debug.LogError("[Adjust]: Your app's AndroidManifest.xml file does not contain \"<application>\" node.");
|
||||||
|
Debug.LogError("[Adjust]: Unable to add the Adjust broadcast receiver to AndroidManifest.xml.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Okay, there's an application node in the AndroidManifest.xml file.
|
||||||
|
// Let's now check if user has already defined a receiver which is listening to INSTALL_REFERRER intent.
|
||||||
|
// If that is already defined, don't force the Adjust broadcast receiver to the manifest file.
|
||||||
|
// If not, add the Adjust broadcast receiver to the manifest file.
|
||||||
|
|
||||||
|
var customBroadcastReceiversNodes = GetCustomRecieverNodes(manifest);
|
||||||
|
if (customBroadcastReceiversNodes.Count > 0)
|
||||||
|
{
|
||||||
|
if (DoesAdjustBroadcastReceiverExist(manifest))
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: It seems like you are already using Adjust broadcast receiver. Yay.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("[Adjust]: It seems like you are using your own broadcast receiver.");
|
||||||
|
Debug.Log("[Adjust]: Please, add the calls to the Adjust broadcast receiver like described in here: https://github.com/adjust/android_sdk/blob/master/doc/english/referrer.md");
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate Adjust broadcast receiver entry and add it to the application node.
|
||||||
|
var receiverElement = manifest.CreateElement("receiver");
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "name", "com.adjust.sdk.AdjustReferrerReceiver", receiverElement);
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "permission", "android.permission.INSTALL_PACKAGES", receiverElement);
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "exported", "true", receiverElement);
|
||||||
|
|
||||||
|
var intentFilterElement = manifest.CreateElement("intent-filter");
|
||||||
|
var actionElement = manifest.CreateElement("action");
|
||||||
|
AddAndroidNamespaceAttribute(manifest, "name", "com.android.vending.INSTALL_REFERRER", actionElement);
|
||||||
|
|
||||||
|
intentFilterElement.AppendChild(actionElement);
|
||||||
|
receiverElement.AppendChild(intentFilterElement);
|
||||||
|
applicationNode.AppendChild(receiverElement);
|
||||||
|
|
||||||
|
Debug.Log("[Adjust]: Adjust broadcast receiver successfully added to your app's AndroidManifest.xml file.");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool DoesAdjustBroadcastReceiverExist(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
var xpath = "/manifest/application/receiver[@android:name='com.adjust.sdk.AdjustReferrerReceiver']";
|
||||||
|
return manifest.SelectSingleNode(xpath, GetNamespaceManager(manifest)) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<XmlNode> GetCustomRecieverNodes(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
var xpath = "/manifest/application/receiver[intent-filter/action[@android:name='com.android.vending.INSTALL_REFERRER']]";
|
||||||
|
return new List<XmlNode>(manifest.DocumentElement.SelectNodes(xpath, GetNamespaceManager(manifest)).OfType<XmlNode>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddAndroidNamespaceAttribute(XmlDocument manifest, string key, string value, XmlElement node)
|
||||||
|
{
|
||||||
|
var androidSchemeAttribute = manifest.CreateAttribute("android", key, "http://schemas.android.com/apk/res/android");
|
||||||
|
androidSchemeAttribute.InnerText = value;
|
||||||
|
node.SetAttributeNode(androidSchemeAttribute);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static XmlNamespaceManager GetNamespaceManager(XmlDocument manifest)
|
||||||
|
{
|
||||||
|
var namespaceManager = new XmlNamespaceManager(manifest.NameTable);
|
||||||
|
namespaceManager.AddNamespace("android", "http://schemas.android.com/apk/res/android");
|
||||||
|
return namespaceManager;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c88a79442bb9342b6956c7d59705f982
|
||||||
|
timeCreated: 1621599616
|
||||||
|
licenseType: Free
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"name": "AdjustSdk.Editor",
|
||||||
|
"references": [
|
||||||
|
"AdjustSdk.Scripts"
|
||||||
|
],
|
||||||
|
"includePlatforms": [
|
||||||
|
"Editor"
|
||||||
|
],
|
||||||
|
"excludePlatforms": []
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: afc3483c5bcfe43c4a7a6b7f99b52a07
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
// Inspired by: https://github.com/facebook/facebook-sdk-for-unity/blob/master/Facebook.Unity.Settings/FacebookSettings.cs
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
public class AdjustSettings : ScriptableObject
|
||||||
|
{
|
||||||
|
private static AdjustSettings instance;
|
||||||
|
public const string AdjustSettingsExportPath = "Adjust/Resources/AdjustSettings.asset";
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
private bool _iOSFrameworkAdSupport = true;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _iOSFrameworkAdServices = false;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _iOSFrameworkAppTrackingTransparency = false;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _iOSFrameworkStoreKit = false;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _androidPermissionInternet = true;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _androidPermissionInstallReferrerService = true;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _androidPermissionAdId = true;
|
||||||
|
[SerializeField]
|
||||||
|
private bool _androidPermissionAccessNetworkState = false;
|
||||||
|
[SerializeField]
|
||||||
|
private string _iOSUserTrackingUsageDescription;
|
||||||
|
[SerializeField]
|
||||||
|
private string _iOSUrlIdentifier;
|
||||||
|
[SerializeField]
|
||||||
|
private string[] _iOSUrlSchemes = new string[0];
|
||||||
|
[SerializeField]
|
||||||
|
private string[] _iOSUniversalLinksDomains = new string[0];
|
||||||
|
[SerializeField]
|
||||||
|
private string[] androidUriSchemes = new string[0];
|
||||||
|
[SerializeField]
|
||||||
|
private string _androidCustomActivityName;
|
||||||
|
|
||||||
|
public static AdjustSettings Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
instance = NullableInstance;
|
||||||
|
|
||||||
|
if (instance == null)
|
||||||
|
{
|
||||||
|
// Create AdjustSettings.asset inside the folder in which AdjustSettings.cs reside.
|
||||||
|
instance = ScriptableObject.CreateInstance<AdjustSettings>();
|
||||||
|
var guids = AssetDatabase.FindAssets(string.Format("{0} t:script", "AdjustSettings"));
|
||||||
|
if (guids == null || guids.Length <= 0)
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(guids[0]).Replace("AdjustSettings.cs", "AdjustSettings.asset");
|
||||||
|
// AdjustSettings.asset will be stored inside of the Adjust/Resources directory
|
||||||
|
if (assetPath.StartsWith("Assets"))
|
||||||
|
{
|
||||||
|
// plugin located in Assets directory
|
||||||
|
string rootDir = assetPath.Replace("/Adjust/Scripts/Editor/AdjustSettings.asset", "");
|
||||||
|
string adjustResourcesPath = Path.Combine(rootDir, "Adjust/Resources");
|
||||||
|
if (!Directory.Exists(adjustResourcesPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(adjustResourcesPath);
|
||||||
|
}
|
||||||
|
assetPath = Path.Combine(rootDir, AdjustSettingsExportPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// plugin located in Packages folder
|
||||||
|
string adjustResourcesPath = Path.Combine("Assets", "Adjust/Resources");
|
||||||
|
if (!Directory.Exists(adjustResourcesPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(adjustResourcesPath);
|
||||||
|
}
|
||||||
|
assetPath = Path.Combine("Assets", AdjustSettingsExportPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetDatabase.CreateAsset(instance, assetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AdjustSettings NullableInstance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (instance == null)
|
||||||
|
{
|
||||||
|
var guids = AssetDatabase.FindAssets(string.Format("{0} t:ScriptableObject", "AdjustSettings"));
|
||||||
|
if (guids == null || guids.Length <= 0)
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
var assetPath = AssetDatabase.GUIDToAssetPath(guids[0]);
|
||||||
|
instance = (AdjustSettings)AssetDatabase.LoadAssetAtPath(assetPath, typeof(AdjustSettings));
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool iOSFrameworkAdSupport
|
||||||
|
{
|
||||||
|
get { return Instance._iOSFrameworkAdSupport; }
|
||||||
|
set { Instance._iOSFrameworkAdSupport = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool iOSFrameworkAdServices
|
||||||
|
{
|
||||||
|
get { return Instance._iOSFrameworkAdServices; }
|
||||||
|
set { Instance._iOSFrameworkAdServices = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool iOSFrameworkAppTrackingTransparency
|
||||||
|
{
|
||||||
|
get { return Instance._iOSFrameworkAppTrackingTransparency; }
|
||||||
|
set { Instance._iOSFrameworkAppTrackingTransparency = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool iOSFrameworkStoreKit
|
||||||
|
{
|
||||||
|
get { return Instance._iOSFrameworkStoreKit; }
|
||||||
|
set { Instance._iOSFrameworkStoreKit = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool androidPermissionInternet
|
||||||
|
{
|
||||||
|
get { return Instance._androidPermissionInternet; }
|
||||||
|
set { Instance._androidPermissionInternet = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool androidPermissionInstallReferrerService
|
||||||
|
{
|
||||||
|
get { return Instance._androidPermissionInstallReferrerService; }
|
||||||
|
set { Instance._androidPermissionInstallReferrerService = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool androidPermissionAdId
|
||||||
|
{
|
||||||
|
get { return Instance._androidPermissionAdId; }
|
||||||
|
set { Instance._androidPermissionAdId = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool androidPermissionAccessNetworkState
|
||||||
|
{
|
||||||
|
get { return Instance._androidPermissionAccessNetworkState; }
|
||||||
|
set { Instance._androidPermissionAccessNetworkState = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string iOSUserTrackingUsageDescription
|
||||||
|
{
|
||||||
|
get { return Instance._iOSUserTrackingUsageDescription; }
|
||||||
|
set { Instance._iOSUserTrackingUsageDescription = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string iOSUrlIdentifier
|
||||||
|
{
|
||||||
|
get { return Instance._iOSUrlIdentifier; }
|
||||||
|
set { Instance._iOSUrlIdentifier = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string[] iOSUrlSchemes
|
||||||
|
{
|
||||||
|
get { return Instance._iOSUrlSchemes; }
|
||||||
|
set { Instance._iOSUrlSchemes = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string[] iOSUniversalLinksDomains
|
||||||
|
{
|
||||||
|
get { return Instance._iOSUniversalLinksDomains; }
|
||||||
|
set { Instance._iOSUniversalLinksDomains = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string[] AndroidUriSchemes
|
||||||
|
{
|
||||||
|
get { return Instance.androidUriSchemes; }
|
||||||
|
set { Instance.androidUriSchemes = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string AndroidCustomActivityName
|
||||||
|
{
|
||||||
|
get { return Instance._androidCustomActivityName; }
|
||||||
|
set { Instance._androidCustomActivityName = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ea4d495dc6d5ba64b90db7afda6a48a4
|
||||||
|
timeCreated: 1601333126
|
||||||
|
licenseType: Pro
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace AdjustSdk
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(AdjustSettings))]
|
||||||
|
public class AdjustSettingsEditor : Editor
|
||||||
|
{
|
||||||
|
SerializedProperty iOSFrameworkAdSupport;
|
||||||
|
SerializedProperty iOSFrameworkAdServices;
|
||||||
|
SerializedProperty iOSFrameworkAppTrackingTransparency;
|
||||||
|
SerializedProperty iOSFrameworkStoreKit;
|
||||||
|
SerializedProperty androidPermissionInternet;
|
||||||
|
SerializedProperty androidPermissionInstallReferrerService;
|
||||||
|
SerializedProperty androidPermissionAdId;
|
||||||
|
SerializedProperty androidPermissionAccessNetworkState;
|
||||||
|
SerializedProperty iOSUserTrackingUsageDescription;
|
||||||
|
SerializedProperty iOSUrlIdentifier;
|
||||||
|
SerializedProperty iOSUrlSchemes;
|
||||||
|
SerializedProperty iOSUniversalLinksDomains;
|
||||||
|
SerializedProperty androidUriSchemes;
|
||||||
|
SerializedProperty androidCustomActivityName;
|
||||||
|
|
||||||
|
void OnEnable()
|
||||||
|
{
|
||||||
|
iOSFrameworkAdSupport = serializedObject.FindProperty("_iOSFrameworkAdSupport");
|
||||||
|
iOSFrameworkAdServices = serializedObject.FindProperty("_iOSFrameworkAdServices");
|
||||||
|
iOSFrameworkAppTrackingTransparency = serializedObject.FindProperty("_iOSFrameworkAppTrackingTransparency");
|
||||||
|
iOSFrameworkStoreKit = serializedObject.FindProperty("_iOSFrameworkStoreKit");
|
||||||
|
androidPermissionInternet = serializedObject.FindProperty("_androidPermissionInternet");
|
||||||
|
androidPermissionInstallReferrerService = serializedObject.FindProperty("_androidPermissionInstallReferrerService");
|
||||||
|
androidPermissionAdId = serializedObject.FindProperty("_androidPermissionAdId");
|
||||||
|
androidPermissionAccessNetworkState = serializedObject.FindProperty("_androidPermissionAccessNetworkState");
|
||||||
|
iOSUserTrackingUsageDescription = serializedObject.FindProperty("_iOSUserTrackingUsageDescription");
|
||||||
|
iOSUrlIdentifier = serializedObject.FindProperty("_iOSUrlIdentifier");
|
||||||
|
iOSUrlSchemes = serializedObject.FindProperty("_iOSUrlSchemes");
|
||||||
|
iOSUniversalLinksDomains = serializedObject.FindProperty("_iOSUniversalLinksDomains");
|
||||||
|
androidUriSchemes = serializedObject.FindProperty("androidUriSchemes");
|
||||||
|
androidCustomActivityName = serializedObject.FindProperty("_androidCustomActivityName");
|
||||||
|
}
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
GUIStyle darkerCyanTextFieldStyles = new GUIStyle(EditorStyles.boldLabel);
|
||||||
|
darkerCyanTextFieldStyles.normal.textColor = new Color(0f/255f, 190f/255f, 190f/255f);
|
||||||
|
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("LINK IOS FRAMEWORKS:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
EditorGUILayout.PropertyField(iOSFrameworkAdSupport,
|
||||||
|
new GUIContent("AdSupport.framework",
|
||||||
|
"iOS framework needed to access IDFA value"),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(iOSFrameworkAdServices,
|
||||||
|
new GUIContent("AdServices.framework",
|
||||||
|
"iOS framework needed to support AdServices based Apple Search Ads attribution"),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(iOSFrameworkAppTrackingTransparency,
|
||||||
|
new GUIContent("AppTrackingTransparency.framework",
|
||||||
|
"iOS framework needed to display tracking consent dialog"),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(iOSFrameworkStoreKit,
|
||||||
|
new GUIContent("StoreKit.framework",
|
||||||
|
"iOS framework needed to use SKAdNetwork capabilities"),
|
||||||
|
true);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("ADD ANDROID PERMISSIONS:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
EditorGUILayout.PropertyField(androidPermissionInternet,
|
||||||
|
new GUIContent("android.permission.INTERNET",
|
||||||
|
"Android permission needed to send data to Adjust backend"),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(androidPermissionInstallReferrerService,
|
||||||
|
new GUIContent("com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE",
|
||||||
|
"Android permission needed to read install referrer"),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(androidPermissionAdId,
|
||||||
|
new GUIContent("com.google.android.gms.permission.AD_ID",
|
||||||
|
"Android permission needed to read Google Advertising ID if you target API 33 or later"),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(androidPermissionAccessNetworkState,
|
||||||
|
new GUIContent("android.permission.ACCESS_NETWORK_STATE",
|
||||||
|
"Android permission needed to determine type of network device is connected to"),
|
||||||
|
true);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("IOS PRIVACY:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
EditorGUILayout.PropertyField(iOSUserTrackingUsageDescription,
|
||||||
|
new GUIContent("User Tracking Description",
|
||||||
|
"String you would like to display to your users describing the reason " +
|
||||||
|
"behind asking for tracking permission."),
|
||||||
|
true);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("ANDROID ACTIVITY NAME:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
EditorGUILayout.PropertyField(androidCustomActivityName,
|
||||||
|
new GUIContent("Custom Android Activity Name",
|
||||||
|
"In case you are using custom activity instead of the default Unity activity " +
|
||||||
|
"(com.unity3d.player.UnityPlayerActivity), please specify it's full name."),
|
||||||
|
true);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
EditorGUILayout.LabelField("DEEP LINKING:", darkerCyanTextFieldStyles);
|
||||||
|
EditorGUI.indentLevel += 1;
|
||||||
|
EditorGUILayout.PropertyField(iOSUrlIdentifier,
|
||||||
|
new GUIContent("iOS URL Identifier",
|
||||||
|
"Value of CFBundleURLName property of the root CFBundleURLTypes element. " +
|
||||||
|
"If not needed otherwise, value should be your bundle ID."),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(iOSUrlSchemes,
|
||||||
|
new GUIContent("iOS URL Schemes",
|
||||||
|
"URL schemes handled by your app. " +
|
||||||
|
"Make sure to enter just the scheme name without :// part at the end."),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(iOSUniversalLinksDomains,
|
||||||
|
new GUIContent("iOS Universal Links Domains",
|
||||||
|
"Associated domains handled by your app. State just the domain part without applinks: part in front."),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.PropertyField(androidUriSchemes,
|
||||||
|
new GUIContent("Android URI Schemes",
|
||||||
|
"URI schemes handled by your app. " +
|
||||||
|
"Make sure to enter just the scheme name with :// part at the end."),
|
||||||
|
true);
|
||||||
|
EditorGUILayout.HelpBox(
|
||||||
|
"Please note that Adjust SDK doesn't remove existing URI Schemes, " +
|
||||||
|
"so if you need to clean previously added entries, " +
|
||||||
|
"you need to do it manually from \"Assets/Plugins/Android/AndroidManifest.xml\"",
|
||||||
|
MessageType.Info,
|
||||||
|
true);
|
||||||
|
EditorGUI.indentLevel -= 1;
|
||||||
|
serializedObject.ApplyModifiedProperties();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e957ffb3938e94bcaab247e46bd9804c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 638019d211e7141b7a78db997a91d582
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9c780c17852614618be5ffd9cc43a75f
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue