Собственная агрегация не является общедоступной
Собственный биддинг в Audience Network сейчас проходит закрытое бета-тестирование и не является общедоступным. Мы будем держать вас в курсе всех изменений.
В качестве альтернативы вы можете получить доступ к биддингу в Audience Network через одну из платформ агрегации, с которыми мы сотрудничаем.
В этом руководстве описывается, как создать клиентское приложение для Android. В нем используется пример отправки запроса на аукцион на ваш сервер аукциона для межстраничной рекламы. Вы должны уметь работать с межстраничной рекламой Audience Network. Биддинг также поддерживает нативную, баннерную и межстраничную рекламу, видеорекламу In-Stream и видео с вознаграждением. Для любых форматов рекламы, кроме межстраничной, настройки сервера можно изменить.
На стороне клиента необходимо собрать нужные параметры для запроса на аукцион и отправить их на сервер аукциона в запросе 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); } } }); }
После получения отклика на запрос 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 выиграет аукцион, в приложении загрузится объявление. В противном случае будет показано сообщение об ошибке, полученное с сервера аукциона.