1. Введение
Что вы построите
В этом практическом руководстве вы узнаете, как добавить баннер, межстраничную рекламу и рекламу с вознаграждением в приложение Awesome Drawing Quiz , игру, в которой игроки должны угадать название рисунка.
|
|
Если во время выполнения этого практического задания вы столкнетесь с какими-либо проблемами (ошибками в коде, грамматическими неточностями, неясными формулировками), пожалуйста, сообщите о них, нажав на ссылку «Сообщить об ошибке» в левом нижнем углу задания.
Что вы узнаете
- Как настроить плагин Google Mobile Ads AdMob
- Как реализовать баннерную, межстраничную и рекламную рекламу с вознаграждением в приложении Flutter
Что вам понадобится
- Android Studio 4.1 или более поздняя версия
- Xcode 12 или более поздней версии (для разработки под iOS)
Как бы вы оценили свой уровень опыта работы с AdMob?
Как бы вы оценили свой уровень опыта работы с Flutter?
2. Настройте среду разработки Flutter.
Для выполнения этой лабораторной работы вам понадобятся два программных компонента: Flutter SDK и редактор .
Вы можете выполнить это практическое задание, используя любое из следующих устройств:
- Физическое устройство Android или iOS , подключенное к компьютеру и настроенное на режим разработчика.
- Симулятор iOS (требуется установка инструментов Xcode).
- Эмулятор Android (требуется настройка в Android Studio).
- Для работы требуется браузер (для отладки необходим Chrome).
- Если вы разрабатываете настольное приложение для Windows , Linux или macOS , вам необходимо работать на той платформе, на которой вы планируете его развернуть. Таким образом, если вы хотите разработать настольное приложение для Windows, вам необходимо использовать Windows для доступа к соответствующей цепочке сборки. Существуют специфические требования к операционной системе, которые подробно описаны в документации docs.flutter.dev/desktop .
Скачать код
После загрузки ZIP-файла распакуйте его содержимое. У вас появится папка с именем admob-ads-in-flutter-master .
В качестве альтернативы вы можете клонировать репозиторий GitHub из командной строки:
$ git clone https://github.com/googlecodelabs/admob-ads-in-flutter
В репозитории находятся две папки:
Стартовый код — это начальный код, который вы будете создавать в этом практическом занятии.
завершено — Код для данной практической работы завершен.
3. Настройте приложение AdMob и рекламные блоки.
Поскольку Flutter — это многоплатформенный SDK, вам необходимо добавить приложение и рекламные блоки как для Android, так и для iOS в AdMob.
Настройка для Android
Для настройки под Android необходимо добавить приложение Android и создать рекламные блоки.
Добавить приложение для Android
- В консоли AdMob нажмите кнопку «ДОБАВИТЬ ПРИЛОЖЕНИЕ» в меню «Приложения» .
- Когда вас спросят: «Вы опубликовали свое приложение в Google Play или App Store?» , нажмите «НЕТ» .
- Введите
Awesome Drawing Quizв поле названия приложения и выберите Android в качестве платформы.

- Включение пользовательских метрик не является обязательным для выполнения этого практического задания. Однако мы рекомендуем это сделать, поскольку это позволит вам более детально понять поведение пользователей. Нажмите ДОБАВИТЬ , чтобы завершить процесс.

Создавайте рекламные блоки
Чтобы начать добавлять рекламные блоки в AdMob:
- Выберите «Awesome Drawing Quiz» в меню «Приложения» в консоли AdMob .
- Нажмите на меню «Рекламные блоки» .
Баннер
|
|
Интерстициальный
|
|
Награжден
|
|
Обычно для показа нового рекламного блока требуется несколько часов.
Если вы хотите немедленно проверить работу рекламы, используйте идентификаторы тестового приложения и рекламного блока, указанные в таблицах идентификаторов приложений/рекламных блоков для Android и iOS.
Настройка для iOS
Для настройки под iOS необходимо добавить iOS-приложение и создать рекламные блоки.
Добавить приложение для iOS
- В консоли AdMob нажмите кнопку «ДОБАВИТЬ ПРИЛОЖЕНИЕ» в меню «Приложения» .
- Когда вас спросят: «Вы опубликовали свое приложение в Google Play или App Store?» , нажмите «НЕТ» .
- Введите
Awesome Drawing Quizв поле названия приложения и выберите iOS в качестве платформы.

