الاتصالات من خادم إلى خادم: دليل إعداد عميل نظام Android

الخدمة الوسيطة الداخلية ليست متوفرة للعامة

عروض الأسعار الداخلية مع Audience Network متاحة حاليًا في الإصدار التجريبي المغلق وليست متوفرة للعامة. سنقدم المزيد من التحديثات إذا تغير هذا الأمر.

كبديل، يمكنك الوصول إلى عروض أسعار Audience Network من خلال إحدى منصات الخدمات الوسيطة التي تجمعنا معها شراكة.

يوضح هذا الدليل كيفية إنشاء تطبيق عميل نظام Android. في الدليل التفصيلي أدناه، سنستخدم مثالاً على إرسال طلب مزاد إلى خادم المزاد الخاص بك في إعلان خلالي. وتأكد من أنك بالفعل على دراية باستخدام الإعلانات الخلالية في Audience Network. تدعم عروض الأسعار أيضًا الإعلانات الأصلية وإعلانات البانر والإعلانات الخلالية ومقاطع الفيديو المضمّنة في المحتوى وتنسيقات الفيديو بمكافأة. عند استخدام تنسيقات إعلانات بخلاف التنسيق الخلالي، يمكنك تغيير إعدادات الخادم لديك.

خطوات إعداد جهة العميل في نظام Android

الخطوة الأولى: إجراء طلب مزاد من عميل نظام Android

الخطوة الثانية: تحميل الإعلان من استجابة عرض الأسعار في عميل نظام Android

خطوات إعداد جهة العميل في نظام Android

الخطوة الأولى: إجراء طلب مزاد من عميل نظام 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);
            }
        }
    });
}

الخطوة الثانية: تحميل الإعلان من استجابة عرض الأسعار في عميل نظام 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 بعرض الأسعار أو عرض رسالة الخطأ التي تم تلقيها من خادم المزاد.