# 聚量APPSDK对接文档

# Android

# 一.首页

# 1.1 概述

本文档旨在帮助 Android 应用开发者在程序中快速植入聚量广告平台提供的广告。作为应用开发者,您只需要进行简单配置,就可以在您的应用中显示定制的广告。关于 SDK 的具体使用方法,请仔细阅读下面的文档。

# 1.2 背景

# 开发环境

  • 操作系统:支持 Linux/Mac/Windows 系统,具体依赖开发者选择的 IDE
  • 开发工具:支持 Android studio、Eclipse、Intellij
  • 部署目标:接入聚量广告平台的应用
  • 支持设备:运行了 Android 4.0 以及以上系统的 Android 设备

# 术语介绍

  • app_key:媒体ID,是您在聚量广告平台创建媒体时获得的 ID,这个 ID 是我们在广告网络中识别您应用的唯一 ID。
  • adid:广告位 ID,是您在聚量广告平台为您的媒体所创建的某种类型(Banner、开屏、插屏、自渲染、平台模板、平台模板2.0)的广告位置的 ID。

# Android SDK下载

下载地址:

https://static.lejuliang.com/ext-sdk/Android_SDK_V1.0.3.rar (opens new window)

# 1.3 历史版本

版本 发布日期 说明
v1.0.0 2021-03-25 1.0版本正式上线
V1.0.1 2021-4-16 支持轮播Banner广告
V1.0.2 2021-5-28 支持开屏增加点击按钮,倒计时时间设置,下载类广告二次确认弹窗,开屏跳过按钮样式优化,开屏底栏显示APP信息
V1.0.3 2021-6-25 支持优量汇Banner自渲染
V1.0.4 2021-7-16 支持后台配置开屏跳过按钮样式、开屏点击按钮、开屏倒计时时长、下载类广告确认弹窗、下载类广告后台下载

# 1.4 广告位创建流程

请联系聚量广告平台媒介经理“新建媒体账号”以及“新建广告位”。 聚量媒体后台:

https://ssp.lejuliang.com/#/login (opens new window):

步骤说明:

  • 1.在新建广告位之前,确保您已经下载最新版SDK并阅读完说明文档,了解如何在您的媒体中使用广告位 adid和媒体app_key。

  • 2.确定接入SDK的应用和广告位,同步聚量媒介经理应用下载链接以及广告位截图和广告位尺寸等信息。

  • 3.目前平台提供选择的广告展示形式包括:开屏、插屏、Banner广告。在聚量媒介经理同步给您广告位adid和app_key信息后,即可启动接入。

  • 4.成功得到app_key和广告位adid以后,您可以在应用代码内使用该ID进行广告联调测试(见“接入代码”部分)

  • 5.通过测试后,即可发布带有聚量广告平台广告位的 Android 应用。

# 1.5 支持广告类型

广告类型 简介 适用场景
开屏 开屏广告以App启动作为曝光时机,提供5s的可感知广告展示。 app启动时,常会使用开屏广告。
插屏 插屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。 在应用执行流程的自然停顿点,适合投放这类广告
Banner 位于app顶部、中部、底部任意一处,横向贯穿整个app页面。 常出现在文章页末尾,详情页面底部,信息流顶部等

# 广告示例

# 开屏

开屏广告以App启动作为曝光时机,提供5s的可感知广告展示。用户可以点击广告跳转到目标页面;或者点击右上角的“跳过”按钮,跳转到app内容首页。

适用场景: 开屏广告会在您的应用开启时加载,拥有固定展示时间(一般为5秒),展示完毕后自动关闭并进入您的应用主界面。

分类: 开屏广告分为半屏和全屏,其中半屏开屏广告支持开发者自定义设置开屏底部的界面,用以展示应用Logo等。

聚量自有的开屏广告为纯图片;

穿山甲和优量汇支持图片和视频开屏广告;

# 插屏

插屏半屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。

适用场景:在应用执行流程的自然停顿点,适合投放这类广告。

分类:聚量自有的插屏广告为纯图片;

