Admob Родной Продвинутый Не Кликабельный

Я создал собственный класс представления, который наследуется от класса GADNativeContentAdView. Когда я получаю объявление и вызываю делегата, я заполняю свой пользовательский вид данными, как показано ниже.

Все выглядит хорошо, но проблема в том, что на него вообще нельзя нажать. Я попытался установить для взаимодействия пользователя actionbutton значение false, но все равно не сработало. Я также попытался зарегистрироваться, используя следующее:

- (void) registerAdView: (UIView *) adView clickableAssetViews: (NSDictionary *) clickableAssetViews nonclickableAssetViews: (NSDictionary *) nonclickableAssetViews;

Есть идеи, как заставить его работать?

- (void)setNativeContent:(GADNativeContentAd *)nativeContent
{
    self.nativeContentAd = nativeContent;
    headlineLabel.text = nativeContent.headline;
    bodyLabel.text = nativeContent.body;
    advertiserImage.image = ((GADNativeAdImage *)nativeContent.images.firstObject).image;
    [actionButton setTitle:nativeContent.callToAction forState:UIControlStateNormal];
    if (nativeContent.logo && nativeContent.logo.image)
    {
        advertiserLogo.image = nativeContent.logo.image;
    }
    else
    {
        advertiserLogo.image = advertiserImage.image;
    }
    NSDictionary *clickableArea = @{GADNativeContentHeadlineAsset:headlineLabel, GADNativeContentImageAsset:advertiserImage, GADNativeContentCallToActionAsset:actionButton};

    NSDictionary *nonClickableArea = @{GADNativeContentBodyAsset:bodyLabel};

    [nativeContent registerAdView:self clickableAssetViews:clickableArea nonclickableAssetViews:nonClickableArea];
}

5 ответов

Я наконец-то нашел способ сделать всю нативную рекламу кликабельной без использования.xib. Я вложил в класс GADNativeContentAdView и создал представление tappableOverlay, которое я назначил неиспользуемому представлению ресурса в его суперклассе. В данном случае это был callToActionView. Затем я использовал не так задокументированный метод GADNativeContentAd.registerAdView():

- (void)registerAdView:(UIView *)adView
   clickableAssetViews:(NSDictionary<GADNativeContentAdAssetID, UIView *> *)clickableAssetViews
   nonclickableAssetViews: (NSDictionary<GADNativeContentAdAssetID, UIView *> *)nonclickableAssetViews;

Вот пример Swift 4:

class NativeContentAdView: GADNativeContentAdView  {
    var nativeAdAssets: NativeAdAssets?

    private let myImageView: UIImageView = {
        let myImageView = UIImageView()
        myImageView.translatesAutoresizingMaskIntoConstraints = false
        myImageView.contentMode = .scaleAspectFill
        myImageView.clipsToBounds = true
        return myImageView
    }()

    private let myHeadlineView: UILabel = {
        let myHeadlineView = UILabel()
        myHeadlineView.translatesAutoresizingMaskIntoConstraints = false
        myHeadlineView.numberOfLines = 0
        myHeadlineView.textColor = .black
        return myHeadlineView
    }()

    private let tappableOverlay: UIView = {
        let tappableOverlay = UIView()
        tappableOverlay.translatesAutoresizingMaskIntoConstraints = false
        tappableOverlay.isUserInteractionEnabled = true
        return tappableOverlay
    }()

    private let adAttribution: UILabel = {
        let adAttribution = UILabel()
        adAttribution.translatesAutoresizingMaskIntoConstraints = false
        adAttribution.text = "Ad"
        adAttribution.textColor = .white
        adAttribution.textAlignment = .center
        adAttribution.backgroundColor = UIColor(red: 1, green: 0.8, blue: 0.4, alpha: 1)
        adAttribution.font = UIFont.systemFont(ofSize: 11, weight: UIFont.Weight.semibold)
        return adAttribution
    }()

    override var nativeContentAd: GADNativeContentAd? {
        didSet {
            if let nativeContentAd = nativeContentAd, let callToActionView = callToActionView {
                nativeContentAd.register(self,
                                         clickableAssetViews: [GADNativeContentAdAssetID.callToActionAsset: callToActionView],
                                         nonclickableAssetViews: [:])
            }
        }
    }

    init() {
        super.init(frame: CGRect.zero)

        translatesAutoresizingMaskIntoConstraints = false
        backgroundColor = .white
        isUserInteractionEnabled = true
        callToActionView = tappableOverlay
        headlineView = myHeadlineView
        imageView = myImageView
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        addSubview(myHeadlineView)
        addSubview(myImageView)
        addSubview(adAttribution)
        addSubview(tappableOverlay)
    }

//    override func updateConstraints() {
//          ....
//    }
}

Просто не забудьте закрепить tappableOverlay к его краям суперпредставления, чтобы они были одинакового размера... в updateConstraints(),

Только издатели из белого списка AdMob могут использовать registerAdView API:)

Все издатели могут использовать xib для создания представления рекламы.

Внутри метода просто вы можете создавать и размещать рекламу в иерархии представления.

 GADNativeContentAdView *contentAdView = [[NSBundle mainBundle] loadNibNamed:@"NativeAdView" owner:nil options:nil].firstObject;

После назначения свойств свяжите вид контента с рекламным объектом. Это необходимо, чтобы сделать объявление кликабельным.

contentAdView.nativeContentAd = nativeContentAd;

В моем случае это было вызвано тем, что я создал свои представления без xib. В этом случае просто установите для свойства mediaView значение GADNativeAdView.

вот минимальный рабочий код

      final class EndBannerController: UIViewController {
        
    private let adId: String
    private let adView = GADNativeAdView()
    private let mediaView = GADMediaView()
    
    private var adLoader: GADAdLoader?
    
    init(adId: String) {
        self.adId = adId
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) { return nil }

    override func viewDidLoad() {
        super.viewDidLoad()

        adView.frame = view.bounds
        view.addSubview(adView)
        
        mediaView.frame = view.bounds
        adView.mediaView = mediaView
        adView.addSubview(mediaView)
        
        let loader = GADAdLoader(
            adUnitID: adId,
            rootViewController: self,
            adTypes: [.native],
            options: nil
        )

        loader.delegate = self
        
        self.adLoader = loader
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.loadBannerAd()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        adView.frame = view.bounds
        mediaView.frame = view.bounds
    }
    
    private func loadBannerAd() {
        let request = GADRequest()
        request.scene = view.window?.windowScene
        self.adLoader?.load(request)
    }
}

Не забудьте связать пользовательские выходы GADUnifiedNativeAdView с вашими UILabels, UIButton и ImageView, чтобы GADUnifiedNativeAdView знал, с чем взаимодействовать. ht tps://stackru.com/images/99d3ea214d44613d1ee19193ccc1386322af6560.jpg

ht tps://stackru.com/images/a104d7bdf822ff27805bb407b8e2260b6fbc395b.jpg

Другие вопросы по тегам