Vungle / Windows-SDK

Other
21 stars 8 forks source link

Vungle AdBanner not displaying when using LoadAndPlayBannerAd in Xamarin Custom Renderer. #29

Closed albertoha94 closed 3 years ago

albertoha94 commented 3 years ago

Greetings, I am currently implementing VungleSDK 6.8.0 for the UWP portion of my Xamarin.Forms app. When trying to add a banner like is shown in the Step 3, the ads were unable to show in my custom renderer.

Code that DOESN'T show adBanner:

[assembly: ExportRenderer(typeof(AdControlCR), typeof(AdControlRendererUWP))]
namespace Fighter_MoveList.UWP.CustomRenderers
{

    class AdControlRendererUWP : ViewRenderer<AdControlCR, VungleAdControl>
    {

        #region Constants.

        const string vungleAppId = "myVungleAppId";

        #endregion

        #region Variables.

        VungleAdControl adControl;
        string placementId;
        bool isAdCreated;

        #endregion

        public AdControlRendererUWP()
        {

            #region VungleAds.

            VungleAd sdkInstance;
            sdkInstance = AdFactory.GetInstance(vungleAppId);
            sdkInstance.OnInitCompleted += SdkInstance_OnInitCompleted;
            sdkInstance.Diagnostic += SdkInstance_Diagnostic;

            #endregion

        }

        #region Custom Renderer Events.

        protected override void OnElementChanged(ElementChangedEventArgs<AdControlCR> e)
        {
            base.OnElementChanged(e);
            if (Control == null && e.NewElement != null && !string.IsNullOrEmpty(e.NewElement.AdUnit))
            {
                CreateNativeAdControl();
                SetNativeControl(adControl);
            }
        }

        #endregion

        private void CreateNativeAdControl()
        {
            if (adControl != null)
                return;

            placementId = Element.AdUnit;

            adControl = new VungleAdControl
            {
                AppID = vungleAppId,
                Placement = placementId,
                Width = BannerWidth
            };

            isAdCreated = true;
        }

        #region Vungle Events.

        private void SdkInstance_Diagnostic(object sender, DiagnosticLogEvent e)
        {
#if DEBUG
            System.Diagnostics.Debug.WriteLine("Vungle/Diagnostic - " + e.Level + " " + e.Type + " " + e.Exception + " " + e.Message);
#endif
        }

        private async void SdkInstance_OnInitCompleted(object sender, ConfigEventArgs e)
        {

            if (!isAdCreated) return;

            await adControl.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => adControl.LoadAndPlayBannerAd(placementId, BannerSize));
        }

        #endregion

        private bool IsDesktop => AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop";

        private VungleBannerSizes BannerSize => IsDesktop ? VungleBannerSizes.BannerLeaderboard_728x90 : VungleBannerSizes.Banner_320x50;

        private double BannerWidth => IsDesktop ? 728 : 320;

    }
}

The main thing to get from this code is that the event SdkInstance_OnInitCompleted calls LoadAndPlayBannerAd but nothing happens, no ad is displated.

However I did get them working by making separate calls like is written in the Integrate Vungle SDK for Windows documentation:

[assembly: ExportRenderer(typeof(AdControlCR), typeof(AdControlRendererUWP))]
namespace Fighter_MoveList.UWP.CustomRenderers
{

    class AdControlRendererUWP : ViewRenderer<AdControlCR, VungleAdControl>
    {

        #region Constants.

        const string vungleAppId = "myVungleAppId";

        #endregion

        #region Variables.

        VungleAdControl adControl;
        string placementId;
        bool isAdCreated;

        #endregion

        public AdControlRendererUWP()
        {

            #region VungleAds.

            VungleAd sdkInstance;
            sdkInstance = AdFactory.GetInstance(vungleAppId);
            sdkInstance.OnInitCompleted += SdkInstance_OnInitCompleted;
            sdkInstance.Diagnostic += SdkInstance_Diagnostic;
            sdkInstance.OnAdPlayableChanged += SdkInstance_OnAdPlayableChanged;

            #endregion

        }

        #region Custom Renderer Events.

        protected override void OnElementChanged(ElementChangedEventArgs<AdControlCR> e)
        {
            base.OnElementChanged(e);
            if (Control == null && e.NewElement != null && !string.IsNullOrEmpty(e.NewElement.AdUnit))
            {
                CreateNativeAdControl();
                SetNativeControl(adControl);
            }
        }

        #endregion

        private void CreateNativeAdControl()
        {
            if (adControl != null)
                return;

            placementId = Element.AdUnit;

            adControl = new VungleAdControl
            {
                AppID = vungleAppId,
                Placement = placementId,
                Width = BannerWidth
            };

            isAdCreated = true;
        }

        #region Vungle Events.

        private void SdkInstance_Diagnostic(object sender, DiagnosticLogEvent e)
        {
#if DEBUG
            System.Diagnostics.Debug.WriteLine("Vungle/Diagnostic - " + e.Level + " " + e.Type + " " + e.Exception + " " + e.Message);
#endif
        }

        private async void SdkInstance_OnInitCompleted(object sender, ConfigEventArgs e)
        {

            if (!isAdCreated) return;

            await adControl.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => adControl.LoadBannerAd(placementId, BannerSize));
        }

        private async void SdkInstance_OnAdPlayableChanged(object sender, AdPlayableEventArgs e)
        {
            if (e.AdPlayable && e.Placement == placementId)
            {
                await adControl.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => adControl.PlayBannerAd(placementId, BannerSize));
            }
        }

        #endregion

        private bool IsDesktop => AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop";

        private VungleBannerSizes BannerSize => IsDesktop ? VungleBannerSizes.BannerLeaderboard_728x90 : VungleBannerSizes.Banner_320x50;

        private double BannerWidth => IsDesktop ? 728 : 320;

    }
}

Notice that in SdkInstance_OnInitCompleted I only call LoadBannerAd and then play it when the event SdkInstance_OnAdPlayableChanged is called.

Madhu-Kumaraswamy commented 3 years ago

Hi albertoha94 ,

Thank you for your question and sorry for your integration challenges. For issue investigation, can you please get in touch with tech support team via form - https://support.vungle.com/hc/en-us/requests/new. Looking forward to hearing from you.