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
Репозиторий содержит две папки:
- starter — Начальный код, который вы создадите в этой лаборатории кода.
- Complete — Завершенный код для этой лаборатории кода.
3. Настройте приложение AdMob и рекламные блоки.
Поскольку Flutter — это многоплатформенный SDK, вам необходимо добавить в AdMob приложение и рекламные блоки как для Android, так и для iOS.
Настройка для Android
Чтобы настроить Android, вам необходимо добавить приложение Android и создать рекламные блоки.
Добавить приложение для Android
- В консоли AdMob нажмите «ДОБАВИТЬ ПРИЛОЖЕНИЕ» в меню «Приложения» .
- Когда вас спросят , опубликовали ли вы свое приложение в Google Play или App Store? , нажмите НЕТ .
- Введите
Awesome Drawing Quiz
в поле имени приложения и выберите Android в качестве платформы.
- Для завершения этой лаборатории не требуется включение пользовательских метрик. Однако мы рекомендуем вам это сделать, поскольку это позволит вам более детально понять поведение пользователя. Нажмите ДОБАВИТЬ , чтобы завершить процесс.
Создать рекламные блоки
Чтобы начать добавлять рекламные блоки в AdMob:
- Выберите «Потрясающий тест по рисованию» в меню «Приложения» консоли AdMob .
- Откройте меню «Рекламные блоки» .
Баннер
|
Межстраничный
|
Награжден
|
Обычно новому рекламному блоку требуется несколько часов, чтобы начать показ объявлений.
Если вы хотите немедленно протестировать поведение объявления, используйте идентификатор тестового приложения и идентификаторы рекламных блоков, указанные в таблицах «Идентификатор приложения для Android/идентификатор рекламного блока» и «Идентификатор приложения для iOS/идентификатор рекламного блока».
Настройка для iOS
Чтобы настроить iOS, вам необходимо добавить приложение для iOS и создать рекламные блоки.
Добавить приложение для iOS
- В консоли AdMob нажмите «ДОБАВИТЬ ПРИЛОЖЕНИЕ» в меню «Приложения» .
- Когда вас спросят , опубликовали ли вы свое приложение в Google Play или App Store? , нажмите НЕТ .
- Введите
Awesome Drawing Quiz
в поле имени приложения и выберите iOS в качестве платформы.
- Для завершения этой лаборатории не требуется включение пользовательских метрик. Однако мы рекомендуем вам это сделать, поскольку это позволит вам более детально понять поведение пользователя. Нажмите ДОБАВИТЬ , чтобы завершить процесс.
Создать рекламные блоки
Чтобы добавить рекламные блоки:
- Выберите приложение Awesome Drawing Quiz в меню «Приложения» в консоли AdMob .
- Откройте меню «Рекламные блоки» .
Баннер
|
Межстраничный
|
Награжден
|
Обычно новому рекламному блоку требуется несколько часов, чтобы начать показ объявлений.
Если вы хотите немедленно протестировать поведение объявления, используйте идентификатор тестового приложения и идентификаторы рекламных блоков, перечисленные в следующей таблице.
Необязательно: используйте тестовое приложение AdMob и рекламные блоки.
Если вы хотите следовать кодовой лаборатории вместо того, чтобы создавать новое приложение и рекламные блоки самостоятельно, вы можете использовать тестовый идентификатор приложения AdMob и идентификаторы рекламных блоков, перечисленные в следующих таблицах.
Идентификатор приложения Android/идентификатор рекламного блока
Элемент | Идентификатор приложения/идентификатор рекламного блока |
Идентификатор приложения Рекламы в приложении | |
Баннер | |
Межстраничный | |
Награжден | |
Идентификатор приложения iOS/идентификатор рекламного блока
Элемент | Идентификатор приложения/идентификатор рекламного блока |
Идентификатор приложения Рекламы в приложении | |
Баннер | |
Межстраничный | |
Награжден | |
Дополнительные сведения о тестовых объявлениях см. в тестовых объявлениях для 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
...
Нажмите «Pub get» , чтобы установить плагин в проект 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.
Перед загрузкой рекламы необходимо инициализировать Google Mobile Ads SDK. Откройте файл lib/home_route.dart
и измените _initGoogleMobileAds()
чтобы инициализировать SDK перед загрузкой домашней страницы.
Обратите внимание, что вам необходимо изменить тип возвращаемого значения метода _initGoogleMobileAds()
с Future<dynamic>
на Future<InitializationStatus>
, чтобы получить результат инициализации SDK после ее завершения.
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();
}
}
- Когда игра заканчивается, отображается диалоговое окно счета игры. Когда пользователь закрывает диалоговое окно, он перенаправляется на главный экран викторины «Потрясающее рисование» .
Поскольку межстраничная реклама должна отображаться между переходами экрана, мы показываем ее, когда пользователь нажимает кнопку ЗАКРЫТЬ .
Измените метод 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. Все готово!
Вы завершили кодовую лабораторию. Вы можете найти готовый код для этой лаборатории кода в разделе полная папка.
Чтобы узнать, как реализовать баннер и нативную встроенную рекламу, ознакомьтесь с лабораторной работой по добавлению баннера AdMob и нативной встроенной рекламы в кодовую лабораторию приложения Flutter .
Чтобы узнать больше, попробуйте другие лаборатории разработки кода Flutter .