Конфигурация "сервер-сервер": руководство по настройке клиента для Android

Собственная агрегация не является общедоступной

Собственный биддинг в Audience Network сейчас проходит закрытое бета-тестирование и не является общедоступным. Мы будем держать вас в курсе всех изменений.

В качестве альтернативы вы можете получить доступ к биддингу в Audience Network через одну из платформ агрегации, с которыми мы сотрудничаем.

В этом руководстве описывается, как создать клиентское приложение для Android. В нем используется пример отправки запроса на аукцион на ваш сервер аукциона для межстраничной рекламы. Вы должны уметь работать с межстраничной рекламой Audience Network. Биддинг также поддерживает нативную, баннерную и межстраничную рекламу, видеорекламу In-Stream и видео с вознаграждением. Для любых форматов рекламы, кроме межстраничной, настройки сервера можно изменить.

Пошаговые инструкции по настройке клиента для Android

Шаг 1. Выполнение запроса на аукцион из клиента для Android

Шаг 2. Загрузка объявления, указанного в отклике на ставку, в клиенте для Android

Пошаговые инструкции по настройке клиента для Android

Шаг 1. Выполнение запроса на аукцион из клиента для Android

На стороне клиента необходимо собрать нужные параметры для запроса на аукцион и отправить их на сервер аукциона в запросе HTTP. Вот пример создания запроса на аукцион в Android для указанного формата:

private static JSONObject getRequest(
        Context context,
        String appId,
        String placementId,
        String idfa,
        int coppa,
        int dnt
) throws JSONException {
    JSONObject requestObject = new JSONObject();
    requestObject.put("app_id", appId);
    requestObject.put("placement_id", placementId);

    requestObject.put("bundle", BuildConfig.APPLICATION_ID);
    requestObject.put("bundle_version", BuildConfig.VERSION_NAME);

    requestObject.put("ifa", idfa);

    // coppa and do not track flags
    requestObject.put("coppa", coppa);
    requestObject.put("dnt", dnt);

    requestObject.put(
            "buyer_tokens",
            (new JSONObject())
                    .put("audience_network", getAudienceNetworkBidderToken(context))
    );

    requestObject.put("test", Settings.isTestMode() ? 1 : 0);

    return requestObject;
}

Вот пример кода статической функции, которая отправляет запрос на аукцион на сервер и вызывает методы обработки обратных вызовов, используя ответ сервера:

public static void makeRequest(
        final Context context,
        final int coppa,
        final String appId,
        final String placementId,
        final AuctionRequestCallback callback
) {
    getThreadPoolExecutor().submit(new Runnable() {
        @Override
        public void run() {
            try {
                // Retrieve idfa and limit ad tracking settings
                NonProductionIDFAUtils.AdIdInfo adInfo = NonProductionIDFAUtils.getAdIdInfo(context);

                final JSONObject request = getRequest(
                        context,
                        appId,
                        placementId,
                        adInfo.idfa,
                        coppa,
                        adInfo.dnt);

                if (Settings.getServerAddress() == null) {
                    throw new android.provider.Settings.SettingNotFoundException(
                            "Server address settings not found");
                }
                final URL url = new URL(Settings.getServerAddress());

                JsonObjectRequest jsObjRequest = new JsonObjectRequest(
                        Request.Method.POST,
                        Settings.getServerAddress(),
                        request,
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
                                try {
                                    Log.d("response", response.toString());

                                    String placementId = response.getString("placement_id");
                                    String adFormat = response.getString("ad_format");

                                    String platformName = response.getString("platform_name");
                                    String platformPlacementId = response.getString(
                                            "platform_placement_id");
                                    String payload = response.getString("bid_payload");

                                    callback.onSuccess(
                                            placementId,
                                            adFormat,
                                            platformName,
                                            platformPlacementId,
                                            payload);

                                } catch (JSONException e) {
                                    callback.onError(e);
                                }
                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                if (error.networkResponse == null) {
                                    callback.onError(new Exception("Server response empty!"));
                                } else {
                                    if(error.networkResponse.data != null) {
                                        callback.onError(new VolleyError(
                                                error.networkResponse.statusCode
                                                        + " " +
                                                        new String(error.networkResponse.data)));
                                    } else {
                                        callback.onError(new VolleyError("" +
                                                error.networkResponse.statusCode));
                                    }
                                }
                            }
                        }
                );

                getRequestQueue(context).add(jsObjRequest);

            } catch (Exception e) {
                // Other errors
                Log.e("error", e.toString());
                callback.onError(e);
            }
        }
    });
}

Шаг 2. Загрузка объявления, указанного в отклике на ставку, в клиенте для Android

После получения отклика на запрос HTTP в клиентском приложении вызываются указанные выше методы обратного вызова. Используя параметры в отклике, можно определить, какая платформа выиграла аукцион, и загрузить объявление. Если аукцион завершился успешно и платформа Audience Network выиграла его, в параметрах ответа будет строка с полезными данными, с помощью которых можно загрузить объявление. Мы можем вызвать метод loadAd(...) для правильного класса формата рекламы и включить строку полезной нагрузки в качестве ставки в `LoadAdConfig для загрузки рекламы. Вот реализованные методы обратного вызова для запроса на аукцион:

// AuctionRequestCallback
public void onSuccess(
        String placementId,
        String adFormat,
        String platformName,
        String platformPlacementId,
        String payload) {

    if (platformName.contentEquals(PLATFORM_AUDIENCE_NETWORK)) {
        if (adFormat.contentEquals(INTERSTITIAL)) {
            statusLabel.setText(R.string.loading_ad);

            interstitialAd = new InterstitialAd(MainActivity.this, platformPlacementId);
            interstitialAd.loadAd(
                    interstitialAd.buildLoadAdConfig()
                            .withAdListener(MainActivity.this)
                            .withBid(payload)
                            .build());
        }
    }
}

public void onError(Exception e) {
    Log.e(TAG, e.getMessage());
    statusLabel.setText(e.getMessage());
}

Если ставка Audience Network выиграет аукцион, в приложении загрузится объявление. В противном случае будет показано сообщение об ошибке, полученное с сервера аукциона.