آفرینگ، placement و نمایش پکیج

دریافت آفرینگ جاری، انتخاب با placement یا شناسه، تفاوت current و default و رفرش محدود اتریبیوت و آفرینگ.

پس از پیکربندی و هویت، انتخاب پیشنهاد را به SDK بسپارید. اولین عضو لیست لزوماً پیشنهاد مناسب مشتری نیست.

سه حالت انتخاب

نیازورودیرفتار
پیشنهاد جاری مشتریبدون placementcurrent انتخاب‌شده؛ در نبود آن default
محل نمایش مثل upgradeplacementIdentifier: 'upgrade'انتخاب placement و fallback جاری/default
یک آفرینگ مشخصgetOffering('special_offer')جست‌وجوی دقیق؛ نبود آن null است، نه جایگزینی

placement شناسه محل نمایش است؛ offeringIdentifier شناسه پیشنهاد است. Current می‌تواند به‌دلیل targeting با پیش‌فرض پروژه فرق کند. در موبایل انتخاب از پاسخ سرور است؛ در وب resolver خود فراهم‌کننده قواعد و fallback وب را اعمال می‌کند.

Flutter

import 'package:inappify_sdk/inappify_sdk.dart';

Future<Map<String, Object?>> offeringAlternatives() async {
  final catalog = await InappifySdk.getOfferingsResult();
  final current = await InappifySdk.getCurrentOfferingResult();
  final upgrade = await InappifySdk.getCurrentOfferingResult(
    placementIdentifier: 'upgrade',
  );
  final special = await InappifySdk.getOfferingResult('special_offer');
  if (!upgrade.isSuccess) return {}; // Show a retry state.
  final selected = upgrade.data;
  if (selected == null) return {}; // No offering selected.
  final packages = selected.packages ?? [];
  // Render packages; retain the actual PackageModel for purchase.
  // Helpers on a collection already obtained, without another HTTP call:
  return {
    'current': current.data, 'special': special.data, 'packages': packages,
    'cachedCurrent': catalog.data?.current,
    'cachedExact': catalog.data?.getOffering('special_offer'),
    'cachedPlacement': catalog.data?.getCurrentOfferingForPlacement('upgrade'),
  };
}

متدهای ساده getOfferings()، getCurrentOffering(placementIdentifier: ...) و getOffering(id) مدل nullable می‌دهند. وجود نتیجه Success با data برابر null برای جست‌وجوی آفرینگ، خطای شبکه نیست.

Kotlin

import com.inappify.sdk.*

suspend fun offeringAlternatives(client: InappifyV2Client) {
    val catalog = client.getOfferings()
    val current = client.getCurrentOffering()
    val upgrade = client.getCurrentOffering("upgrade")
    val special = client.getOffering("special_offer")
    if (upgrade is InappifyResult.Success) {
        val selected = upgrade.data ?: return
        val packages = selected.availablePackages
        // Render packages; retain the actual InappifyPackage.
    }
    if (catalog is InappifyResult.Success) {
        val selected = catalog.data.current
        val exact = catalog.data.getOffering("special_offer")
        val placed = catalog.data.getCurrentOfferingForPlacement("upgrade")
    }
}

helperهای روی مجموعه شبکه نمی‌فرستند. all در Kotlin/Flutter یک map از شناسه به آفرینگ است. پکیج کامل را برای خرید نگه دارید؛ آن را از نام یا قیمت بازسازی نکنید.

JavaScript

import type { InAppify } from '@inappifylabs/web-sdk';

export async function offeringAlternatives(client: InAppify) {
  const catalog = await client.getOfferings();
  const current = await client.getCurrentOffering();
  const upgrade = await client.getCurrentOffering('upgrade');
  const exact = await client.getOffering('special_offer');
  return {
    current,
    upgrade,
    exact,
    cachedExact: catalog.getOffering('special_offer'),
    cachedPlacement: catalog.getCurrentOfferingForPlacement('upgrade'),
  };
}

catalog.all در JS آرایه است. حالت object قدیمی getCurrentOffering({placementIdentifier: 'upgrade'}) برای سازگاری باقی است؛ در کد جدید فرم ساده بالا کافی است.

رفرش دستی

در Kotlin و Flutter موبایل، syncAttributesAndOfferingsIfNeeded() را await کنید و از مجموعه برگشتی انتخاب کنید. متد صف ویژگی‌ها را پیش از آفرینگ تازه همگام می‌کند و با صف خالی نیز در سهمیه، آفرینگ تازه می‌گیرد. مثال کامل در ویژگی‌ها است.

سقف هر client ۵ اجرای پذیرفته‌شده در ۶۰ ثانیه شناور است؛ شکست پذیرفته‌شده نیز حساب می‌شود و تغییر حساب سهمیه را صفر نمی‌کند. بالاتر از سقف، شبکه اجرا نمی‌شود: کش همان نشست برمی‌گردد یا RATE_LIMITED_NO_CACHE و زمان انتظار در جزئیات خطا. SDK را برای دورزدن محدودیت دوباره نسازید.

خواندن عادی از کش استفاده می‌کند. روی Android، رفرش خودکار آفرینگ در foreground با پنجره پنج دقیقه و فاصله خطای سی ثانیه انجام می‌شود؛ این زمان‌بندی از سهمیه رفرش دستی مستقل است. در شروع اپ نیازی به پیش‌گرم‌کردن جداگانه نیست.

نبود پیشنهاد یا محصول

نام placement و شناسه آفرینگ، عضویت محصول/پکیج، کلید همان اپ، SKU فروشگاه و شرایط targeting را بررسی کنید. شکست دریافت را از مجموعه موفق خالی جدا کنید. پکیج ساختگی یا جایگزینی مخفی آفرینگ صریح، راه‌حل نبود پیشنهاد نیست.

خرید پکیج · تخفیف آفرینگ انتخاب‌شده