using System; using System.Linq; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using AOT; using UnityEngine; using ConsentManager.Common; namespace ConsentManager.Platforms.iOS { #if UNITY_IPHONE [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "CollectionNeverUpdated.Local")] [SuppressMessage("ReSharper", "UnusedType.Global")] [SuppressMessage("ReSharper", "UnusedMember.Global")] public class iOSConsentManager : IConsentManager { private readonly ConsentManagerObjCBridge consentManagerObjCBridge; private static IConsentInfoUpdateListener consentInfoUpdateListener; public iOSConsentManager() { consentManagerObjCBridge = new ConsentManagerObjCBridge(); } public iOSConsentManager(IntPtr intPtr) { consentManagerObjCBridge = new ConsentManagerObjCBridge(intPtr); } public void requestConsentInfoUpdate(string appodealAppKey, IConsentInfoUpdateListener listener) { consentInfoUpdateListener = listener; ConsentManagerObjCBridge.requestConsentInfoUpdate(appodealAppKey, onConsentInfoUpdated, onFailedToUpdateConsentInfo); } public void disableAppTrackingTransparencyRequest() { ConsentManagerObjCBridge.disableAppTrackingTransparencyRequest(); } public void setCustomVendor(Vendor customVendor) { var vendor = (iOSVendor) customVendor.getNativeVendor(); consentManagerObjCBridge.setCustomVendor(vendor.getIntPtr()); } public Vendor getCustomVendor(string bundle) { return new Vendor(new iOSVendor(consentManagerObjCBridge.getCustomVendor(bundle))); } public ConsentManager.Storage getStorage() { var storage = ConsentManager.Storage.NONE; switch (consentManagerObjCBridge.getStorage()) { case "NONE": storage = ConsentManager.Storage.NONE; break; case "SHARED_PREFERENCE": storage = ConsentManager.Storage.SHARED_PREFERENCE; break; } return storage; } public void setStorage(ConsentManager.Storage iabStorage) { consentManagerObjCBridge.setStorage(iabStorage.ToString()); } public string getIabConsentString() { return consentManagerObjCBridge.getIabConsentString(); } public Consent.ShouldShow shouldShowConsentDialog() { var shouldShow = Consent.ShouldShow.UNKNOWN; switch (consentManagerObjCBridge.shouldShowConsentDialog()) { case "UNKNOWN": shouldShow = Consent.ShouldShow.UNKNOWN; break; case "TRUE": shouldShow = Consent.ShouldShow.TRUE; break; case "FALSE": shouldShow = Consent.ShouldShow.FALSE; break; } return shouldShow; } public Consent.Zone getConsentZone() { var zone = Consent.Zone.UNKNOWN; switch (consentManagerObjCBridge.getConsentZone()) { case "UNKNOWN": zone = Consent.Zone.UNKNOWN; break; case "CCPA": zone = Consent.Zone.CCPA; break; case "GDPR": zone = Consent.Zone.GDPR; break; case "NONE": zone = Consent.Zone.NONE; break; } return zone; } public Consent.Status getConsentStatus() { var status = Consent.Status.UNKNOWN; switch (consentManagerObjCBridge.getConsentStatus()) { case "UNKNOWN": status = Consent.Status.UNKNOWN; break; case "PERSONALIZED": status = Consent.Status.PERSONALIZED; break; case "NON_PERSONALIZED": status = Consent.Status.NON_PERSONALIZED; break; case "PARTLY_PERSONALIZED": status = Consent.Status.PARTLY_PERSONALIZED; break; } return status; } public Consent getConsent() { return new Consent(new iOSConsent(consentManagerObjCBridge.getConsent())); } #region ConsentInfoUpdate delegate [MonoPInvokeCallback(typeof(ConsentInfoUpdatedCallback))] private static void onConsentInfoUpdated(IntPtr consent) { Debug.Log("onConsentInfoUpdated"); consentInfoUpdateListener?.onConsentInfoUpdated(new Consent(new iOSConsent(consent))); } [MonoPInvokeCallback(typeof(ConsentInfoUpdatedFailedCallback))] private static void onFailedToUpdateConsentInfo(IntPtr error) { consentInfoUpdateListener?.onFailedToUpdateConsentInfo( new ConsentManagerException(new iOSConsentManagerException(error))); } #endregion } [SuppressMessage("ReSharper", "InconsistentNaming")] public class iOSVendor : IVendor { private readonly VendorObjBridge vendorObjBridge; public iOSVendor(IntPtr vendor) { vendorObjBridge = new VendorObjBridge(vendor); } public IntPtr getIntPtr() { return vendorObjBridge.getVendor(); } public string getName() { return VendorObjBridge.getName(); } public string getBundle() { return VendorObjBridge.getBundle(); } public string getPolicyUrl() { return VendorObjBridge.getPolicyUrl(); } public List getPurposeIds() { return VendorObjBridge.getPurposeIds(); } public List getFeatureIds() { return VendorObjBridge.getFeatureIds(); } public List getLegitimateInterestPurposeIds() { return VendorObjBridge.getLegitimateInterestPurposeIds(); } } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "UnusedType.Global")] public class iOSVendorBuilder : IVendorBuilder { private readonly VendorBuilderObjCBridge vendorBuilderObjCBridge; public iOSVendorBuilder(string name, string bundle, string url) { vendorBuilderObjCBridge = new VendorBuilderObjCBridge(name, bundle, url); } private IntPtr GetIntPtr() { return vendorBuilderObjCBridge.getNativeObject(); } public IVendor build() { return new iOSVendor(GetIntPtr()); } public void setPurposeIds(IEnumerable purposeIds) { VendorBuilderObjCBridge.setPurposeIds(Helper.getEnumerable(purposeIds)); } public void setFeatureIds(IEnumerable featureIds) { VendorBuilderObjCBridge.setFeatureIds(Helper.getEnumerable(featureIds)); } public void setLegitimateInterestPurposeIds(IEnumerable legitimateInterestPurposeIds) { VendorBuilderObjCBridge.setLegitimateInterestPurposeIds(Helper.getEnumerable(legitimateInterestPurposeIds)); } } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "ObjectCreationAsStatement")] public class iOSConsentForm : IConsentForm { public iOSConsentForm(IntPtr intPtr) { new ConsentFormObjCBridge(intPtr); } public void load() { ConsentFormObjCBridge.load(); } public void show() { ConsentFormObjCBridge.show(); } public bool isLoaded() { return ConsentFormObjCBridge.isLoaded(); } public bool isShowing() { return ConsentFormObjCBridge.isShowing(); } } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "UnassignedField.Global")] [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] [SuppressMessage("ReSharper", "UnusedType.Global")] public class iOSConsentFormBuilder { private readonly ConsentFormBuilderObjCBridge consentFormBuilderObjCBridge; public static IConsentFormListener consentFormListeners; public iOSConsentFormBuilder() { consentFormBuilderObjCBridge = new ConsentFormBuilderObjCBridge(); } public iOSConsentFormBuilder(IntPtr intPtr) { consentFormBuilderObjCBridge = new ConsentFormBuilderObjCBridge(intPtr); } private IntPtr GetIntPtr() { return consentFormBuilderObjCBridge.getConsentFormBuilder(); } public IConsentForm build() { return new iOSConsentForm(GetIntPtr()); } public void withListener(IConsentFormListener listener) { consentFormListeners = listener; ConsentFormBuilderObjCBridge.withListener(onConsentFormLoaded, onConsentFormError, onConsentFormOpened, onConsentFormClosed); } #region ConsentForm Callbacks [MonoPInvokeCallback(typeof(ConsentFormCallback))] private static void onConsentFormLoaded() { consentFormListeners?.onConsentFormLoaded(); } [MonoPInvokeCallback(typeof(ConsentFormCallbackError))] private static void onConsentFormError(IntPtr exception) { consentFormListeners?.onConsentFormError(new ConsentManagerException(new iOSConsentManagerException(exception))); } [MonoPInvokeCallback(typeof(ConsentFormCallback))] private static void onConsentFormOpened() { consentFormListeners?.onConsentFormOpened(); } [MonoPInvokeCallback(typeof(ConsentFormCallbackClosed))] private static void onConsentFormClosed(IntPtr consent) { consentFormListeners?.onConsentFormClosed(new Consent(new iOSConsent(consent))); } #endregion } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "UnusedMember.Global")] public class iOSConsentManagerException : IConsentManagerException { private readonly ConsentManagerExceptionObjCBridge consentManagerExceptionObjCBridge; public iOSConsentManagerException() { consentManagerExceptionObjCBridge = new ConsentManagerExceptionObjCBridge(); } public iOSConsentManagerException(IntPtr intPtr) { consentManagerExceptionObjCBridge = new ConsentManagerExceptionObjCBridge(intPtr); } public string getReason() { return consentManagerExceptionObjCBridge.getReason(); } public int getCode() { return ConsentManagerExceptionObjCBridge.getCode(); } } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "UnusedMember.Global")] public class iOSConsent : IConsent { private readonly ConsentObjBridge consentObjBridge; public iOSConsent(IntPtr intPtr) { consentObjBridge = new ConsentObjBridge(intPtr); } public IntPtr GetIntPtr() { return consentObjBridge.getConsent(); } public Consent.Zone getZone() { var zone = Consent.Zone.UNKNOWN; switch (ConsentObjBridge.getZone()) { case "UNKNOWN": zone = Consent.Zone.UNKNOWN; break; case "NONE": zone = Consent.Zone.NONE; break; case "CCPA": zone = Consent.Zone.CCPA; break; case "GDPR": zone = Consent.Zone.GDPR; break; } return zone; } public Consent.Status getStatus() { var status = Consent.Status.UNKNOWN; switch (ConsentObjBridge.getStatus()) { case "UNKNOWN": status = Consent.Status.UNKNOWN; break; case "PERSONALIZED": status = Consent.Status.PERSONALIZED; break; case "NON_PERSONALIZED": status = Consent.Status.NON_PERSONALIZED; break; case "PARTLY_PERSONALIZED": status = Consent.Status.PARTLY_PERSONALIZED; break; } return status; } public Consent.AuthorizationStatus getAuthorizationStatus() { var authorizationStatus = Consent.AuthorizationStatus.NOT_DETERMINED; switch (ConsentObjBridge.getAuthorizationStatus()) { case "NOT_DETERMINED": authorizationStatus = Consent.AuthorizationStatus.NOT_DETERMINED; break; case "DENIED": authorizationStatus = Consent.AuthorizationStatus.DENIED; break; case "RESTRICTED": authorizationStatus = Consent.AuthorizationStatus.RESTRICTED; break; case "AUTHORIZED": authorizationStatus = Consent.AuthorizationStatus.AUTHORIZED; break; } return authorizationStatus; } public Consent.HasConsent hasConsentForVendor(string bundle) { var hasConsent = Consent.HasConsent.UNKNOWN; switch (ConsentObjBridge.getStatus()) { case "UNKNOWN": hasConsent = Consent.HasConsent.UNKNOWN; break; case "TRUE": hasConsent = Consent.HasConsent.TRUE; break; case "FALSE": hasConsent = Consent.HasConsent.FALSE; break; } return hasConsent; } public string getIabConsentString() { return ConsentObjBridge.getIabConsentString(); } } [SuppressMessage("ReSharper", "InconsistentNaming")] public static class Helper { public static IEnumerable getEnumerable(IEnumerable enumerable) { return enumerable as int[] ?? enumerable.ToArray(); } } #endif }