穿山甲和优量汇支持插屏图片和视频广告;

Banner广告(横幅广告)位于app顶部、中部、底部任意一处,横向贯穿整个app页面;当用户与app互动时,Banner广告会停留在屏幕上,点击Banner广告后,会跳转至落地页。 适用场景:Banner广告展现场景非常灵活,常见的展现场景为:文章页末尾,详情页面底部,信息流顶部等。 分类:聚量自有的Banner广告为纯图片。 优量汇和穿山甲的Banner广告有文字链、图文、纯图片形式。

# 二. SDK 嵌入

# 2.1 导入示例工程

SDK包里面 ad.rar 是示例工程,申请好adid  和 app_key,即可直接运行

# 2.2 嵌入广告SDK

# 2.21 导入aar包

  1. 1、 yk_jl_v1.0.4 这个是广告sdk核心包,必须导入,导入后自带聚量的广告包
  2. 2、 yk_ylh_v1.0.4.aar、GDTSDK.unionNormal.4.362.1232 , 这两个是优量汇包,可选导入
  3. open_ad_sdk.aar 、yk_csj_v1.0.4.aar 。 open_ad_sdk包是穿山甲广告aar包,csj是适配穿山甲的包,如果需要穿山甲广告,则两个包必须一起导入

# 2.22 获取权限

权限在aar包中已经申请, 不需要申请权限

# 2.23 gradle 依赖

api(name: 'yk_csj_v1.0.4', ext: 'aar')
api(name: 'yk_ylh_v1.0.4', ext: 'aar')
implementation(name: 'yk_jl_v1.0.4', ext: 'aar'){
    exclude group: 'org.json'
    exclude group: 'com.squareup.okhttp3'
}
api(name: 'open_ad_sdk', ext: 'aar')
implementation(name: 'GDTSDK.unionNormal.4.362.1232', ext: 'aar')

# 2.24 添加混淆:

#===============广告 =========================
#穿山甲
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.pgl.sys.ces.** {*;}
-keep class com.bytedance.embed_dr.** {*;}
-keep class com.bytedance.embedapplog.** {*;}
-keep class com.agg.sdk.channel.ykcsj.**{*;}

#优量汇
-keep class com.agg.sdk.channel.ykgdt.**{*;}

-keepattributes *Annotation*,InnerClasses

-keepattributes Signature

-keep class * extends com.agg.sdk.core.YKAdAdapter
-keep class * extends com.agg.sdk.ads.view.YeahkaAdsView
-keep class * extends com.agg.sdk.core.pi.IYKModuleManager
-keep class * extends com.agg.sdk.core.managers.YKAdsConfigManager

-keep class com.agg.sdk.core.constants.YKAdConstants{*;}
-keep class com.agg.sdk.core.constants.YKAdMessage{*;}
-keep class com.agg.sdk.core.ykutil.YeahkaLogUtil{
    public *;
}

-keep class com.agg.sdk.core.model.*{*;}
-keep class com.agg.sdk.core.pi.*{*;}
-keep class com.agg.sdk.core.managers.*{*;}
-keep class com.agg.sdk.core.ads.splash.IYKTickerListener{*;}

-keep class com.agg.sdk.core.ykview.ConfirmDownloadDialog{*;}

-ignorewarnings

#=============== 广告 END=========================

# 三. 接入代码

# 3.1 在application中初始化(必须)

YeahkaADManager.getInstance(this).init();

# 3.2 获取权限

List<String> lackedPermission = new ArrayList<>();
if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) {
    lackedPermission.add(Manifest.permission.READ_PHONE_STATE);
}
if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
    lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
    lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
}

if (lackedPermission.size() > 0) {
    String[] requestPermissions = new String[lackedPermission.size()];
    lackedPermission.toArray(requestPermissions);
    requestPermissions(requestPermissions, 1024);
}

# 3.3 开屏广告