- Включение пользовательских метрик не является обязательным для выполнения этого практического задания. Однако мы рекомендуем это сделать, поскольку это позволит вам более детально понять поведение пользователей. Нажмите ДОБАВИТЬ , чтобы завершить процесс.

Создавайте рекламные блоки
Чтобы добавить рекламные блоки:
- Выберите приложение Awesome Drawing Quiz в меню «Приложения» в консоли AdMob .
- Нажмите на меню «Рекламные блоки» .
Баннер
|
|
Интерстициальный
|
|
Награжден
|
|
Обычно для показа нового рекламного блока требуется несколько часов.
Если вы хотите немедленно проверить работу рекламы, используйте идентификаторы тестового приложения и рекламного блока, указанные в следующей таблице.
Дополнительно: воспользуйтесь тестовым приложением AdMob и рекламными блоками.
Если вы хотите следовать инструкциям из практического руководства, вместо того чтобы создавать новое приложение и рекламные блоки самостоятельно, вы можете использовать идентификаторы тестового приложения AdMob и идентификаторы рекламных блоков, указанные в следующих таблицах.
Идентификатор приложения Android/идентификатор рекламного блока
Элемент | Идентификатор приложения/идентификатор рекламного блока |
Идентификатор приложения AdMob | |
Баннер | |
Интерстициальный | |
Награжден | |
Идентификатор приложения iOS/идентификатор рекламного блока
Элемент | Идентификатор приложения/идентификатор рекламного блока |
Идентификатор приложения AdMob | |
Баннер | |
Интерстициальный | |
Награжден | |
Для получения дополнительной информации о тестовой рекламе см. документацию для разработчиков по тестовой рекламе для Android и тестовой рекламе для iOS .
4. Добавьте плагин Google Mobile Ads Flutter.
Flutter использует плагины для обеспечения доступа к широкому спектру сервисов, специфичных для каждой платформы. Плагины позволяют получать доступ к сервисам и API на каждой платформе.
Плагин google_mobile_ads поддерживает загрузку и отображение баннерной, межстраничной, рекламной и нативной рекламы с использованием API AdMob.
Поскольку Flutter — это многоплатформенный SDK, плагин google_mobile_ads применим как для iOS, так и для Android. Таким образом, если вы добавите плагин в свое приложение Flutter, он будет использоваться как версиями приложения AdMob для встроенной рекламы на Android, так и на iOS.
Добавьте плагин Google Mobile Ads в качестве зависимости.
Для доступа к API AdMob из проекта встроенной рекламы AdMob добавьте зависимость google_mobile_ads в файл pubspec.yaml , расположенный в корне проекта.
pubspec.yaml
...
environment:
# TODO: Update the minimum sdk version to 2.12.0 to support null safety.
sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
google_fonts: ^3.0.1
# TODO: Add google_mobile_ads as a dependency
google_mobile_ads: ^1.2.0
...
Нажмите «Опубликовать», чтобы установить плагин в проекте Awesome Drawing Quiz .

