1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/admobile-ADSuyiSdkDemo-flutter

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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:

2.1.2.1 В файле build.gradle в разделе allprojects добавьте репозитории:

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/' }
    }
}

2.1.2.2 Поддержка OAID

Импортируйте библиотеку безопасности OAID версии 1.0.25.aar, которую можно найти в папке Demo/libs. Рекомендуется использовать ту же версию библиотеки OAID, что и в Demo. Скопируйте файл supplierconfig.json из папки Demo/assets в свою папку assets и настройте AppId для OAID согласно файлу supplierconfig.json. Имя файла supplierconfig.json нельзя изменять.

2.1.2.3 В файле build.gradle в каталоге android/app добавьте зависимости:

// Поддержка библиотек, если используется 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 свяжитесь с разработчиком.

2.1.2.4 При создании рекламных мест обратите внимание на следующее:

Поскольку используется подход Flutter, могут возникнуть проблемы с отображением информации о рекламе. При создании каналов GDT, Baidu и Kuaishou рекомендуется создавать рекламные места с соотношением сторон, близким к 10:9, для достижения наилучшего эффекта отображения. В противном случае могут появиться пустые области.

3.1 Конфигурация среды разработки

3.1.1 Настройка среды iOS

3.1.1.1 Добавьте поддержку Http в файл info.plist:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

3.1.1.2 Добавьте поля разрешений для определения местоположения в файл info.plist (можно не настраивать с помощью ADMobGenLocation):

NSLocationWhenInUseUsageDescription
NSLocationAlwaysAndWhenInUseUsageDeion

3.1.1.3 Добавьте поля разрешения для доступа к локальной сети в файл info.plist:

    <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.

  1. Добавьте следующие идентификаторы SKAdNetwork в файл info.plist, чтобы обеспечить правильную работу SKAdNetwork. В зависимости от подключённой платформы добавьте соответствующие идентификаторы SKNetworkID. Если у вас нет идентификатора платформы SKNetworkID, то добавлять ничего не нужно.
<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>

4.1 Инициализация основного SDK

AdSuyiFlutterSdk.initSdk(appid: "appid");

4.2 Заставка с рекламой

4.2.1 Заставка с рекламой (переход на страницу загрузки и отображения)

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();
  }
}

4.2.2 Заставка с рекламой (загрузка и отображение разделены)

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();
  }
}

4.5 Вставка полноэкранного рекламного объявления

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();
  }
}

4.6 Рекламное объявление в ленте новостей

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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
BSD-3-Clause
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/admobile-ADSuyiSdkDemo-flutter.git
git@api.gitlife.ru:oschina-mirror/admobile-ADSuyiSdkDemo-flutter.git
oschina-mirror
admobile-ADSuyiSdkDemo-flutter
admobile-ADSuyiSdkDemo-flutter
master