splashView = YKADManager.getInstance(this).getSplashAdView(this, textView, appKey,
        adid,new IYKSplashAdListener(){
            @Override
            public void onADDismissed() {
                Log.e("TAGAA", "======onADDismissed=====");
                goMain();
            }

            @Override
            public void onNoAD(YKAdMessage msg) {
                Log.e("TAGAAA", " onNoAD=================");
                goMain();
            }

            @Override
            public void onADPresent() {

            }

            @Override
            public void onADClicked() {

            }

            @Override
            public void onADReceive(View view) {

            }

            @Override
            public void onADLeftApplication() {

            }

            @Override
            public void onADClose() {

            }

            @Override
            public void onADTick(long dt) {
                Log.d("SplashActivity", "dt : " + dt);
            }
        });
其中 
1、onADDismissed,方法是广告需要被关闭时调用,在这里通常做跳转首页处理。
2、onNoAD 方法是请求没有广告时调用。这里也经常做跳转首页处理。
3、onADTick(long time) 广告倒计时时间调用,单位时毫秒
splashView.setVisibility(View.VISIBLE);
container.addView(splashView);
二 、必须在onResume 和 onPause中处理跳转到首页
@Override
protected void onResume() {
    super.onResume();
    if (splashView != null){
    splashView.onResume();
    }
}}

@Override
protected void onPause() {
    super.onPause();
    if (splashView != null){
    splashView.onPause();
}}

# 3.4 插屏广告

interstitialView = YeahkaADManager.getInstance(MainActivity.this).getInterstitialView(
        MainActivity.this, appKey,adid, new IYeahkaAdListener() {
            @Override
            public void onADReceive(View view) {
               
            }

            @Override
            public void onADPresent() {
               
            }

            @Override
            public void onADClicked() {
                

            }

            @Override
            public void onADLeftApplication() {

            }

            @Override
            public void onADClose() {
                
            }

            @Override
            public void onNoAD(YKAdMessage msg) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ((ViewGroup)interstitialView.getParent()).removeView(interstitialView);
                    }
                });
            }

            @Override
            public void onADDismissed() {
                
            }
        });
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
interstitialView.setVisibility(View.VISIBLE);
MainActivity.this.addContentView(interstitialView, layoutParams);

# 3.5 Banner广告

banner广告需要传入宽高的值。建议在view.post中通过通过getMeasureWidth中获取到宽高传入到广告中。其中宽高是dp单位
bannerContainer.post(new Runnable() {
                    @Override
                    public void run() {
                        float width = YKUiUtil.px2dp(bannerContainer.getMeasuredWidth());
                        bannerView = YeahkaADManager.getInstance(MainActivity.this).getBannerView(MainActivity.this,
//                        "384a59cc6fff1ab7", new IAdListener() {

                                "36cc80ad405148f6882c98900e8186ea","1023381", width , width / 2 , new IYeahkaAdListener() {
                                    @Override
                                    public void onADReceive(View view) {
                                        bannerContainer.setVisibility(View.VISIBLE);
                                    }

                                    @Override
                                    public void onADPresent() {
                                        Toast.makeText(MainActivity.this, "banner onADPresent", Toast.LENGTH_SHORT).show();
                                    }

                                    @Override
                                    public void onADClicked() {
                                        Toast.makeText(MainActivity.this, "banner onADClicked", Toast.LENGTH_SHORT).show();
                                    }

                                    @Override
                                    public void onADLeftApplication() {

                                    }

                                    @Override
                                    public void onADClose() {

                                    }

                                    @Override
                                    public void onNoAD(YKAdMessage msg) {
//                                runOnUiThread(new Runnable() {
//                                    @Override
//                                    public void run() {
//                                        bannerContainer.setVisibility(View.INVISIBLE);
//                                    }
//                                });
                                    }

                                    @Override
                                    public void onADDismissed() {

                                    }

                                    @Override
                                    public void onTick(long timeMillsecond) {

                                    }
                                });
                        if(bannerContainer == null) {
                            bannerContainer = findViewById(R.id.bannerContainer);
                        }
                        bannerContainer.removeAllViews();
                        Log.e("TAGAAAA","bannerView     "+bannerView.getHeight());
                        Log.e("TAGAAAA","bannerView     "+bannerView.getMeasuredHeight());
                        bannerContainer.addView(bannerView);
                    }
                });