Обновите файл AndroidManifest.xml (Android)
- Откройте файл
android/app/src/main/AndroidManifest.xmlв Android Studio. - Добавьте идентификатор вашего приложения AdMob, добавив тег
<meta-data>с именемcom.google.android.gms.ads.APPLICATION_ID. Например, если идентификатор вашего приложения AdMob —ca-app-pub-3940256099942544~3347511713, то вам необходимо добавить следующие строки в файлAndroidManifest.xml.
AndroidManifest.xml
<manifest>
...
<application>
...
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/>
</application>
</manifest>
Обновить файл Info.plist (iOS)
- Откройте файл
ios/Runner/Info.plistв Android Studio. - Добавьте ключ
GADApplicationIdentifierсо строковым значением идентификатора вашего приложения AdMob. Например, если идентификатор вашего приложения AdMob —ca-app-pub-3940256099942544~1458002511, то вам необходимо добавить следующие строки в файлInfo.plist.
ios/Runner/Info.plist
...
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string>
...
5. Добавьте вспомогательный класс для рекламы.
Создайте новый файл с именем ad_helper.dart в каталоге lib . Затем реализуйте класс AdHelper , который предоставляет идентификатор приложения AdMob и идентификаторы рекламных блоков для Android и iOS.
Убедитесь, что вы заменили идентификатор приложения AdMob ( ca-app-pub-xxxxxx~yyyyy ) и идентификатор рекламного блока ( ca-app-pub-xxxxxxx/yyyyyyyy ) на идентификаторы, созданные вами на предыдущем шаге.
lib/ad_helper.dart
import 'dart:io';
class AdHelper {
static String get bannerAdUnitId {
if (Platform.isAndroid) {
return '<YOUR_ANDROID_BANNER_AD_UNIT_ID>';
} else if (Platform.isIOS) {
return '<YOUR_IOS_BANNER_AD_UNIT_ID>';
} else {
throw UnsupportedError('Unsupported platform');
}
}
static String get interstitialAdUnitId {
if (Platform.isAndroid) {
return '<YOUR_ANDROID_INTERSTITIAL_AD_UNIT_ID>';
} else if (Platform.isIOS) {
return '<YOUR_IOS_INTERSTITIAL_AD_UNIT_ID>';
} else {
throw UnsupportedError('Unsupported platform');
}
}
static String get rewardedAdUnitId {
if (Platform.isAndroid) {
return '<YOUR_ANDROID_REWARDED_AD_UNIT_ID>';
} else if (Platform.isIOS) {
return '<YOUR_IOS_REWARDED_AD_UNIT_ID>';
} else {
throw UnsupportedError('Unsupported platform');
}
}
}
Используйте следующий фрагмент кода, если хотите использовать идентификатор тестового приложения AdMob и идентификаторы тестовых рекламных блоков.
lib/ad_helper.dart
import 'dart:io';
class AdHelper {
static String get bannerAdUnitId {
if (Platform.isAndroid) {
return 'ca-app-pub-3940256099942544/6300978111';
} else if (Platform.isIOS) {
return 'ca-app-pub-3940256099942544/2934735716';
} else {
throw new UnsupportedError('Unsupported platform');
}
}
static String get interstitialAdUnitId {
if (Platform.isAndroid) {
return "ca-app-pub-3940256099942544/1033173712";
} else if (Platform.isIOS) {
return "ca-app-pub-3940256099942544/4411468910";
} else {
throw new UnsupportedError("Unsupported platform");
}
}
static String get rewardedAdUnitId {
if (Platform.isAndroid) {
return "ca-app-pub-3940256099942544/5224354917";
} else if (Platform.isIOS) {
return "ca-app-pub-3940256099942544/1712485313";
} else {
throw new UnsupportedError("Unsupported platform");
}
}
}
6. Инициализируйте SDK Google Mobile Ads
Перед загрузкой рекламы необходимо инициализировать SDK Google Mobile Ads. Откройте файл lib/home_route.dart и измените функцию _initGoogleMobileAds() , чтобы инициализировать SDK до загрузки главной страницы.
Обратите внимание, что для получения результата инициализации SDK после её завершения необходимо изменить тип возвращаемого значения метода _initGoogleMobileAds() с Future<dynamic> на Future<InitializationStatus> .
home_route.dart
// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:flutter/material.dart';
...
class HomeRoute extends StatelessWidget {
...
Future<InitializationStatus> _initGoogleMobileAds() {
// TODO: Initialize Google Mobile Ads SDK
return MobileAds.instance.initialize();
}
}
7. Добавьте баннерную рекламу.
В этом разделе в верхней части игрового экрана отображается рекламный баннер, как показано на следующем скриншоте.

- Откройте файл
lib/game_route.dartи импортируйтеad_manager.dart - Импортируйте файлы
ad_helper.dartиgoogle_mobile_ads.dart, добавив следующие строки:
lib/game_route.dart
...
// TODO: Import ad_helper.dart
import 'package:awesome_drawing_quiz/ad_helper.dart';
// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';
class GameRoute extends StatefulWidget {
...
}
- В класс
_GameRouteStateдобавьте следующие члены для баннерной рекламы.
lib/game_route.dart
class _GameRouteState extends State<GameRoute> implements QuizEventListener {
...
// TODO: Add _bannerAd
BannerAd? _bannerAd;
...
}
- В методе
initState()создайте и загрузитеBannerAdразмером 320x50 пикселей (AdSize.banner). Обратите внимание, что для обновления пользовательского интерфейса (setState()) при загрузке рекламы настроен обработчик событий объявления.
lib/game_route.dart
@override
void initState() {
...
// TODO: Load a banner ad
BannerAd(
adUnitId: AdHelper.bannerAdUnitId,
request: AdRequest(),
size: AdSize.banner,
listener: BannerAdListener(
onAdLoaded: (ad) {
setState(() {
_bannerAd = ad as BannerAd;
});
},
onAdFailedToLoad: (ad, err) {
print('Failed to load a banner ad: ${err.message}');
ad.dispose();
},
),
).load();
}
- Измените метод
build()таким образом, чтобы при наличии баннерной рекламы отображалась соответствующая реклама.
lib/game_route.dart
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: SafeArea(
child: Stack(
children: [
Center(
...
),
// TODO: Display a banner when ready
if (_bannerAd != null)
Align(
alignment: Alignment.topCenter,
child: Container(
width: _bannerAd!.size.width.toDouble(),
height: _bannerAd!.size.height.toDouble(),
child: AdWidget(ad: _bannerAd!),
),
),
],
),
),
...
);
}
- Освободите ресурс, связанный с объектом
BannerAd, вызвав методBannerAd.dispose()в методе обратного вызоваdispose().
lib/game_route.dart
@override
void dispose() {
// TODO: Dispose a BannerAd object
_bannerAd?.dispose();
...
super.dispose();
}
Вот и всё! Запустите проект и начните новую игру. После загрузки рекламы вы увидите баннерную рекламу в верхней части экрана.

