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