init
This commit is contained in:
85
Assets/Adjust/Editor/AdjustCustomEditor.cs
Normal file
85
Assets/Adjust/Editor/AdjustCustomEditor.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEditor;
|
||||
|
||||
namespace com.adjust.sdk
|
||||
{
|
||||
[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);
|
||||
adjust.urlStrategy = (AdjustUrlStrategy)EditorGUILayout.EnumPopup("URL Strategy", adjust.urlStrategy);
|
||||
adjust.eventBuffering = EditorGUILayout.Toggle("Event Buffering", adjust.eventBuffering);
|
||||
adjust.sendInBackground = EditorGUILayout.Toggle("Send In Background", adjust.sendInBackground);
|
||||
adjust.launchDeferredDeeplink = EditorGUILayout.Toggle("Launch Deferred Deep Link", adjust.launchDeferredDeeplink);
|
||||
adjust.needsCost = EditorGUILayout.Toggle("Cost Data In Attribution Callback", adjust.needsCost);
|
||||
adjust.coppaCompliant = EditorGUILayout.Toggle("COPPA Compliant", adjust.coppaCompliant);
|
||||
adjust.linkMe = EditorGUILayout.Toggle("LinkMe", adjust.linkMe);
|
||||
adjust.defaultTracker = EditorGUILayout.TextField("Default Tracker", adjust.defaultTracker);
|
||||
adjust.startDelay = EditorGUILayout.DoubleField("Start Delay", adjust.startDelay);
|
||||
EditorGUILayout.LabelField("App Secret:", EditorStyles.label);
|
||||
EditorGUI.indentLevel += 1;
|
||||
adjust.secretId = EditorGUILayout.LongField("Secret ID", adjust.secretId);
|
||||
adjust.info1 = EditorGUILayout.LongField("Info 1", adjust.info1);
|
||||
adjust.info2 = EditorGUILayout.LongField("Info 2", adjust.info2);
|
||||
adjust.info3 = EditorGUILayout.LongField("Info 3", adjust.info3);
|
||||
adjust.info4 = EditorGUILayout.LongField("Info 4", adjust.info4);
|
||||
EditorGUI.indentLevel -= 2;
|
||||
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);
|
||||
adjust.playStoreKidsApp = EditorGUILayout.Toggle("Play Store Kids App", adjust.playStoreKidsApp);
|
||||
EditorGUI.indentLevel -= 1;
|
||||
EditorGUILayout.Space();
|
||||
EditorGUILayout.LabelField("IOS SETTINGS:", darkerCyanTextFieldStyles);
|
||||
EditorGUI.indentLevel += 1;
|
||||
adjust.iadInfoReading = EditorGUILayout.Toggle("iAd Info Reading", adjust.iadInfoReading);
|
||||
adjust.adServicesInfoReading = EditorGUILayout.Toggle("AdServices Info Reading", adjust.adServicesInfoReading);
|
||||
adjust.idfaInfoReading = EditorGUILayout.Toggle("IDFA Info Reading", adjust.idfaInfoReading);
|
||||
adjust.skAdNetworkHandling = EditorGUILayout.Toggle("SKAdNetwork Handling", adjust.skAdNetworkHandling);
|
||||
EditorGUI.indentLevel -= 1;
|
||||
}
|
||||
|
||||
if (settingsEditor == null)
|
||||
{
|
||||
settingsEditor = CreateEditor(AdjustSettings.Instance);
|
||||
}
|
||||
|
||||
settingsEditor.OnInspectorGUI();
|
||||
|
||||
if (GUI.changed)
|
||||
{
|
||||
EditorUtility.SetDirty(adjust);
|
||||
EditorSceneManager.MarkSceneDirty(adjust.gameObject.scene);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
13
Assets/Adjust/Editor/AdjustCustomEditor.cs.meta
Normal file
13
Assets/Adjust/Editor/AdjustCustomEditor.cs.meta
Normal file
@@ -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:
|
||||
348
Assets/Adjust/Editor/AdjustEditor.cs
Normal file
348
Assets/Adjust/Editor/AdjustEditor.cs
Normal file
@@ -0,0 +1,348 @@
|
||||
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;
|
||||
#endif
|
||||
|
||||
public class AdjustEditor : AssetPostprocessor
|
||||
{
|
||||
[MenuItem("Assets/Adjust/Export Unity Package")]
|
||||
public static void ExportAdjustUnityPackage()
|
||||
{
|
||||
string exportedFileName = "Adjust.unitypackage";
|
||||
string assetsPath = "Assets/Adjust";
|
||||
List<string> assetsToExport = new List<string>();
|
||||
|
||||
// Adjust Assets.
|
||||
assetsToExport.Add(assetsPath + "/3rd Party/SimpleJSON.cs");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/Android/adjust-android.jar");
|
||||
assetsToExport.Add(assetsPath + "/Android/AdjustAndroid.cs");
|
||||
assetsToExport.Add(assetsPath + "/Android/AdjustAndroidManifest.xml");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/Editor/AdjustEditor.cs");
|
||||
assetsToExport.Add(assetsPath + "/Editor/AdjustSettings.cs");
|
||||
assetsToExport.Add(assetsPath + "/Editor/AdjustSettingsEditor.cs");
|
||||
assetsToExport.Add(assetsPath + "/Editor/AdjustCustomEditor.cs");
|
||||
assetsToExport.Add(assetsPath + "/Editor/AdjustEditorPreprocessor.cs");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/ExampleGUI/ExampleGUI.cs");
|
||||
assetsToExport.Add(assetsPath + "/ExampleGUI/ExampleGUI.prefab");
|
||||
assetsToExport.Add(assetsPath + "/ExampleGUI/ExampleGUI.unity");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJAttribution.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJConfig.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJEvent.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJEventFailure.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJEventSuccess.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJLogger.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJSessionFailure.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJSessionSuccess.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/ADJSubscription.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/Adjust.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/AdjustiOS.cs");
|
||||
assetsToExport.Add(assetsPath + "/iOS/AdjustSdk.a");
|
||||
assetsToExport.Add(assetsPath + "/iOS/AdjustUnity.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/AdjustUnity.mm");
|
||||
assetsToExport.Add(assetsPath + "/iOS/AdjustUnityDelegate.h");
|
||||
assetsToExport.Add(assetsPath + "/iOS/AdjustUnityDelegate.mm");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/Prefab/Adjust.prefab");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/Unity/Adjust.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustAppStoreSubscription.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustAttribution.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustConfig.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustEnvironment.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustEvent.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustEventFailure.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustEventSuccess.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustLogLevel.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustPlayStoreSubscription.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustSessionFailure.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustSessionSuccess.cs");
|
||||
assetsToExport.Add(assetsPath + "/Unity/AdjustUtils.cs");
|
||||
|
||||
assetsToExport.Add(assetsPath + "/Windows/AdjustWindows.cs");
|
||||
assetsToExport.Add(assetsPath + "/Windows/WindowsPcl.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/WindowsUap.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/Stubs/Win10Interface.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/Stubs/Win81Interface.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/Stubs/WinWsInterface.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/W81/AdjustWP81.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/W81/Win81Interface.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/WS/AdjustWS.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/WS/WinWsInterface.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/WU10/AdjustUAP10.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/WU10/Win10Interface.dll");
|
||||
assetsToExport.Add(assetsPath + "/Windows/Newtonsoft.Json.dll");
|
||||
|
||||
AssetDatabase.ExportPackage(
|
||||
assetsToExport.ToArray(),
|
||||
exportedFileName,
|
||||
ExportPackageOptions.IncludeDependencies | ExportPackageOptions.Interactive);
|
||||
}
|
||||
|
||||
[PostProcessBuild]
|
||||
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)
|
||||
// - iAd.framework (needed in case you are running ASA campaigns)
|
||||
// - 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.iOSFrameworkiAd)
|
||||
{
|
||||
Debug.Log("[Adjust]: Adding iAd.framework to Xcode project.");
|
||||
xcodeProject.AddFrameworkToProject(xcodeTarget, "iAd.framework", true);
|
||||
Debug.Log("[Adjust]: iAd.framework added successfully.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("[Adjust]: Skipping iAd.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
|
||||
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.");
|
||||
|
||||
// The Adjust SDK needs to have -ObjC flag set in other linker flags section because of it's categories.
|
||||
// OTHER_LDFLAGS -ObjC
|
||||
//
|
||||
// Seems that in newer Unity IDE versions adding -ObjC flag to Unity-iPhone target doesn't do the trick.
|
||||
// Adding -ObjC to UnityFramework target however does make things work nicely again.
|
||||
// This happens because Unity is linking SDK's static library into UnityFramework target.
|
||||
// Check for presence of UnityFramework target and if there, include -ObjC flag inside of it.
|
||||
|
||||
Debug.Log("[Adjust]: Adding -ObjC flag to other linker flags (OTHER_LDFLAGS) of Unity-iPhone target.");
|
||||
xcodeProject.AddBuildProperty(xcodeTarget, "OTHER_LDFLAGS", "-ObjC");
|
||||
Debug.Log("[Adjust]: -ObjC successfully added to other linker flags.");
|
||||
string xcodeTargetUnityFramework = xcodeProject.TargetGuidByName("UnityFramework");
|
||||
if (!string.IsNullOrEmpty(xcodeTargetUnityFramework))
|
||||
{
|
||||
Debug.Log("[Adjust]: Adding -ObjC flag to other linker flags (OTHER_LDFLAGS) of UnityFramework target.");
|
||||
xcodeProject.AddBuildProperty(xcodeTargetUnityFramework, "OTHER_LDFLAGS", "-ObjC");
|
||||
Debug.Log("[Adjust]: -ObjC successfully added to other linker flags.");
|
||||
}
|
||||
|
||||
if (xcodeProject.ContainsFileByProjectPath("Libraries/Adjust/iOS/AdjustSigSdk.a"))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(xcodeTargetUnityFramework))
|
||||
{
|
||||
xcodeProject.AddBuildProperty(xcodeTargetUnityFramework, "OTHER_LDFLAGS", "-force_load $(PROJECT_DIR)/Libraries/Adjust/iOS/AdjustSigSdk.a");
|
||||
}
|
||||
else
|
||||
{
|
||||
xcodeProject.AddBuildProperty(xcodeTarget, "OTHER_LDFLAGS", "-force_load $(PROJECT_DIR)/Libraries/Adjust/iOS/AdjustSigSdk.a");
|
||||
}
|
||||
}
|
||||
|
||||
// Save the changes to Xcode project file.
|
||||
xcodeProject.WriteToFile(xcodeProjectPath);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_IOS
|
||||
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 = "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
|
||||
}
|
||||
8
Assets/Adjust/Editor/AdjustEditor.cs.meta
Normal file
8
Assets/Adjust/Editor/AdjustEditor.cs.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fc5962e0096e9495bbad76934c842619
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
365
Assets/Adjust/Editor/AdjustEditorPreprocessor.cs
Normal file
365
Assets/Adjust/Editor/AdjustEditorPreprocessor.cs
Normal file
@@ -0,0 +1,365 @@
|
||||
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;
|
||||
|
||||
#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/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");
|
||||
|
||||
var intentRoot = manifest.DocumentElement.SelectSingleNode("/manifest/application/activity[@android:name='com.unity3d.player.UnityPlayerActivity']", GetNamespaceManager(manifest));
|
||||
var usedIntentFiltersChanged = false;
|
||||
var usedIntentFilters = GetIntentFilter(manifest);
|
||||
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 (!IsIntentFilterAlreadyExist(manifest, uri))
|
||||
{
|
||||
Debug.Log("[Adjust]: Adding new URI with scheme: " + uri.Scheme + ", and host: " + uri.Host);
|
||||
var androidSchemeNode = manifest.CreateElement("data");
|
||||
AddAndroidNamespaceAttribute(manifest, "scheme", uri.Scheme, androidSchemeNode);
|
||||
AddAndroidNamespaceAttribute(manifest, "host", uri.Host, androidSchemeNode);
|
||||
usedIntentFilters.AppendChild(androidSchemeNode);
|
||||
usedIntentFiltersChanged = true;
|
||||
|
||||
Debug.Log(string.Format("[Adjust]: Android deeplink URI scheme \"{0}\" successfully added to your app's AndroidManifest.xml file.", uriScheme));
|
||||
}
|
||||
}
|
||||
|
||||
if (usedIntentFiltersChanged && usedIntentFilters.ParentNode == null)
|
||||
{
|
||||
intentRoot.AppendChild(usedIntentFilters);
|
||||
}
|
||||
|
||||
return usedIntentFiltersChanged;
|
||||
}
|
||||
|
||||
private static XmlElement GetIntentFilter(XmlDocument manifest)
|
||||
{
|
||||
var xpath = "/manifest/application/activity/intent-filter[data/@android:scheme and data/@android:host]";
|
||||
var intentFilter = manifest.DocumentElement.SelectSingleNode(xpath, GetNamespaceManager(manifest)) as XmlElement;
|
||||
if (intentFilter == null)
|
||||
{
|
||||
const string androidName = "name";
|
||||
const string category = "category";
|
||||
|
||||
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 IsIntentFilterAlreadyExist(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
|
||||
}
|
||||
13
Assets/Adjust/Editor/AdjustEditorPreprocessor.cs.meta
Normal file
13
Assets/Adjust/Editor/AdjustEditorPreprocessor.cs.meta
Normal file
@@ -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:
|
||||
28
Assets/Adjust/Editor/AdjustSettings.asset
Normal file
28
Assets/Adjust/Editor/AdjustSettings.asset
Normal file
@@ -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
|
||||
_iOSFrameworkiAd: 0
|
||||
_iOSFrameworkAdServices: 0
|
||||
_iOSFrameworkAppTrackingTransparency: 0
|
||||
_iOSFrameworkStoreKit: 0
|
||||
_androidPermissionInternet: 1
|
||||
_androidPermissionInstallReferrerService: 1
|
||||
_androidPermissionAdId: 1
|
||||
_androidPermissionAccessNetworkState: 0
|
||||
_iOSUserTrackingUsageDescription:
|
||||
_iOSUrlIdentifier:
|
||||
_iOSUrlSchemes: []
|
||||
_iOSUniversalLinksDomains: []
|
||||
androidUriSchemes: []
|
||||
8
Assets/Adjust/Editor/AdjustSettings.asset.meta
Normal file
8
Assets/Adjust/Editor/AdjustSettings.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a31d99032792e3c408acc58e27146961
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
165
Assets/Adjust/Editor/AdjustSettings.cs
Normal file
165
Assets/Adjust/Editor/AdjustSettings.cs
Normal file
@@ -0,0 +1,165 @@
|
||||
// Inspired by: https://github.com/facebook/facebook-sdk-for-unity/blob/master/Facebook.Unity.Settings/FacebookSettings.cs
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
public class AdjustSettings : ScriptableObject
|
||||
{
|
||||
private static AdjustSettings instance;
|
||||
|
||||
[SerializeField]
|
||||
private bool _iOSFrameworkAdSupport = true;
|
||||
[SerializeField]
|
||||
private bool _iOSFrameworkiAd = false;
|
||||
[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];
|
||||
|
||||
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");
|
||||
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 iOSFrameworkiAd
|
||||
{
|
||||
get { return Instance._iOSFrameworkiAd; }
|
||||
set { Instance._iOSFrameworkiAd = 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; }
|
||||
}
|
||||
}
|
||||
13
Assets/Adjust/Editor/AdjustSettings.cs.meta
Normal file
13
Assets/Adjust/Editor/AdjustSettings.cs.meta
Normal file
@@ -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:
|
||||
132
Assets/Adjust/Editor/AdjustSettingsEditor.cs
Normal file
132
Assets/Adjust/Editor/AdjustSettingsEditor.cs
Normal file
@@ -0,0 +1,132 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
namespace com.adjust.sdk
|
||||
{
|
||||
[CustomEditor(typeof(AdjustSettings))]
|
||||
public class AdjustSettingsEditor : Editor
|
||||
{
|
||||
SerializedProperty iOSFrameworkAdSupport;
|
||||
SerializedProperty iOSFrameworkiAd;
|
||||
SerializedProperty iOSFrameworkAdServices;
|
||||
SerializedProperty iOSFrameworkAppTrackingTransparency;
|
||||
SerializedProperty iOSFrameworkStoreKit;
|
||||
SerializedProperty androidPermissionInternet;
|
||||
SerializedProperty androidPermissionInstallReferrerService;
|
||||
SerializedProperty androidPermissionAdId;
|
||||
SerializedProperty androidPermissionAccessNetworkState;
|
||||
SerializedProperty iOSUserTrackingUsageDescription;
|
||||
SerializedProperty iOSUrlIdentifier;
|
||||
SerializedProperty iOSUrlSchemes;
|
||||
SerializedProperty iOSUniversalLinksDomains;
|
||||
SerializedProperty androidUriSchemes;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
iOSFrameworkAdSupport = serializedObject.FindProperty("_iOSFrameworkAdSupport");
|
||||
iOSFrameworkiAd = serializedObject.FindProperty("_iOSFrameworkiAd");
|
||||
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");
|
||||
}
|
||||
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(iOSFrameworkiAd,
|
||||
new GUIContent("iAd.framework",
|
||||
"iOS framework needed to support iAd based Apple Search Ads attribution"),
|
||||
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("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();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/Adjust/Editor/AdjustSettingsEditor.cs.meta
Normal file
11
Assets/Adjust/Editor/AdjustSettingsEditor.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e957ffb3938e94bcaab247e46bd9804c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user