# 3.6 轮播Banner广告

轮播Banner广告需要使用YKBanner,轮播是以继承BGABanner 实现的轮播效果。里面指示器的设置以及轮播间隔时长的设置、页面切换效果跟BGABanner一样设置。
1、 在Xml<com.agg.sdk.core.ykview.banner.YKABanner
        android:id="@+id/bannerContainer"
        android:layout_width="match_parent"
        android:layout_height="130dp"
       // 设置轮播时长
        app:banner_pageChangeDuration="1000"
       // 设置指示点的图片 , 背景, 以及间隔
        app:banner_pointContainerBackground="@android:color/transparent"
        app:banner_pointDrawable="@drawable/bga_banner_selector_point_hollow"
        app:banner_pointTopBottomMargin="15dp"
      //  页面切换的动画效果 
        app:banner_transitionEffect="alpha"
       />
2、 在Java中设置banner广告位数据
bannerContainer.post(() -> {
            float width = YKUiUtil.px2dp(bannerContainer.getMeasuredWidth());
            float height = YKUiUtil.px2dp(bannerContainer.getMeasuredHeight());
//                  无限轮播
            for (String adid : bannerAdids) {
                adBannerDatas.add(new YKABanner.AdBannerData(
                        "36cc80ad405148f6882c98900e8186ea", adid, width, height
                ));
            }
            bannerContainer.setAdData(adBannerDatas);
        });	
3YKABanner.AdBannerDataAdBannerData是轮播的广告为实体类
构造方法依次是: key , adid , width , height 。其中 width 和 height 是以dp为单位。
4、轮播监听:
    interface ISlideBannerListener {
        /**
         *  BannerView 渲染成功时调用
         * @param view
         */
        void onAdReceive(YeahkaBannerView view);

        /**
         *  BannerView被点击时调用
         *
         * @param view
         */
        void onAdClick(YeahkaBannerView view);

        /** 
         *  BannerView失败时调用
         * @param adid
         * @param errorMsg
         */
        void onError(String adid, YKAdMessage errorMsg);
    }
 通过setSlideBannerListener(ISlideBannerListener listener) 方法调用


# 四. 常见问题

  • 最大广告返回时长一般在多少?

聚量可根据媒体需求调整最大返回时长,一般在500ms以内,若媒体支持的最大返回时长较高,则有利于获得更高的广告填充率。

  • SDK是否有测试环境?

SDK没有测试环境,只有正式环境。

# IOS

# 一. 首页

# 1.1 概述

本文档旨在帮助 iOS 应用开发者在程序中快速植入聚量广告平台提供的广告。作为应用开发者,您只需要进行简单配置,就可以在您的应用中显示定制的广告。关于 SDK 的具体使用方法,请仔细阅读下面的文档。

# 1.2 背景

# 开发环境

确保您的开发及部署环境符合以下标准: ● 开发工具:推荐Xcode 12及以上版本 ● 部署目标:iOS 9.0及以上版本

# 术语介绍

  • app_key:媒体ID,是您在聚量广告平台创建媒体时获得的 ID,这个 ID 是我们在广告网络中识别您应用的唯一 ID。
  • adid:广告位 ID,是您在聚量广告平台为您的媒体所创建的某种类型(Banner、开屏、插屏、自渲染、平台模板、平台模板2.0)的广告位置的 ID。

# IOS SDK的下载

https://static.lejuliang.com/ext-sdk/iOS_SDK_V1.0.3.zip (opens new window):

# 1.3 历史版本

版本 发布日期 说明
V1.0.0 2021-3-25 1.0版本正式上线
V1.0.1 2021-4-16 支持轮播Banner广告
V1.0.2 2021-5-28 支持开屏增加点击按钮,倒计时时间设置,下载类广告二次确认弹窗,开屏跳过按钮样式优化,开屏底栏显示APP信息
V1.0.3 2021-6-25 支持优量汇Banner自渲染

