Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Editor/PluginSettings/AppodealSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ public class AppodealSettings : ScriptableObject
[SerializeField] private bool iosSkAdNetworkItems = true;
[SerializeField] private List<string> iosSkAdNetworkItemsList = new();

[Space(SpaceHeight)]
[Header("iOS AdAttributionKit IDs")]
[SerializeField] private bool iosAakIds = true;
[SerializeField] private List<string> iosAakIdsList = new();

[Space(SpaceHeight)]
[Header("Facebook Service")]
[SerializeField] private bool facebookAutoConfiguration;
Expand Down Expand Up @@ -196,6 +201,18 @@ public List<string> IosSkAdNetworkItemsList
set => iosSkAdNetworkItemsList = value;
}

public bool IosAakIds
{
get => iosAakIds;
set => iosAakIds = value;
}

public List<string> IosAakIdsList
{
get => iosAakIdsList;
set => iosAakIdsList = value;
}

public bool FirebaseAutoConfiguration
{
get => firebaseAutoConfiguration;
Expand Down
59 changes: 59 additions & 0 deletions Editor/PostProcess/iOSPostprocessUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public static void UpdateInfoPlist(BuildTarget buildTarget, string buildPath)
AddNsLocationWhenInUseUsageDescription(path);
AddNsCalendarsUsageDescription(path);
AddSkAdNetworkIds(buildTarget, buildPath);
AddAdNetworkIdentifiers(buildTarget, buildPath);
IosPostProcessServices.AddFacebookKeys(path);
Comment thread
dmitriifeshchenko marked this conversation as resolved.
}

Expand Down Expand Up @@ -82,6 +83,64 @@ private static void AddSkAdNetworkIds(BuildTarget buildTarget, string buildPath)
File.WriteAllText(plistPath, plist.WriteToString());
}

private static void AddAdNetworkIdentifiers(BuildTarget buildTarget, string buildPath)
{
if (String.IsNullOrEmpty(PlayerSettings.iOS.targetOSVersionString)) return;

if (!AppodealSettings.Instance.IosAakIds || (AppodealSettings.Instance.IosAakIdsList?.Count ?? 0) <= 0) return;

if (buildTarget != BuildTarget.iOS) return;

string plistPath = buildPath + "/Info.plist";
var plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));

PlistElementArray array = null;
if (plist.root.values.ContainsKey(AppodealUnityUtils.KeyAdNetworkIdentifiers))
{
try
{
plist.root.values.TryGetValue(AppodealUnityUtils.KeyAdNetworkIdentifiers, out var element);
if (element != null) array = element.AsArray();
}
catch (Exception e)
{
Debug.LogError(e.Message);
array = null;
}
}
else
{
array = plist.root.CreateArray(AppodealUnityUtils.KeyAdNetworkIdentifiers);
}

Comment thread
dmitriifeshchenko marked this conversation as resolved.
if (array != null)
{
var existing = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var elem in array.values)
{
try
{
string val = elem.AsString();
if (!String.IsNullOrEmpty(val)) existing.Add(val);
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}

foreach (string id in AppodealSettings.Instance.IosAakIdsList)
{
if (existing.Contains(id)) continue;
array.AddString(id);
existing.Add(id);
}
}

File.WriteAllText(plistPath, plist.WriteToString());
}

private static void AddKeyToPlist(string path, string key, string value)
{
var plist = new PlistDocument();
Expand Down
62 changes: 57 additions & 5 deletions Editor/SettingsWindow/AppodealSettingsWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,26 @@ public static void ShowAppodealSettingsWindow()

private async void OnEnable()
{
var ids = await GetSkAdNetworkIds();
var skAdNetworkTask = GetSkAdNetworkIds();
var aakTask = GetAakIds();

var ids = await skAdNetworkTask;

if (AppodealSettings.Instance == null) return;

Comment thread
dmitriifeshchenko marked this conversation as resolved.
if (ids?.Count > 0 && !ids.SequenceEqual(AppodealSettings.Instance.IosSkAdNetworkItemsList))
{
AppodealSettings.Instance.IosSkAdNetworkItemsList = ids;
}

var aakIds = await aakTask;

if (AppodealSettings.Instance == null) return;

if (aakIds?.Count > 0 && !aakIds.SequenceEqual(AppodealSettings.Instance.IosAakIdsList))
{
AppodealSettings.Instance.IosAakIdsList = aakIds;
}
}

private static async Task<List<string>> GetSkAdNetworkIds()
Expand Down Expand Up @@ -69,6 +81,43 @@ private static async Task<List<string>> GetSkAdNetworkIds()
}
}