8. Добавьте межстраничную рекламу.
В этом разделе после завершения игры (всего 5 уровней) отображается промежуточная реклама.
- Откройте файл
lib/game_route.dart - В класс
_GameRouteStateдобавьте следующие члены и методы для межстраничной рекламы.
Обратите внимание, что обработчик событий рекламы настроен на проверку готовности рекламы ( onAdLoaded() и onAdFailedToLoad() ) и на отображение главного экрана приложения при закрытии рекламы ( onAdDismissedFullScreenContent() ).
lib/game_route.dart
class _GameRouteState extends State<GameRoute> implements QuizEventListener {
...
// TODO: Add _interstitialAd
InterstitialAd? _interstitialAd;
// TODO: Implement _loadInterstitialAd()
void _loadInterstitialAd() {
InterstitialAd.load(
adUnitId: AdHelper.interstitialAdUnitId,
request: AdRequest(),
adLoadCallback: InterstitialAdLoadCallback(
onAdLoaded: (ad) {
ad.fullScreenContentCallback = FullScreenContentCallback(
onAdDismissedFullScreenContent: (ad) {
_moveToHome();
},
);
setState(() {
_interstitialAd = ad;
});
},
onAdFailedToLoad: (err) {
print('Failed to load an interstitial ad: ${err.message}');
},
),
);
}
...
}
- В этом практическом задании после прохождения пользователем 5 уровней отображается промежуточная реклама. Чтобы свести к минимуму ненужные запросы рекламы, запросите показ рекламы, когда пользователь достигнет 3-го уровня.
В метод onNewLevel() добавьте следующие строки.
lib/game_route.dart
@override
void onNewLevel(int level, Drawing drawing, String clue) {
...
// TODO: Load an Interstitial Ad
if (level >= 3 && _interstitialAd == null) {
_loadInterstitialAd();
}
}
- Когда игра заканчивается, отображается диалоговое окно с результатами. При закрытии этого диалогового окна пользователь перенаправляется на главный экран викторины «Awesome Drawing Quiz» .
Поскольку межстраничная реклама должна отображаться между переходами между экранами, мы показываем ее, когда пользователь нажимает кнопку «ЗАКРЫТЬ» .
Измените метод onGameOver() следующим образом.
lib/game_route.dart
@override
void onGameOver(int correctAnswers) {
showDialog(
context: _scaffoldKey.currentContext,
builder: (context) {
return AlertDialog(
title: Text('Game over!'),
content: Text('Score: $correctAnswers/5'),
actions: [
FlatButton(
child: Text('close'.toUpperCase()),
onPressed: () {
// TODO: Display an Interstitial Ad
if (_interstitialAd != null) {
_interstitialAd?.show();
} else {
_moveToHome();
}
},
),
],
);
},
);
}
- Освободите ресурс, связанный с объектом
InterstitialAd, вызвав методInterstitialAd.dispose()в методе обратного вызоваdispose().
lib/game_route.dart
@override
void dispose() {
...
// TODO: Dispose an InterstitialAd object
_interstitialAd?.dispose();
...
super.dispose();
}
Вот и всё! Запустите проект и завершите игру. Если загружается промежуточная реклама, вы увидите её после нажатия кнопки «Закрыть» в диалоговом окне результатов.