# 1.4 广告位创建流程

请联系聚量广告平台媒介经理“新建媒体账号”以及“新建广告位”。

聚量媒体后台:

https://ssp.lejuliang.com/#/login (opens new window):

步骤说明:

  • 1.在新建广告位之前,确保您已经下载最新版SDK并阅读完说明文档,了解如何在您的媒体中使用广告位 adid和媒体app_key。
  • 2.确定接入SDK的APP应用和广告位,同步聚量媒介经理应用下载链接以及广告位截图和广告位尺寸等信息。
  • 3.目前平台提供选择的广告展示形式包括:开屏、插屏、Banner广告。在聚量媒介经理同步给您广告位adid和app_key信息后,即可启动接入。
  • 4.成功得到app_key和广告位adid以后,您可以在应用代码内使用该ID进行广告联调测试(见“接入代码”部分)
  • 5.通过测试后,即可发布带有聚量广告平台广告位的 iOS 应用。

# 1.5 支持广告类型

广告类型 简介 使用场景 版本备注
开屏 开屏广告以App启动作为曝光时机,提供5s的可感知广告展示。 app启动时,常会使用开屏广告
插屏 插屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。 在应用执行流程的自然停顿点,适合投放这类广告
Banner 位于app顶部、中部、底部任意一处,横向贯穿整个app页面 常出现在文章页末尾,详情页面底部,信息流顶部等

# 广告示例

# 开屏

开屏广告以App启动作为曝光时机,提供5s的可感知广告展示。用户可以点击广告跳转到目标页面;或者点击右上角的“跳过”按钮,跳转到app内容首页。

适用场景:开屏广告会在您的应用开启时加载,拥有固定展示时间(一般为5秒),展示完毕后自动关闭并进入您的应用主界面。

分类:开屏广告分为半屏和全屏,其中半屏开屏广告支持开发者自定义设置开屏底部的界面,用以展示应用Logo等。

聚量自有的开屏广告为纯图片;

穿山甲和优量汇支持图片和视频开屏广告;

# 插屏

插屏半屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。

适用场景:在应用执行流程的自然停顿点,适合投放这类广告。

**分类:**聚量自有的插屏广告为纯图片;

穿山甲和优量汇支持插屏图片和视频广告;

Banner广告(横幅广告)位于app顶部、中部、底部任意一处,横向贯穿整个app页面;当用户与app互动时,Banner广告会停留在屏幕上,点击Banner广告后,会跳转至落地页。

适用场景:Banner广告展现场景非常灵活,常见的展现场景为:文章页末尾,详情页面底部,信息流顶部等。

分类:聚量自有的Banner广告为纯图片。

优量汇和穿山甲的Banner广告有文字链、图文、纯图片形式。

# 二. SDK嵌入

# 2.1 APP Store 隐私数据获取说明

以下用户数据由 iOS SDK收集,开发者在回答app Store Connect上的应用隐私问题时可以参考此图表。 访问https://developer.apple.com/app-store/app-privacy-details/ (opens new window)了解更多信息。

# 2.1.1 收集的数据类型