private static async Task<List<string>> GetAakIds()
{
try
{
var request = UnityWebRequest.Get("https://neo-mw-backend.appodeal.com/v4/aak/ids");
_ = request.SendWebRequest();
while (!request.isDone) await Task.Yield();

if (request.result != UnityWebRequest.Result.Success)
{
request.Dispose();
return new List<string>();
}

string json = request.downloadHandler.text;
request.Dispose();

if (String.IsNullOrWhiteSpace(json) || !json.StartsWith('[') || !json.EndsWith(']')) return new List<string>();

string[] ids = JsonHelper.FromJson<string>(JsonHelper.FixJson(json));
if ((ids?.Length ?? 0) < 1) return new List<string>();

var regex = new Regex(@"^[a-z0-9]+\.[a-z]+$");
return ids!
.Select(id => id?.ToLowerInvariant())
.Where(id => !String.IsNullOrEmpty(id) && regex.IsMatch(id))
.Distinct()
Comment thread
dmitriifeshchenko marked this conversation as resolved.
.OrderBy(id => id)
.ToList();
}
catch (Exception e)
{
Debug.LogException(e);
return new List<string>();
}
}

private void OnDestroy()
{
AnalyticsService.TrackClickEvent(ActionType.CloseAppodealSettings);
Expand Down Expand Up @@ -158,21 +207,24 @@ private void OnGUI()
AppodealSettings.Instance.NsAppTransportSecurity = KeyRow("NSAppTransportSecurity",
AppodealSettings.Instance.NsAppTransportSecurity);

GUILayout.Space(35);
if (GUILayout.Button("SKAdNetwork", new GUIStyle(EditorStyles.label)
GUILayout.Space(15);
if (GUILayout.Button("Attribution", new GUIStyle(EditorStyles.label)
{
fontSize = 12,
fontStyle = FontStyle.Bold,
fixedHeight = 18
}, GUILayout.ExpandWidth(true)))
{
Application.OpenURL("https://developer.apple.com/documentation/storekit/skadnetwork");
Application.OpenURL("https://developer.apple.com/documentation/AdAttributionKit/adattributionkit-skadnetwork-interoperability");
}

AppodealSettings.Instance.IosSkAdNetworkItems = KeyRow("Add SKAdNetworkItems",
AppodealSettings.Instance.IosSkAdNetworkItems);

GUILayout.Space(12);
AppodealSettings.Instance.IosAakIds = KeyRow("Add AdNetworkIdentifiers",
AppodealSettings.Instance.IosAakIds);

GUILayout.Space(7);
}

GUILayout.EndHorizontal();
Expand Down
1 change: 1 addition & 0 deletions Editor/Utils/AppodealUnityUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public static class AppodealUnityUtils
private const BindingFlags PublicStaticFlags = BindingFlags.Public | BindingFlags.Static;
public const string KeySkAdNetworkItems = "SKAdNetworkItems";
public const string KeySkAdNetworkID = "SKAdNetworkIdentifier";
public const string KeyAdNetworkIdentifiers = "AdNetworkIdentifiers";
public const string GadApplicationIdentifier = "GADApplicationIdentifier";
public const string NsUserTrackingUsageDescriptionKey = "NSUserTrackingUsageDescription";
public const string NsUserTrackingUsageDescription = "This identifier will be used to deliver personalized ads to you";
Expand Down
Loading