‹ SdkboxAds Doc Home

SdkboxAds 集成指南

For the C++ version of cocos2d-x v3.x - (all other versions)

集成

在您确保正确安装了 SDKBOX installer 的情况下,运行下面的命令来集成 SDKBOX SdkboxAds 插件。

$ sdkbox import sdkboxads

JSON 配置

SDKBOX Installer 将会自动在您的 sdkbox_config.json 中插入一份配置样例。请修改这份配置样例,使其能用于您自己的 app 。

这里有一个 SdkboxAds 配置的例子:

    "SdkboxAds": {
        "units": [
                "AdColony",
                "Fyber",
                "Chartboost",
                "Vungle"
            ],
        "placements": [
            {
                "id" : "placement-1",
                "strategy" : "round-robin",
                "units" : [
                    {
                      "unit": "AdColony",
                      "name": "video"
                    },
                    {
                      "unit": "Chartboost",
                      "name": "Default"
                    }
                ]
            },
            {
                "id" : "placement-2",
                "strategy" : "round-robin",
                "units" : [
                    {
                      "unit": "Vungle",
                      "name": "reward"
                    },
                    {
                      "unit": "AdColony",
                      "name": "v4vc"
                    },
                    {
                      "unit": "Chartboost",
                      "name": "Next Level"
                    }
                ]
            }
        ]
    }

使用

初始化 SdkboxAds

在您的代码的合适的位置初始化这个插件,我们建议您在 AppDelegate:applicationDidFinishLaunching() 或者 AppController:didFinishLaunchingWithOptions() 中进行初始化。并确保您的代码中包含了正确的头文件。举例如下:

#include "PluginSdkboxAds/PluginSdkboxAds.h"
AppDelegate::applicationDidFinishLaunching()
{
     sdkbox::PluginSdkboxAds::init();
}

使用 SdkboxAds

配置

SdkboxAds 是一个提供调控广告显示服务的插件。这意味着它将在运行时管理一堆在预先定义好的 AdUnit 。 它的配置分为两个部分:配置 AdUnits 以及 配置 Placement 。每一个 AdUnit 都是对一个Sdkbox 广告插件的映射。 举例如下:

    "SdkboxAds": {
        "units": [
            "AdColony",
            "Fyber",
            "Chartboost",
            "Vungle"
        ]
    }

Placement 则设定了对于某一个给定的 AdUnit 将会被显示的广告类型。一个完整的 SdkboxAds 配置文件的例子如下所示:

    "SdkboxAds": {
        "units": [
                "AdColony",
                "Fyber",
                "Chartboost",
                "Vungle"
            ],
        "placements": [
            {
                "id" : "placement-1",
                "strategy" : "round-robin",
                "units" : [
                    {
                      "unit": "AdColony",
                      "name": "video"
                    },
                    {
                      "unit": "Chartboost",
                      "name": "Default"
                    }
                ]
            },
            {
                "id" : "placement-2",
                "strategy" : "round-robin",
                "units" : [
                    {
                      "unit": "Vungle",
                      "name": "reward"
                    },
                    {
                      "unit": "AdColony",
                      "name": "v4vc"
                    },
                    {
                      "unit": "Chartboost",
                      "name": "Next Level"
                    }
                ]
            }
        ]
    }

使用

调用 sdkbox::PluginSdkboxAds::init() 将完成 SdkboxAds 实例化并且开始管理所有的定义在配置文件里的 AdUnit 。

请求显示一个在默认的 AdUnit 中的默认广告,并以此完成一次简单的集成测试:

sdkbox::PluginSdkboxAds::playAd()

请求显示默认 AdUnit 中的广告:

sdkbox::PluginSdkboxAds::playAd( const std::string& zone_place_location );
sdkbox::PluginSdkboxAds::playAd( const std::string& zone_place_location, const AdUnitParams& params );

// AdUnitParams is a typedef for std::map<std::string,std::string>

提示:每一个 AdUnit 都有自己的参数,可以参考每一个插件的文档。

请求显示一个指定的 AdUnit 中的广告:

sdkbox::PluginSdkboxAds::playAd(
        const std::string& ad_unit_name,
        const std::string& zone_place_location );

sdkbox::PluginSdkboxAds::playAd(
        const std::string& ad_unit_name,
        const std::string& zone_place_location,
        const AdUnitParams& params );

请求显示定义在 sdkbox_config.json 的 Placement 中的广告:

sdkbox::PluginSdkboxAds::placement( const str::string& placement );

更好的控制广告数据缓冲:

sdkbox::PluginSdkboxAds::cacheControl(
        const std::string& ad_unit,
        const std::map<std::string, std::string>& cacheOpts );

缓冲的选项是由 AdUnit 指定的, 请参考每个插件的相关文档。

SdkboxAds 事件

这个插件允许您捕捉事件。

#include "PluginSdkboxAds/PluginSdkboxAds.h"
class MyClass : public sdkbox::SdkboxAdsListener
{
private:
    void onAdAction(
            const std::string& ad_unit_id,
            const std::string& zone_location_place_you_name_it,
            sdkbox::AdActionType action_type);