数据类型 SDK收集情况 备注
联系信息 Contact Info
姓名 Name
电子邮件地址 Email Address
电话号码 Phone Number
实际地址 Physical Address
其他用户联系信息 Other User Contact Info
不收集
健康与健身 Health and Fitness
健康 Health
健身 Fitness
不收集
财务信息 Financial Info
付款信息 Payment Info
信用信息 Credit Info
其他财务信息 Other Financial Info
不收集
位置 Location
精确位置 Precise Location
粗略位置 Coarse Location
可选收集
不收集
SDK会获取地理位置信息用于广告投放与反作弊。
应用被用户授予地理位置权限时,SDK会获取地理位置信息,用于广告定向与反作弊;
当应用不获取地理位置权限时,SDK不会主动获取地理位置权限及地理位置信息。
敏感信息 Sensitive Info 不收集
联系人 Contacts 不收集
用户内容 User Content
电子邮件或短信内容 Emails or Text Messages
照片或视频 Photos or Videos
音频数据 Audio Data
游戏内容 Gameplay Content
客户支持 Customer Support
其他用户内容 Other User Content
不收集
浏览历史记录 Browsing History 不收集
搜索历史记录 Search History 不收集
购买项目 Purchases
购物历史 Purchase History
不收集
使用数据 Usage Data
产品交互 Product Interaction
广告数据 Advertising Data
其他使用数据 Other Usage Data
不收集
收集
不收集
SDK广告将统计下列广告数据,以用于广告主统计投放结果.
展示 、点击 、转化
诊断 Diagnostics
崩溃数据 Crash Data
性能数据 Performance Data
其他诊断数据 Other Diagnostic Data
收集
收集
不收集
崩溃数据
SDK将收集SDK带来的崩溃信息,以此来优化代码缺陷
性能数据
SDK将收集SDK运行过程中性能数据,以优化SDK的性能。
其他数据 Other Data
其他数据类型 Other Data Types
收集 技术上我们还会收集一些设备信息(例如,设备型号、操作系统及版本、时区、网络类型等)

# 2.1.2数据使用目的

苹果明示了一系列的数据使用目的,需要开发者根据App中数据的使用情况进行披露。如下表所示,SDK依据自身功能,列举了数据的使用目的,以供参考。

基于媒体与SDK的合作目的,SDK收集数据的主要目的是用于“第三方广告”、“APP功能”(如流量变现的功能);

其他使用目的基于媒体自己的使用情况而定。

使用目的 基于接入SDK的功能,选择数据的使用目的
第三方广告
Third-Party Advertising
开发者广告或营销内容
Developer’s Advertising or Marketing
如您的App使用数据用于显示应用中的第一方广告(包括与第三方共享以显示广告)或其他营销目的,请选择
分析
Analytics
广告数据会用于分析,请选择
产品个性化
Product Personalization
如您的App将数据用于任何产品个性化功能,请选择

# 2.1.3 与用户身份的关联性

通过SDK收集的数据类型通常连接到诸如设备ID(如果可用)之类的标识符,或者与其他标识符(如配置时由客户发布的ID)相连。 因此,在询问数据是否链接到身份时,应用程序开发人员应选择 是。

# 2.1.4 关于用户追踪

根据苹果对追踪的定义,当应用被用户授予广告追踪权限时,SDK将获取IDFA用于广告归因与追踪。

# 2.2 嵌入广告SDK

YKAdSDK目录下有2个目录,一个是SDK目录YKAdSDK需要导入项目中;一个是依赖库文件夹SDKDepence,建议使用CocoaPods导入,可以减少一些工程配置时间。

1、 CocoaPods集成 (推荐)

pod 'SDWebImage','~>4.0.0'

pod 'GDTMobSDK','~>4.12.4'

pod 'Ads-CN','~>3.4.4.3'

  1. 手动集成SDKDepence文件夹

① 需在TARGET->Build Phases->Link Binary With Libraries中添加依赖库

libbz2.1.0.tbd

libz.tbd

② 需在TARGET->Build Settings->Other Linker Flags 配置

-ObjC -l"c++" -l"resolv"

注意事项:

App Tracking Transparency (ATT) 适用于请求用户授权,访问与应用相关的数据以跟踪用户或设备。 访问https://developer.apple.com/documentation/apptrackingtransparency (opens new window) 了解更多信息。 在苹果未要求开发者配置之前,不建议开发者配置ATT;

SKAdNetwork(SKAN) 是 Apple 的归因解决方案,可帮助广告客户在保持用户隐私的同时衡量广告活动。 使用 Apple 的 SKAdNetwork 后,即使 IDFA 不可用,广告网络也可以正确获得应用安装的归因结果。 访问 https://developer.apple.com/documentation/storekit/skadnetwork (opens new window) 了解更多信息。 为了广告转化的归因,所有开发者都必须设置SKAdNetwork

