如何在Ionic 6/Capacitor中使用不同的AdMob方法?

3
我有一个组件,我想显示一个BannerAd。我在我的ionic应用程序中使用了以下库。

https://github.com/capacitor-community/admob

要显示广告,我必须使用margin,因为广告会重叠在选项卡栏上。我已经阅读了文档。

Margin Banner. 默认值为0px; 如果位置是BOTTOM_CENTER,则margin-bottom为margin。如果位置是TOP_CENTER,则margin-top为margin。

我有两种方法来在我的应用中显示广告。BannerAd方法仅适用于没有ion-tab-bar的页面。另一个方法适用于包含ion-tab-bar的页面。这是我的代码:

admob.service.ts

    import { Injectable } from '@angular/core';
    import { Platform } from '@ionic/angular';
    import { AdMob, BannerAdOptions, BannerAdSize, BannerAdPosition } from '@capacitor-community/admob';
    
    @Injectable({
        providedIn: 'root'
    })
    export class AdMobService {
    
        constructor(private platform: Platform) { }
    
        async bannerAd(admobId: string) {
            const options: BannerAdOptions = {
                adId: admobId,
                adSize: BannerAdSize.FULL_BANNER,
                position: BannerAdPosition.BOTTOM_CENTER,
                margin: 0,
                isTesting: true,
                npa: true
            };
    
            await this.platform.ready();
    
            await AdMob.initialize({
                requestTrackingAuthorization: true,         
                initializeForTesting: true,
            }).catch(err => console.error('Could not init Admob', err));
    
            await AdMob.showBanner(options).catch(err => console.error('Could not init Admob banner', err));
        }
    
        async bannerAdTab(admobId: string) {
            const options: BannerAdOptions = {
                adId: admobId,
                adSize: BannerAdSize.FULL_BANNER,
                position: BannerAdPosition.BOTTOM_CENTER,
                margin: 50,
                isTesting: true,
                npa: true
            };
    
            await this.platform.ready();
    
            await AdMob.initialize({
                requestTrackingAuthorization: true,      
                initializeForTesting: true,
            }).catch(err => console.error('Could not init Admob', err));
    
            await AdMob.showBanner(options).catch(err => console.error('Could not init Admob banner', err));
        }
    }

我在我的页面中使用类似这样的方法:

home.page.ts

import { Component, OnInit, ViewChild } from '@angular/core';
import { IonContent } from '@ionic/angular';
import { AdMobService } from 'src/app/services/admob.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.page.html',
  styleUrls: ['./home.page.scss'],
})
export class HomePage implements OnInit {

  constructor(private admob: AdMobService) { }

  ngOnInit() {
    this.admob.bannerAd("admobid");
  }
 
}

而在像这样的选项卡页面中:

tab.page.ts

import { Component, OnInit } from '@angular/core';
import { AdMobService } from 'src/app/services/admob.service';

@Component({
  selector: 'app-tab',
  templateUrl: './tab.page.html',
  styleUrls: ['./tab.page.scss'],
})
export class TabPage implements OnInit {

  constructor(private admob: AdMobService) { }

  ngOnInit() {
    this.admob.bannerAdTab("AdmobId");
  }
}

bannerAd 方法很好用,但当我导航到选项卡页面时,它不适用于margin

我如何在我的页面中使用不同的 admob 方法?

第二个问题:

我是在组件中还是在调用该组件的页面中使用 admob 服务?

1个回答

1

您需要为横幅广告尺寸更改添加事件监听器,然后将您的边距添加到ion-router-outlet中。

可以尝试以下代码:

import { Injectable } from '@angular/core';
    import { Platform } from '@ionic/angular';
    import { AdMob, BannerAdOptions, BannerAdSize, BannerAdPosition, BannerAdPluginEvents } from '@capacitor-community/admob';
    
    @Injectable({
        providedIn: 'root'
    })
    export class AdMobService {
        
        private appMargin:number = 0;

        constructor(private platform: Platform) {
            this.init();
        }
        
        async init() {

           await this.platform.ready();

           await AdMob.initialize({
                requestTrackingAuthorization: true,         
                initializeForTesting: true,
           }).catch(err => console.error('Could not init Admob', err));

           this.eventOnAdSize = AdMob.addListener(BannerAdPluginEvents.SizeChanged, (info: any) => {
            // Subscribe Change Banner Size
            this.appMargin = parseInt(info.height, 10);
            if (this.appMargin > 0) {
                const app: HTMLElement = document.querySelector('ion-router-outlet');
                app.style.marginBottom = this.appMargin + 'px';
            }
        });
        }

        async bannerAd(admobId: string) {
            const options: BannerAdOptions = {
                adId: admobId,
                adSize: BannerAdSize.FULL_BANNER,
                position: BannerAdPosition.BOTTOM_CENTER,
                margin: 0,
                isTesting: true,
                npa: true
            };
       
            await AdMob.showBanner(options).catch(err => console.error('Could not init Admob banner', err));
        }
    
        async bannerAdTab(admobId: string) {
            const options: BannerAdOptions = {
                adId: admobId,
                adSize: BannerAdSize.FULL_BANNER,
                position: BannerAdPosition.BOTTOM_CENTER,
                margin: 50,
                isTesting: true,
                npa: true
            };
        
            await AdMob.showBanner(options).catch(err => console.error('Could not init Admob banner', err));
        }
    }

你好!谢谢您抽出时间。我已经使用您的解决方案,现在我看到广告位在 ion-tab-bar 下面。是否可能相反(在选项卡栏上面放置广告)?我在 eventOnAdSize 遇到了一个错误,并声明了一个变量:eventOnAdSize: any。 - Fearcoder
不,我不相信可以让广告出现在选项卡栏上方。至少从我阅读和尝试的一切来看,都是不可能的。 - zeropsi
好的!我遇到了一个“eventOnAdsize”错误,所以我创建了一个通用变量“eventOnAdSize: any”。你在哪里使用它? - Fearcoder
除非您想随时删除侦听器,否则实际上不需要在任何地方使用它。 - zeropsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接