서버 간: Android 클라이언트 설정 가이드

내부 미디에이션은 공개적으로 제공되지 않습니다.

현재 Audience Network를 사용한 내부 입찰은 비공개 베타이고 공개적으로 제공되지 않습니다. 변경 사항이 있을 경우 추가적인 업데이트를 제공하겠습니다.

또는 Facebook과 파트너를 맺은 미디에이션 플랫폼 중 하나를 통해 Audience Network Bidding에 액세스할 수 있습니다.

이 가이드에서는 Android 클라이언트 앱을 구축하는 방법을 설명합니다. 아래의 단계별 가이드에서는 전면 광고에서 경매 서버에 경매 요청을 전송하는 예시를 사용합니다. Audience Network 전면 광고에 대해 이미 잘 알고 있는지 확인하세요. 입찰은 네이티브, 배너, 전면, 인스트림 동영상 및 보상형 동영상 형식도 지원합니다. 전면 광고 형식 외에 광고 형식을 사용하면 서버 설정을 변경할 수 있습니다.

필수 조건

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가 입찰에 성공하면 광고를 읽어들입니다. 그렇지 않은 경우 경매 서버에서 수신한 오류 메시지를 표시합니다.