在info.plist中配置,以保证SKAdNetwork的正确运行

<key>SKAdNetworkItems</key>
  <array>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>238da6jt44.skadnetwork</string>
    </dict>
    <dict>
      <key>SKAdNetworkIdentifier</key>
      <string>22mmun2rn5.skadnetwork</string>
    </dict>
  </array>

支持苹果 ATT:从 iOS 14 开始,若开发者设置 App Tracking Transparency 向用户申请跟踪授权,在用户授权之前IDFA 将不可用。 如果用户拒绝此请求,应用获取到的 IDFA 将自动清零,可能会导致您的广告收入的降低

要获取 App Tracking Transparency 权限,在SDK V1.0.4+请更新您的 Info.plist,添加 NSUserTrackingUsageDescription 字段和自定义文案描述。代码示例:

<key>NSUserTrackingUsageDescription</key>
<string>此次授权可帮助我们了解你的兴趣,仅用于为你提供更精准的内容与服务。</string>

要向用户申请权限时,请调用 requestTrackingAuthorizationWithCompletionHandler:,我们建议您申请权限后再请求广告,以便获得SDK准确获得用户的授权。

#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)requestIDFA {
  [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    // Tracking authorization completed. Start loading ads here.
    // [self loadAd];
  }];
}

苹果公司在iOS9中升级了应用网络通信安全策略,默认推荐开发者使用HTTPS协议来进行网络通信,并限制HTTP协议的请求。为了避免出现无法拉取到广告的情况,我们推荐开发者在info.plist文件中增加如下配置来实现广告的网络访问:(信任HTTP请求)

# 三. 接入代码

# 3.1 SDK初始化配置

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
    YKAdSDKConfig *config = [YKAdSDKConfig new];
    config.app_key = @"your app_key";
    config.appName = @"your appName";
#ifdef DEBUG
    config.enableLog = true;//SDK内是否输出日志 default NO
#endif
    [YKAdSDKManager registAppWithConfig:config];
    return YES;
}

# 3.2 开屏广告

#import "YKAdSplashView.h"
- (void)viewDidLoad {
    [super viewDidLoad];
    //对象此时未被添加到父视图,需持有对象
    self.splashView = [YKAdSplashView initSplashViewWithADID
:@"开屏adid" showWindow:[UIApplication sharedApplication].keyWindow];
    self.splashView.delegate = self;
    [self.splashView loadAdData];
}
//开屏页加载成功后再调用展示接口
- (void)yk_loadSplashSuccess:(YKAdSplashView *)splash{
    [self.splashView showAdView];
}

# 3.3 插屏广告

#import "YKAdInterstitialView.h"
- (void)viewDidLoad {
    [super viewDidLoad];
    self.interstitialView = [YKAdInterstitialView initInterstitialViewWithADID:@"插屏adid" frame:CGRectMake
(插屏广告展示内容的frame) showVC:self];
    self.interstitialView.delegate = self;
    [self.interstitialView loadAdData];
}
//插屏页加载成功后再展示再调用展示接口,会从传入的showVC present到出新VC
- (void)yk_loadInterstitialSuccess:(YKAdInterstitialView *)interstitial{
    [self.interstitialView showAdView];
}

# 3.4 Banner广告

#import "YKAdBannerView.h"
- (void)viewDidLoad {
    [super viewDidLoad];
    self.bannerView = [YKAdBannerView initBannerViewWithADID
:@"banner adid" frame:CGRectMake(0, self.view.frame.size.height-height, self.view.frame.size.width, height) showVC:self];
    self.bannerView.delegate = self;
    //也可以在加载成功后再添加
    [self.view addSubview:self.bannerView];
    [self.bannerView loadAndShow];
}

# 四. 常见问题

  • 最大广告返回时长一般在多少?

聚量可根据媒体需求调整最大返回时长,一般在500ms以内,若媒体支持的最大返回时长较高,则有利于获得更高的广告填充率。

  • SDK是否有测试环境?

SDK没有测试环境,只有正式环境