1.1 Обзор
Уважаемые разработчики, добро пожаловать в использование ADmobile Суи Шихан (Suyi) рекламный SDK! С помощью этого документа вы сможете легко интегрировать рекламу в своё приложение за несколько минут.
Поддерживаемые операционные системы: iOS 9.0 и выше, Android 4.4 и выше.
Поддерживаемое оборудование: iPhone (на iPad реклама может отображаться с низкой эффективностью или не поддерживаться, рекомендуется не показывать рекламу на iPad), Android.
2.1 Импорт SDK
Сначала необходимо импортировать основной SDK:
dependencies:
ad_suyi_flutter_sdk: {library version}
Затем необходимо импортировать платформенные SDK.
2.1.1 Для iOS в файле podfile проекта добавьте следующие строки, чтобы выбрать необходимые платформы:
pod 'ADSuyiSDK','~> 3.9.6.08303' # Основной SDK обязателен
pod 'ADSuyiSDK/ADSuyiSDKPlatforms/tianmu' # Tianmu обязателен
pod 'ADSuyiSDK/ADSuyiSDKPlatforms/gdt' # GDT (GDTong) опционально
pod 'ADSuyiSDK/ADSuyiSDKPlatforms/baidu' # Baidu опционально
pod 'ADSuyiSDK/ADSuyiSDKPlatforms/ks' # Kuaishou опционально
pod 'ADSuyiSDK/ADSuyiSDKPlatforms/jad' # Jingdian опционально
# Выберите один из вариантов:
# a. Не требуется gromore
pod 'ADSuyiSDK/ADSuyiSDKPlatforms/bu' # Chunshanqia (Toutiao) обязателен
# b. Требуется gromore
# pod 'ADSuyiSDK/ADSuyiSDKPlatforms/bu-without' # Chunshanqia (Toutiao) обязателен
# pod 'ADSuyiSDK/ADSuyiSDKPlatforms/gromore' # gromore опционально
2.1.2 Для Android в корневом каталоге проекта добавьте репозитории Suyi:
allprojects {
repositories {
...
google()
jcenter()
mavenCentral()
// Добавьте следующие репозитории
// Репозиторий Suyi
maven { url "https://maven.admobile.top/repository/maven-releases/" }
// Если добавлен облачный код, также добавьте его репозиторий
maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' }
// Если добавлена Huawei Alliance Ads, также добавьте её репозиторий
maven { url 'https://developer.huawei.com/repo/' }
}
}
Импортируйте библиотеку безопасности OAID версии 1.0.25.aar, которую можно найти в папке Demo/libs. Рекомендуется использовать ту же версию библиотеки OAID, что и в Demo. Скопируйте файл supplierconfig.json из папки Demo/assets в свою папку assets и настройте AppId для OAID согласно файлу supplierconfig.json. Имя файла supplierconfig.json нельзя изменять.
// Поддержка библиотек, если используется AndroidX, используйте соответствующие библиотеки поддержки
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:design:28.0.0'
// Обязательная библиотека основного SDK
implementation 'cn.admobiletop.adsuyi.ad:core:3.9.6.07122'
// Библиотека OAID версии 1.0.25, для канала Huawei см. документ 5.2
implementation(name: 'oaid_sdk_1.0.25', ext: 'aar')
// Адаптер OAID версии 1.0.25 для других платформ, см. документ 5.2.5
implementation 'cn.admobiletop.adsuyi.ad:oaid:1.0.25.12122'
// Платформенный адаптер Tianmu, обязательный
implementation 'cn.admobiletop.adsuyi.ad.adapter:tianmu:2.2.6.08191'
// Платформенный адаптер GDT (Guangdutong), опциональный
implementation 'cn.admobiletop.adsuyi.ad.adapter:gdt:4.602.1472.09032'
// Платформенный адаптер Toutiao, опциональный
implementation 'cn.admobiletop.adsuyi.ad.adapter:toutiao:6.4.1.6.08192'
// Расширенный платформенный адаптер Baidu, опциональный
implementation 'cn.admobiletop.adsuyi.ad.adapter:baidu-enhanced:9.371.07302'
// Платформенный адаптер Kuaishou, опциональный
implementation 'cn.admobiletop.adsuyi.ad.adapter:ksadbase:3.3.69.08192'
// Платформенный адаптер Mimo, опциональный
implementation 'cn.admobiletop.adsuyi.ad.adapter:mimo:5.3.2.06282'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
// Платформенный адаптер Huawei Alliance Ads, опциональный
implementation 'cn.admobiletop.adsuyi.ad.adapter:hwpps:13.4.73.301.07301'
// Платформенный адаптер Jingdian, опциональный. В настоящее время доступна версия поддержки, для AndroidX требуется связаться с разработчиком
implementation 'cn.admobiletop.adsuyi.ad.adapter:jadyun:2.5.6.11103'
// Платформенный адаптер gromore, опциональный. Для других каналов gromore обратитесь к разработчику.
// gromore уже объединён с Chunshanqia, этот раздел не нужно повторять для импорта Chunshanqia.
implementation 'cn.admobiletop.adsuyi.ad.adapter:gromore-without:6.4.1.6.10081'
implementation "com.pangle.cn:mediation-gdt-adapter:4.575.1445.1" // Платформенный адаптер Guangdutong
// Для других каналов gromore свяжитесь с разработчиком.
Поскольку используется подход Flutter, могут возникнуть проблемы с отображением информации о рекламе. При создании каналов GDT, Baidu и Kuaishou рекомендуется создавать рекламные места с соотношением сторон, близким к 10:9, для достижения наилучшего эффекта отображения. В противном случае могут появиться пустые области.
3.1 Конфигурация среды разработки
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
NSLocationWhenInUseUsageDescription
NSLocationAlwaysAndWhenInUseUsageDeion
<key>Privacy - Local Network Usage Description</key>
<string>Реклама и мониторинг рекламы для предотвращения мошенничества</string>
<key>Bonjour services</key>
<array>
<string>_apple-mobdev2._tcp.local</string>
</array>
``` ```
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 电商及生活 -->
<string>com.suning.SuningEBuy</string> <!-- 苏宁 -->
<string>openapp.jdmobile</string> <!-- 京东 -->
<string>openjd</string> <!-- 京东 -->
<string>jdmobile</string> <!-- 京东 -->
<string>vmall</string>
<string>vipshop</string> <!-- 维品汇 -->
<string>suning</string> <!-- 苏宁 -->
<string>yohobuy</string> <!-- 有货 -->
<string>kaola</string> <!-- 网易考拉 -->
<string>yanxuan</string> <!-- 网易严选 -->
<string>wbmain</string> <!-- 58同城 -->
<string>dianping</string> <!-- 大众点评 -->
<string>imeituan</string> <!-- 美团 -->
<string>beibeiapp</string> <!-- 贝贝 -->
<string>taobao</string> <!-- 淘宝 -->
<string>tmall</string> <!-- 天猫 -->
<string>wireless1688</string> <!-- 阿里巴巴1688 -->
<string>tbopen</string> <!-- 淘宝 -->
<string>taobaolite</string> <!-- 淘特 -->
<string>taobaoliveshare</string> <!-- 淘宝直播 -->
<string>koubei</string> <!-- 口碑 -->
<string>eleme</string> <!-- 饿了么 -->
<string>alipays</string> <!-- 支付宝 -->
<string>kfcapplinkurl</string> <!-- KFC -->
<string>pddopen</string> <!-- 拼多多 -->
<string>pinduoduo</string> <!-- 拼多多 -->
<string>mogujie</string> <!-- 蘑菇街 -->
<string>lianjiabeike</string> <!-- 链家贝壳 -->
<string>lianjia</string> <!-- 链家 -->
<string>openanjuke</string> <!-- 安居客 -->
<string>zhuanzhuan</string> <!-- 转转 -->
<string>farfetchCN</string> <!-- 发发奇全球时尚购物 -->
<!-- 社交社区 -->
<string>weibo</string> <!-- 微博 -->
<string>xhsdiscover</string> <!-- 小红书 -->
<string>uclink</string> <!-- uc浏览器 -->
<string>momochat</string> <!-- 陌陌 -->
<string>blued</string> <!-- Blued -->
<string>zhihu</string> <!-- 知乎 -->
<string>baiduboxapp</string> <!-- 手机百度 -->
<string>yidui</string> <!-- 伊对 -->
<!-- 资讯及阅读 -->
<string>sinanews</string> <!-- 新浪新闻 -->
<string>snssdk141</string> <!-- 今日头条 -->
<string>newsapp</string> <!-- 网易新闻 -->
<string>igetApp</string> <!-- 得到 -->
<string>kuaikan</string> <!-- 快看漫画 -->
<!-- 短视频及音乐 -->
<string>youku</string> <!-- 优酷 -->
<string>snssdk1128</string> <!-- 抖音 -->
<string>gifshow</string> <!-- 快手 -->
<string>snssdk1112</string> <!-- 火山 -->
<string>miguvideo</string> <!-- 咪咕视频 -->
<string>iqiyi</string> <!-- 爱奇艺 -->
<string>bilibili</string> <!-- B站 -->
<string>tenvideo</string> <!-- 腾讯视频 -->
<string>baiduhaokan</string> <!-- 百度好看 -->
<string>yykiwi</string> <!-- 虎牙直播 -->
<string>qqmusic</string> <!-- qq音乐 -->
<string>orpheus</string> <!-- 网易云音乐 -->
<string>kugouURL</string> <!-- 酷狗 -->
<string>qmkege</string> <!-- 全民K歌 -->
<string>changba</string> <!-- 唱吧 -->
<string>iting</string> <!-- 喜马拉雅 -->
<!-- 出行 -->
<string>ctrip</string> <!-- 携程 -->
<string>QunarAlipay</string> <!-- 去哪儿旅行 -->
<string>diditaxi</string> <!-- 滴滴出行 -->
<string>didicommon</string> <!-- 滴滴出行 -->
<string>taobaotravel</string> <!-- 飞猪 -->
<string>OneTravel</string> <!-- 海南航空 -->
<string>kfhxztravel</string> <!-- 花小猪 -->
<!-- 医美 -->
<string>gengmei</string> <!-- 更美 -->
<string>app.soyoung</string> <!-- 新氧医美 -->
</array>
В тексте запроса представлен фрагмент кода на языке программирования Java, который описывает использование разрешений в Android-приложении. В частности, перечислены три необходимых разрешения: INTERNET, WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE. 3.2.2 SKAdNetwork
SKAdNetwork — это метод получения данных о причинах маркетинговых кампаний на iOS.
<key>SKAdNetworkItems</key>
<array>
// 穿山甲广告(ADSuyiBU)
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x2jnk7ly8j.skadnetwork</string>
</dict>
</array>
AdSuyiFlutterSdk.initSdk(appid: "appid");
class SplashPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _SplashState();
}
class _SplashState extends State<SplashPage> {
ADSuyiSplashAd _splashAd;
@override
Widget build(BuildContext context) {
showSplashAd();
return Scaffold(
appBar: AppBar(
title: Text("Splash"),
),
body: Center(
),
);
}
// Заставка
// Чтобы отобразить заставку, убедитесь, что в приложении нет других мест, где отображается заставка, иначе возникнет конфликт
void showSplashAd() {
if(_splashAd != null) {
return;
}
// posId: идентификатор рекламного места,
// imgName: имя фона,
// imgLogoName: название логотипа внизу,
// isRepeatApplyPermission: разрешено ли повторно считывать разрешение после отказа пользователя: true разрешено, false запрещено,
// isApplyPermission: динамическое применение разрешения: true разрешено, false запрещено
_splashAd = ADSuyiSplashAd(posId: "posid", imgName: "splash_placeholder", imgLogoName: "splash_bottom_icon", isRepeatApplyPermission: false, isApplyPermission: false);
_splashAd.onClosed = (AdInfo adInfo) {
print("Заставка закрыта");
// После закрытия или сбоя загрузки закройте рекламу
releaseSplashAd();
};
_splashAd.onFailed = (AdErrorInfo adErrorInfo) {
print("Ошибка заставки");
// После сбоя загрузки или закрытия заставки закройте рекламу
releaseSplashAd();
};
_splashAd.onExposed = (AdInfo adInfo) { print("Заставка выставлена"); };
_splashAd.onSucced = (AdInfo adInfo) { print("Успех заставки"); };
_splashAd.onClicked = (AdInfo adInfo) { print("Нажатие на заставку"); };
_splashAd.loadAndShow();
}
void releaseSplashAd() {
_splashAd?.release();
_splashAd = null;
}
@override
void dispose() {
releaseSplashAd();
super.dispose();
}
}
class SplashLoadShowSeparatePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _SplashLoadShowSeparateState();
}
class _SplashLoadShowSeparateState extends State<SplashLoadShowSeparatePage> {
ADSuyiSplashAdLoadShowSeparate? _adSuyiFlutterSplashAd;
bool _hasInitBanner = false;
@override
Widget build(BuildContext context) {
if (_adSuyiFlutterSplashAd == null && _hasInitBanner == false) {
MediaQueryData queryData = MediaQuery.of(context);
_hasInitBanner = true;
var width = queryData.size.width;
var height = queryData.size.height;
_adSuyiFlutterSplashAd = ADSuyiSplashAdLoadShowSeparate(
posId: KeyManager.splashPosid(), width: width, height: height);
// Загрузить рекламу
_adSuyiFlutterSplashAd!.load();
_adSuyiFlutterSplashAd!.onSucced = (AdInfo adInfo) {
print("Загрузка заставки успешна");
// Показать рекламу
_adSuyiFlutterSplashAd!.show();
};
_adSuyiFlutterSplashAd!.onFailed = (AdErrorInfo adErrorInfo) {
releaseSplashAd();
print("Сбой загрузки заставки");
toHome();
};
_adSuyiFlutterSplashAd!.onClicked = (AdInfo adInfo) {
print("Нажатие на заставку");
};
_adSuyiFlutterSplashAd!.onExposed = (AdInfo adInfo) {
``` ```
releaseFullScreenVodAd();
};
_fullScreenVodAd.load();
}
void releaseFullScreenVodAd() {
_fullScreenVodAd?.release();
_fullScreenVodAd = null;
}
void playFullScreenVodAd() {
_fullScreenVodAd.show();
}
@override
void dispose() {
releaseFullScreenVodAd();
super.dispose();
}
}
class InterPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _InterState();
}
class _InterState extends State<InterPage> {
ADSuyiIntertitialAd _interAd;
@override
Widget build(BuildContext context) {
showInterAd();
return Scaffold(
appBar: AppBar(
title: Text("Intertitial"),
),
body: Center(
),
);
}
// Вставка
// Для показа полноэкранной рекламы убедитесь, что в данный момент в приложении нет других мест, где показывается такая реклама, иначе может возникнуть конфликт
void showInterAd() {
if(_interAd != null) {
return;
}
_interAd = ADSuyiIntertitialAd(posId: KeyManager.interPosid());
_interAd.onClicked = (AdInfo adInfo) {
print("Полноэкранная реклама закрыта");
};
_interAd.onFailed = (AdErrorInfo adErrorInfo) {
print("Показ полноэкранной рекламы не удался");
releaseInterAd();
};
_interAd.onExposed = (AdInfo adInfo) {
print("Полноэкранная реклама была показана");
};
_interAd.onSucced = (AdInfo adInfo) {
print("Полноэкранная реклама успешно показана");
playInterAd();
};
_interAd.onClicked = (AdInfo adInfo) {
print("На полноэкранную рекламу нажали");
};
_interAd.onRewarded = () {
print("Достигнуто вознаграждение за полноэкранную рекламу");
};
_interAd.onClosed = (AdInfo adInfo) {
print("Полноэкранная реклама закрыта");
releaseInterAd();
};
_interAd.load();
}
void releaseInterAd() {
_interAd?.release();
_interAd = null;
}
void playInterAd() {
_interAd.show();
}
@override
void dispose() {
releaseInterAd();
super.dispose();
}
}
class NativePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => NativeState();
}
class NativeState extends State<NativePage> {
ADSuyiFlutterNativeAd _nativeAd;
List<dynamic> _items = List.generate(10, (i) => i);
ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
_scrollController.addListener(() {
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
_getAdData();
}
});
}
_getAdData() async {
_nativeAd.load();
}
void createNativeAd(BuildContext context) {
if(_nativeAd == null) {
MediaQueryData queryData = MediaQuery.of(context);
var width = queryData.size.width;
/**
* Поскольку flutter не может заранее получить некоторые рекламные материалы для нативной рекламы, разработчикам необходимо выполнить некоторую обработку.
* Например, каждый канал может подать заявку на рекламные материалы аналогичного размера, и разработчики могут установить здесь фиксированное соотношение. (Пример: выбор горизонтальной версии с чистым изображением; Flying Ant: плавающий слой текста; Baidu: три изображения; Kuaishou: горизонтальное большое изображение)
* Цель установки соотношения заключается в основном в предотвращении перекрытия рекламных материалов, что приводит к снижению доходов и проблемам соответствия требованиям.
*/
var height = width / 16 * 12;
_nativeAd = ADSuyiFlutterNativeAd(posId: KeyManager.nativePosid(), width: width, height: height);
_nativeAd!.onFailed = (AdErrorInfo adErrorInfo) {
};
_nativeAd.onReceived = (ADSuyiFlutterNativeAdView adView) {
setState(() {
var adWidget = ADSuyiWidget(adView: adView);
adView.onClosed = (AdInfo adInfo) {
setState(() {
_items.remove(adWidget);
adView.release();
});
};
adView.onExposed = (AdInfo adInfo) {
};
_items.add(adWidget);
_items.addAll(List.generate(1, (i) => i));
});
};
}
}
@override
Widget build(BuildContext context) {
createNativeAd(context);
return Scaffold(
appBar: AppBar(
title: Text("Native"),
),
body: Center(
child: ListView.builder(
itemCount: _items.length,
controller: _scrollController,
itemBuilder: (BuildContext context, int index) {
final item = _items[index];
if (item is Widget) {
return item;
} else {
return Container(
width: 300,
height: 150,
child: Text("Cell", style: TextStyle(fontSize:
``` **4.7 Вознаграждающая видеореклама**
```dart
class RewardPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _RewardState();
}
class _RewardState extends State<RewardPage> {
ADSuyiRewardAd _rewardAd;
@override
Widget build(BuildContext context) {
showRewardAd();
return Scaffold(
appBar: AppBar(
title: Text("Reward"),
),
body: Center(),
);
}
void showRewardAd() {
if(_rewardAd != null) {
return;
}
_rewardAd = ADSuyiRewardAd(posId: KeyManager.rewardPosid());
_rewardAd.onClicked = (AdInfo adInfo) {
print("Вознаграждающая видеореклама закрыта.");
};
_rewardAd.onFailed = (AdErrorInfo adErrorInfo) {
print("Ошибка вознаграждающей видеорекламы.");
releaseRewardAd();
};
_rewardAd.onExposed = (AdInfo adInfo) {
print("Вознаграждающая видеореклама показана.");
};
_rewardAd.onSucced = (AdInfo adInfo) {
print("Показ вознаграждающей видеорекламы успешен.");
playRewardAd();
};
_rewardAd.onClicked = (AdInfo adInfo) {
print("Нажимание на вознаграждающую видеорекламу.");
};
_rewardAd.onRewarded = (AdInfo adInfo) {
print("Достижение вознаграждения в видеорекламе.");
};
_rewardAd.onClosed = (AdInfo adInfo) {
print("Закрытие вознаграждающей видеорекламы.");
releaseRewardAd();
};
_rewardAd.load();
}
void releaseRewardAd() {
_rewardAd?.release();
_rewardAd = null;
}
void playRewardAd() {
_rewardAd.show();
}
@override
void dispose() {
releaseRewardAd();
super.dispose();
}
}
4.8 Переключатель персонализации
AdSuyiFlutterSdk.setPersonalizedEnabled(personalized: true);
4.9 Получение информации о рекламе
В настоящее время в обратных вызовах onSucced, onClosed, onClicked, onExposed и onRewarded добавляется передача информации об объявлении adInfo. Разработчики могут получить информацию о рекламе следующими способами:
Метод | Описание |
---|---|
platformName | Получает название платформы для сторонних объявлений, возвращает строку. |
ecpm | Получает ECPM, возвращает значение типа double (единица измерения: юань). |
ecpmPrecision | Тип ECPM, возвращающий строку (accurate: точный, platform_assignment: заданный платформой, estimate: оценка). |
4.5 Получение информации об ошибках рекламы
На данный момент информация об ошибке возвращается только в обратном вызове onFailed. Разработчики могут получать информацию об ошибках следующими способами:
Метод | Описание |
---|---|
errorCode | Код ошибки, возвращает целое число. |
errorDescription | Получает информацию об ошибке, возвращает строку. |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )