Xamarin iOS AdMob NativeAd AdLoader Delegate никогда не вызывается
Я пытаюсь реализовать средство визуализации iOS для представления XF для отображения нативной рекламы. Кажется, я не могу загрузить собственное объявление. С помощью:
try
{
loader.Delegate = new MyAdLoaderDelegate(renderer);
loader.LoadRequest(request);
}catch(Exception e)
{
Debug.WriteLine(e.Message);
}
Debug.WriteLine("Loading: " + loader.IsLoading);
Делегат настраивается правильно, и после loader.LoadRequest()
позвонить в loader.IsLoading==true
, но методы на MyAdLoaderDelegate
никогда не называются. При вызове кLoadRequest()
или.
Вот мой класс делегата:
private class MyAdLoaderDelegate : NSObject, IUnifiedNativeAdLoaderDelegate
{
private readonly AdMobUnifiedNativeAdRenderer _renderer;
public MyAdLoaderDelegate(AdMobUnifiedNativeAdRenderer renderer)
{
_renderer = renderer;
}
public void DidReceiveUnifiedNativeAd(AdLoader adLoader, UnifiedNativeAd nativeAd)
{
Debug.WriteLine("DidReceiveUnifiedNativeAd");
}
public void DidFailToReceiveAd(AdLoader adLoader, RequestError error)
{
Debug.WriteLine("DidFailToReceiveAd");
//base.DidFailToReceiveAd(adLoader, error);
}
public void DidFinishLoading(AdLoader adLoader)
{
Debug.WriteLine("DidFinishLoading");
//base.DidFinishLoading(adLoader);
}
}
Любопытно, что класс делегата не будет работать при наследовании от UnifiedNativeAdLoaderDelegate
, делегат загрузчика всегда был пустым. Однако реализация интерфейса работает, но никакие методы не используются.
Не уверен, куда идти дальше.
Спасибо!
РЕДАКТИРОВАТЬ:
[assembly: ExportRenderer(typeof(AdMobUnifiedNativeAd), typeof(AdMobUnifiedNativeAdRenderer))]
namespace XXXX.Mobile.iOS.CustomRenderers.NativeAds
{
public class AdMobUnifiedNativeAdRenderer : ViewRenderer<AdMobUnifiedNativeAd,UnifiedNativeAdView>
{
protected override void OnElementChanged(ElementChangedEventArgs<AdMobUnifiedNativeAd> e)
{
base.OnElementChanged(e);
if (Control == null)
{
CreateAdView(this);
}
}
private void CreateAdView(AdMobUnifiedNativeAdRenderer renderer)
{
if (Element == null) return;
var loader = new AdLoader(
Element.AdUnitId,
GetVisibleViewController(),
new AdLoaderAdType[] { AdLoaderAdType.UnifiedNative },
new AdLoaderOptions[] {
new NativeAdViewAdOptions {PreferredAdChoicesPosition = AdChoicesPosition.TopRightCorner}
});
var request = Request.GetDefaultRequest();
request.TestDevices = new string[] { Request.SimulatorId };
UnifiedNativeAdView adView = null;
try
{
adView = MyUnifiedAdView.Create();
SetNativeControl(adView);
}
catch(Exception e)
{
Debug.WriteLine(e.Message);
}
if (adView == null) return;
try
{
loader.Delegate = new MyAdLoaderDelegate(renderer);
loader.LoadRequest(request);
}catch(Exception e)
{
Debug.WriteLine(e.Message);
}
Debug.WriteLine("Loading: " + loader.IsLoading);
}
private UIViewController GetVisibleViewController()
{
var windows = UIApplication.SharedApplication.Windows;
foreach (var window in windows)
{
if (window.RootViewController != null)
{
return window.RootViewController;
}
}
return null;
}
}
}
1 ответ
Я столкнулся с идентичной проблемой. Решение было довольно простым.
LoadRequest необходимо вызывать в основном потоке! Это решило проблему.
Device.BeginInvokeOnMainThread(() => {
loader.LoadRequest(Request.GetDefaultRequest());
});