经过一番研究,我得出了这个结论。
Google 允许仅针对一个特定用例在 WebView 中显示广告,当您有一个包含 Adsense 广告的网站并且您只想在 WebView 控件中的应用程序中显示该网站时。
来源:https://developers.google.com/ad-manager/mobile-ads-sdk/android/webview
对于该特定情况,您将注册您的 webview。
安装 Nuget 包:
Xamarin.GooglePlayServices.Ads.Lite 和MainPage.xaml.cs 里面放:
#if ANDROID
using Android.Gms.Ads;
#endif
using Microsoft.AspNetCore.Components.WebView;
using Microsoft.AspNetCore.Components.WebView.Maui;
namespace SatisFIT.Client.App;
public partial class MainPage : ContentPage {
public MainPage() {
InitializeComponent();
blazorWebView.BlazorWebViewInitialized += BlazorWebViewOnBlazorWebViewInitialized;
}
private void BlazorWebViewOnBlazorWebViewInitialized(object? sender, BlazorWebViewInitializedEventArgs e) {
#if ANDROID
MobileAds.RegisterWebView(e.WebView);
#endif
}
之后你把谷歌文档中提到的meta-data标签放到AndroidManifest.xml<application>标签,比如:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">
<!-- Bypass APPLICATION_ID check for WebView API for Ads -->
<meta-data
android:name="com.google.android.gms.ads.INTEGRATION_MANAGER"
android:value="webview"/>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
但正如我已经提到的,我们不能仅将它用于嵌入 adsense 广告的 HTML 并将其包装到简单的组件中。
有潜在的解决方法。但如果谷歌发现,他们可能会禁用您的广告帐户。解决方法是创建您的自定义 WebView 控件,然后在方法 BlazorWebViewOnBlazorWebViewInitialized 中使用 e.WebView.SetWebViewClient(new CustomWebViewClient()); 注册该控件并在那里实现请求拦截。因此,当 adsense JS 想要调用 https://googleads.g.doubleclick.net 时,您会拦截此请求,然后在其内部获取参数,您将本地 url: 0.0.0.0 替换为您网站的 url,您在哪里允许 adsense 并且理论上您会收到响应广告。
可能没有其他方法可以在 Blazor Hybrid 中将广告包装到 Blazor 组件中,因为您无法将 XAML 嵌入到 Blazor 中,这就是为什么在 MAUI Blazor 应用程序中显示谷歌广告的唯一方法是使用 admob 库:Plugin.MauiMTAdmob
有了这个,我们可以创建 XAML 广告,我们可以将它放在我们的 BlazorWebView 组件上,这样它就会与它的一部分重叠。