    void onRewardAction(
            const std::string& ad_unit_id,
            const std::string& zone_id,
            float reward_amount,
            bool reward_succeed);

};

sdkbox::AdActionType 是一个枚举类型, 定义如下:

    enum AdActionType {

        LOADED=0,               // content loaded
        LOAD_FAILED,            // content failed to load

        CLICKED,                // clicked on content

        REWARD_STARTED,     // reward started
        REWARD_ENDED,           // reward achieved
        REWARD_CANCELED,        // reward aborted

        AD_STARTED,             // start showing.
        AD_CANCELED,            // start showing.
        AD_ENDED,               // content shown

        ADACTIONTYPE_UNKNOWN    // mostly on error situations.

    };

sdkbox::PluginSdkboxAds::setListener( new MyClass() );

API Reference

Methods

static void init ( ) ;

initialize the plugin instance.

static void setListener ( SdkboxAdsListener * listener ) ;

Set listener to listen for SdkboxAds events

static void playAd()

Each unit knows how to play an ad by default. So this method will play a default Ad for the default AdUnit.

static void playAd(const std::string& );

Play an identified by name on the Default AdUnit

static void playAd(const std::string&, const AdUnitParams& params );

Eventually, an AdUnit may need some extra hints to play an ad, like position on screen, transparency, etc. Each AdUnit will document what extra hints can be passed to play an Ad. Currently none of the AdUnits need this parameter.

static void playAd(
        const std::string& ad_unit, 
        const std::string& zone_place_location );

Play an ad name, for a given AdUnit. AdUnits are idenfitied by name. So a valid example call would be: sdkbox::SdkboxAds::playAd(“AdColony”, “video”);.

static void playAd(
        const std::string& ad_unit, 
        const std::string& zone_place_location, 
        const AdUnitParams& params );

Again, should an AdUnit need extra parameters, use this method. If you pass values to an AdUnit that does need need, they will simply be ignored.

static void placement(const std::string& placement);

When you want to invoke a placement, just call this method. If the placement does not exist, the call will just be ignored. A placement will take care of AdUnit’s cache control, so if the current AdUnit has no cached content, or the AdUnit fails to load an ad, the next adUnit will be used.

static void cacheControl( 
        const std::string& ad_unit, 
        const std::map<std::string, std::string>& cacheOpts );

Some Ad units expose fine-grained cache control. For example Chartboost offers specific cache control for each location, as well as general Ads cache control. This method interfaces with the AdUnit’s cache mechanism. If no cache control is exposed for a given AdUnit, the call will silently be ignored. Each AdUnit will document what valid values to pass to the cacheOpts parameter. E.g. for Chartboost, these are valid values:

"Default": true, // a configuration location "Level Complete": true, // a configuration location "ADS": true // a general placeholder chartboost specific

Listeners

void onAdAction( 
        const std::string& ad_unit_id, 
        const std::string& zone_location_place_you_name_it, 
        sdkbox::AdActionType action_type);

This method notifies back with the AdUnit identifier, the Ad name it tried to play, and an enum type of the action it is communicating about. The Action type is the following enum:

    enum AdActionType {

        LOADED=0,               // content loaded
        LOAD_FAILED,            // content failed to load

        CLICKED,                // clicked on content

        REWARD_STARTED,     // reward started
        REWARD_ENDED,           // reward achieved
        REWARD_CANCELED,        // reward aborted

        AD_STARTED,             // start showing.
        AD_CANCELED,            // start showing.
        AD_ENDED,               // content shown

        ADACTIONTYPE_UNKNOWN    // mostly on error situations.

    };

Not all AdUnits will expose all types of events. For example, Chartboost notifies CLICKED action, but AdColony does not. Each AdUnit’s documentation will reflect what events will notify.

void onRewardAction( 
        const std::string& ad_unit_id, 
        const std::string& zone_id, 
        float reward_amount, 
        bool reward_succeed);

手动集成

如果 SDKBOX 安装器 安装插件失败了,那么需要手动集成插件.如果安装器安装插件成功了,那么不需要,也没必要,按文档再手动集成一次.

下面列出的的步骤一般很少用到.如果你按下面的步骤完成了集成,请在完成集成后,再按步骤检查一次.

iOS 平台手动集成

拖拽下列 framework 从 SdkboxAds 插件包的 plugins/ios 目录到您的 Xcode 工程中,在添加 frameworks 的时候,请勾选 Copy items if needed

sdkbox.framework

PluginSdkboxAds.framework

如果您没有添加下面这些系统库,您有需要添加它们:

Security.framework

AdSupport.framework

另外,每一个 AdUnit 需要的 所有的 库文件都需要被添加。

Android 手动集成

SDKBox 支持三种 Android 工程, command-line, eclipseAndroid Studio.

拷贝文件

从插件安装包中的 plugin/android/libs 目录拷贝下列 jar 文件到您的工程的 proj.android/libs 目录。

PluginSdkboxAds.jar

sdkbox.jar

plugin/android/libs 目录下拷贝 sdkboxads_lib 目录到您的 proj.android/libs/ 目录下。

拷贝 jni 库

plugin/android/jni/ 拷贝并覆盖 <your_project_root>/jni/ 目录.

编辑 AndroidManifest.xml

在标签 application tag 上添加下列权限:

  <uses-permission android:name="android.permission.INTERNET" />

编辑 Android.mk

编辑 proj.android/jni/Android.mk

LOCAL_WHOLE_STATIC_LIBRARIES 添加额外的库:

LOCAL_WHOLE_STATIC_LIBRARIES += PluginSdkboxAds
LOCAL_WHOLE_STATIC_LIBRARIES += sdkbox

在所有 import-module 语句之前添加一条 call 语句:

$(call import-add-path,$(LOCAL_PATH))

在最后添加额外的 import-module 语句:

$(call import-module, ./sdkbox)
$(call import-module, ./pluginsdkboxads)

这意味着您的语句顺序看起来像是这样:

$(call import-add-path,$(LOCAL_PATH))
$(call import-module, ./sdkbox)
$(call import-module, ./pluginsdkboxads)

Note: 如果您使用的是 cocos2d-x 预编译库,那么保证这些语句在已有的 $(call import-module,./prebuilt-mk) 语句之上非常重要。

编辑 Application.mk (只限 Cocos2d-x v3.0 到 v3.2 版本)

编辑 proj.android/jni/Application.mk 保证 APP_STL 的定义正确。如果 Application.mk 包含了 APP_STL := c++_static 语句,那么这条语句应该被改为:

APP_STL := gnustl_static

重要事项

对于每一个 AdUnit 您必须添加以下文件:

JNI : 每一个 AdUnit 的 JNI 库文件。

Manifest: 每一个 AdUnit 插件的所有 Manifest 文件的改动。

jar: Jar文件对于被包含的 AdUnit 来说是必须的。基本所有的在插件 lib 目录下的 jar 文件都需要。

为项 LOCAL_WHOLE_STATIC_LIBRARIES 针对每一个 Adunit 添加库, 比如:

LOCAL_WHOLE_STATIC_LIBRARIES += pluginvungle
LOCAL_WHOLE_STATIC_LIBRARIES += pluginadcolony

为每一个 AdUnit 添加 Android.mk 中的 import-module 项,比如:

$(call import-module, ./pluginadcolony)
$(call import-module, ./pluginvungle)

修改 AppActivity.java

插件版本 >= 2.4.0.3

  1. 找到 AppActivity.java 文件
find . -name "AppActivity.java"
  1. extends Cocos2dxActivity 替换为 extends com.sdkbox.plugin.SDKBoxActivity

以下是 AppActivity.java 不同版本的引擎所在的目录:

cpp
  - proj.android/src/org/cocos2dx/cpp/AppActivity.java
  - proj.android-studio/app/src/org/cocos2dx/cpp/AppActivity.java
  - proj.android/app/src/org/cocos2dx/cpp/AppActivity.java ( from cocos2d-x 3.17)

lua
  - frameworks/runtime-src/proj.android/src/org/cocos2dx/lua/AppActivity.java
  - frameworks/runtime-src/proj.android-studio/app/src/org/cocos2dx/lua/AppActivity.java
  - frameworks/runtime-src/proj.android/app/src/org/cocos2dx/lua/AppActivity.java (from cocos2d-x 3.17)

js
  - frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java
  - frameworks/runtime-src/proj.android/app/src/org/cocos2dx/javascript/AppActivity.java ( from cocos2d-x 3.17)

插件版本 < 2.4.0.3

Note: 当你使用 cocos2d-x 源代码时,不同的版本中 Cocos2dxActivity.java 文件的位置也不同。一个确定该文件位置的方法是查看 proj.android/project.properties 。比如:

android.library.reference.1=../../cocos2d-x/cocos/platform/android/java

在这个例子中, Cocos2dxActivity.java 文件应该在如下位置:

../../cocos2d-x/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java
import android.content.Intent;
import com.sdkbox.plugin.SDKBox;
onLoadNativeLibraries();
SDKBox.init(this);
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          if(!SDKBox.onActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
          }
    }
    @Override
    protected void onStart() {
          super.onStart();
          SDKBox.onStart();
    }
    @Override
    protected void onStop() {
          super.onStop();
          SDKBox.onStop();
    }
    @Override
    protected void onResume() {
          super.onResume();
          SDKBox.onResume();
    }
    @Override
    protected void onPause() {
          super.onPause();
          SDKBox.onPause();
    }
    @Override
    public void onBackPressed() {
          if(!SDKBox.onBackPressed()) {
            super.onBackPressed();
          }
    }

使用 Proguard (release模式下可选)

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

Note: Proguard 只能工作在 Release 模式下 (比如: cocos run -m release) debug 模式下不会触发 Proguard 。