#if UNITY_IOS //&& !UNITY_EDITOR using System; using System.Runtime.InteropServices; using Azerion.BlueStack.API; using Azerion.BlueStack.Internal; namespace Azerion.BlueStack.Platforms.iOS { public class NativeAdClient : INativeAdClient, IDisposable { private IntPtr _nativeAdPtr; private IntPtr _nativeAdClientPtr; #region NativeAd callback types internal delegate void BSUOnNativeAdDidLoadCallback(IntPtr nativeClient); internal delegate void BSUOnNativeAdDidFailedCallback(IntPtr nativeClient, IntPtr error); internal delegate void BSUOnNativeAdDidRecordImpressionCallback(IntPtr nativeClient); internal delegate void BSUOnNativeAdDidPerformClickCallback(IntPtr nativeClient); internal delegate void BSUOnNativeAdCloseCallback(IntPtr nativeClient); #endregion // This property should be used when setting the nativeViewPtr. private IntPtr NativeAdPtr { get => this._nativeAdPtr; set { Externs.BSURelease(this._nativeAdPtr); this._nativeAdPtr = value; } } #region Native callback methods [AOT.MonoPInvokeCallback(typeof(BSUOnNativeAdDidLoadCallback))] private static void OnNativeAdDidLoadCallback(IntPtr bannerClient) { NativeAdClient client = IntPtrToNativeAdClient(bannerClient); if (client.OnNativeAdDidLoad != null) { client.OnNativeAdDidLoad(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnNativeAdDidFailedCallback))] private static void OnNativeAdDidFailCallback(IntPtr nativeClient, IntPtr error) { NativeAdClient client = IntPtrToNativeAdClient(nativeClient); if (client.OnNativeAdDidFail != null) { client.OnNativeAdDidFail(client, BlueStackErrorUtils.CreateFromIntPtr(error)); } } [AOT.MonoPInvokeCallback(typeof(BSUOnNativeAdDidLoadCallback))] private static void OnNativeAdDidRecordImpressionCallback(IntPtr bannerClient) { NativeAdClient client = IntPtrToNativeAdClient(bannerClient); if (client.OnNativeAdImpression != null) { client.OnNativeAdImpression(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnNativeAdDidLoadCallback))] private static void OnNativeAdDidPerformClickCallback(IntPtr bannerClient) { NativeAdClient client = IntPtrToNativeAdClient(bannerClient); if (client.OnNativeAdClicked != null) { client.OnNativeAdClicked(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnNativeAdDidLoadCallback))] private static void OnNativeAdCloseCallback(IntPtr bannerClient) { NativeAdClient client = IntPtrToNativeAdClient(bannerClient); if (client.OnNativeAdClosed != null) { client.OnNativeAdClosed(client, EventArgs.Empty); } } private static NativeAdClient IntPtrToNativeAdClient(IntPtr nativeClient) { GCHandle handle = (GCHandle)nativeClient; return handle.Target as NativeAdClient; } #endregion public void Destroy() { this.DestroyNativeAd(); } // Destroys the banner ad. private void DestroyNativeAd() { Externs.BSUDestroyNativeAd(this.NativeAdPtr); this.NativeAdPtr = IntPtr.Zero; } public void Dispose() { this.DestroyNativeAd(); ((GCHandle)this._nativeAdClientPtr).Free(); } ~NativeAdClient() { this.Dispose(); } public event EventHandler OnNativeAdDidLoad; public event EventHandler OnNativeAdDidFail; public event EventHandler OnNativeAdImpression; public event EventHandler OnNativeAdClicked; public event EventHandler OnNativeAdOpening; public event EventHandler OnNativeAdClosed; public void Create(string placementId) { this._nativeAdClientPtr = (IntPtr)GCHandle.Alloc(this); this.NativeAdPtr = Externs.BSUCreateNativeAd( this._nativeAdClientPtr, placementId); Externs.BSUSetNativeAdCallbacks( this.NativeAdPtr, OnNativeAdDidLoadCallback, OnNativeAdDidFailCallback, OnNativeAdDidRecordImpressionCallback, OnNativeAdDidPerformClickCallback, OnNativeAdCloseCallback ); } public void Load() { Externs.BSULoadNativeAd(this.NativeAdPtr); } public void Load(IPreferenceClient iPreferenceClient) { PreferenceClient preferenceClient = (PreferenceClient)iPreferenceClient; Externs.BSULoadNativeAdWithRequestOptions(this.NativeAdPtr, preferenceClient.GetPreferenceClientPtr()); } public string GetTitle() { return Externs.BSUNativeAdGetTitle(this.NativeAdPtr); } public string GetBodyText() { return Externs.BSUNativeAdGetBodyText(this.NativeAdPtr); } public string GetCallToActionText() { return Externs.BSUNativeAdGetCTAText(this.NativeAdPtr); } public byte[] GetBadgeBytes() { return Array.Empty(); } public string GetBadge() { return Externs.BSUNativeAdGetBadge(this.NativeAdPtr); } public string GetCoverImageUrl() { return Externs.BSUNativeAdGetCoverImageUrl(this.NativeAdPtr); } public string GetIconUrl() { return Externs.BSUNativeAdGetIconUrl(this.NativeAdPtr); } public string GetClickUrl() { return Externs.BSUNativeAdGetClickUrl(this.NativeAdPtr); } public void RecordImpression() { Externs.BSURecordImpression(this.NativeAdPtr); } public void PerformClick() { Externs.BSUPerformClick(this.NativeAdPtr); } } } #endif