9. Добавьте рекламу с вознаграждением.
В этом разделе вы добавляете рекламу с вознаграждением, которая предоставляет пользователю дополнительную подсказку в качестве награды.
- Откройте файл
lib/game_route.dart - В классе
_GameRouteStateдобавьте элементы для рекламы с вознаграждением и реализуйте метод_loadRewardedAd(). Обратите внимание, что он загружает другую рекламу с вознаграждением при закрытии текущей (onAdDismissedFullScreenContent), чтобы кэшировать рекламу как можно раньше.
lib/game_route.dart
class _GameRouteState extends State<GameRoute> implements QuizEventListener {
...
// TODO: Add _rewardedAd
RewardedAd? _rewardedAd;
// TODO: Implement _loadRewardedAd()
void _loadRewardedAd() {
RewardedAd.load(
adUnitId: AdHelper.rewardedAdUnitId,
request: AdRequest(),
rewardedAdLoadCallback: RewardedAdLoadCallback(
onAdLoaded: (ad) {
ad.fullScreenContentCallback = FullScreenContentCallback(
onAdDismissedFullScreenContent: (ad) {
setState(() {
ad.dispose();
_rewardedAd = null;
});
_loadRewardedAd();
},
);
setState(() {
_rewardedAd = ad;
});
},
onAdFailedToLoad: (err) {
print('Failed to load a rewarded ad: ${err.message}');
},
),
);
}
...
}
- Вызовите метод
_loadRewardedAd()из методаinitState(), чтобы запросить показ рекламы с вознаграждением при запуске игры.
lib/game_route.dart
class _GameRouteState extends State<GameRoute> implements QuizEventListener {
...
@override
void initState() {
...
// COMPLETE: Load a Rewarded Ad
_loadRewardedAd();
}
...
}
- Предоставьте пользователям возможность посмотреть рекламный ролик с вознаграждением, нажав на плавающую кнопку действия. Кнопка отображается только в том случае, если пользователь не использовал подсказку на текущем уровне и рекламный ролик с вознаграждением загружен.
Измените метод _buildFloatingActionButton() следующим образом, чтобы отобразить плавающую кнопку действия. Обратите внимание, что возврат null скрывает кнопку с экрана.
Обратите внимание, что onUserEarnedReward является наиболее важным событием в рекламе с вознаграждением. Оно срабатывает, когда пользователь получает право на получение вознаграждения (например, досмотрел видео).
В этом практическом задании метод QuizManager.instance.useHint() вызывается из функции обратного вызова, которая раскрывает еще один символ в строке подсказки. Приложение перезагружает рекламу с вознаграждением в функции обратного вызова onAdClosed чтобы убедиться, что реклама готова как можно раньше.
lib/game_route.dart
Widget? _buildFloatingActionButton() {
// TODO: Return a FloatingActionButton if a rewarded ad is available
return (!QuizManager.instance.isHintUsed && _rewardedAd != null)
? FloatingActionButton.extended(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Need a hint?'),
content: Text('Watch an Ad to get a hint!'),
actions: [
TextButton(
child: Text('cancel'.toUpperCase()),
onPressed: () {
Navigator.pop(context);
},
),
TextButton(
child: Text('ok'.toUpperCase()),
onPressed: () {
Navigator.pop(context);
_rewardedAd?.show(
onUserEarnedReward: (_, reward) {
QuizManager.instance.useHint();
},
);
},
),
],
);
},
);
},
label: Text('Hint'),
icon: Icon(Icons.card_giftcard),
)
: null;
}
- Освободите ресурс, связанный с объектом
RewardedAd, вызвав методRewardedAd.dispose()в методе обратного вызоваdispose().
lib/game_route.dart
@override
void dispose() {
...
// TODO: Dispose a RewardedAd object
_rewardedAd?.dispose();
...
super.dispose();
}
Вот и всё! Запустите проект и играйте. После загрузки рекламного ролика внизу экрана появится кнопка подсказки. Нажмите кнопку «Подсказка» , чтобы получить дополнительную подсказку.

10. Всё готово!
Вы завершили выполнение задания в CodeLab. Полный код для этого задания можно найти в...
полная папка.
Чтобы узнать, как реализовать баннерную рекламу и встроенные рекламные объявления, ознакомьтесь с практической работой по добавлению баннера AdMob и встроенных рекламных объявлений в приложение Flutter .
Чтобы узнать больше, попробуйте другие примеры кода Flutter .




