ÿÿ Hiển thị paywall theo mục tiêu AA khi khởi chạy lần đầu | Flutter SDK | Tài liệu Adapty

Hiển thị paywall theo mục tiêu AA khi khởi chạy lần đầu trong Flutter SDK

Attribution từ Apple Ads (AA) được nhận bất đồng bá»™ sau khi gá»i Adapty().activate(). Ở lần khởi chạy đầu tiên, dữ liệu này thưá»ng chưa có, vì vậy nếu bạn gá»i getPaywall ngay lập tức, Adapty sẽ xá»­ lý yêu cầu dá»±a trên đối tượng mặc định và những ngưá»i dùng Apple Ads sẽ không thấy paywall được nhắm mục tiêu theo AA. Thay vì hiển thị má»™t paywall rồi thay thế nó, hãy chá» má»™t chút để nhận attribution từ AA trước khi hiển thị bất cứ thứ gì: hiển thị paywall đúng đối tượng nếu attribution đến trong thá»i gian chá» ngắn, hoặc hiển thị paywall theo đối tượng mặc định nếu không. AdaptyProfile.appliedAttributionSources cho bạn biết khi nào attribution từ AA đã được áp dụng.

Trước khi bắt đầu

Bạn cần:

  • Adapty Flutter SDK 3.17.0 trở lên.
  • Apple Ads đã được cấu hình cho ứng dụng trong Adapty. Xem Apple Ads.

Cách hoạt động

Sau khi gá»i Adapty().activate(), SDK sẽ yêu cầu attribution từ Apple Ads ở chế độ ná»n và chuyển kết quả đó vá» backend cá»§a Adapty. Khi AA trở thành nguồn attribution Ä‘ang hoạt động cho hồ sÆ¡ ngưá»i dùng, SDK sẽ gá»­i má»™t AdaptyProfile đã được cập nhật đến listener didUpdateProfileStream cá»§a bạn, vá»›i AdaptyAttributionSource.appleAds trong danh sách appliedAttributionSources.

Ở lần chạy đầu tiên, bạn sẽ cần xá»­ lý hai trưá»ng hợp:

  1. Attribution đến trong thá»i gian chá» cá»§a bạn. Gá»i getPaywall — Adapty xá»­ lý yêu cầu dá»±a trên đối tượng Apple Ads và trả vá» paywall được nhắm mục tiêu.
  2. Thá»i gian chá» hết trước. Hiển thị paywall cho đối tượng mặc định thay thế, để ngưá»i dùng không có attribution Apple Ads không phải chỠđợi. getPaywallForDefaultAudience trả vá» paywall đó mà không cần chá» phân khúc.

appliedAttributionSources có thể rá»—ng. Äiá»u đó có nghÄ©a là:

  • Attribution Apple Ads chưa được xá»­ lý cho hồ sÆ¡ ngưá»i dùng này, hoặc
  • không có attribution nào đến cả. Dù thế nào, getPaywallForDefaultAudience vẫn an toàn để gá»i — nó trả vá» paywall cho đối tượng mặc định bất kể trạng thái hồ sÆ¡ ngưá»i dùng.

Việc chá» chỉ áp dụng cho lần khởi chạy đầu tiên. Sau khi attribution Apple Ads đã được ghi lại, nó sẽ được lưu trữ vÄ©nh viá»…n trên hồ sÆ¡ ngưá»i dùng. Ở má»i lần khởi chạy tiếp theo, hồ sÆ¡ ngưá»i dùng đã được cache sẵn AdaptyAttributionSource.appleAds trong appliedAttributionSources, nên đưá»ng dẫn attribution được xá»­ lý ngay lập tức và getPaywall trả vá» paywall được phân khúc theo Apple Ads mà không có bất kỳ độ trá»… nào.

Triển khai

Khi khởi chạy lần đầu, hãy chá» AdaptyAttributionSource.appleAds và áp dụng thá»i gian chá» tối Ä‘a — nếu attribution từ Apple Ads không bao giỠđến, những ngưá»i dùng đó vẫn cần được xem paywall.

  1. Kích hoạt SDK. Xem Cài đặt & cấu hình Flutter SDK.
  2. Äăng ký nhận cập nhật hồ sÆ¡ ngưá»i dùng vá»›i Adapty().didUpdateProfileStream.listen(…). Nếu bạn chưa thiết lập listener, xem Lắng nghe cập nhật gói đăng ký.
  3. Theo dõi AdaptyAttributionSource.appleAds trong appliedAttributionSources. Khi nó xuất hiện, tải paywall bằng getPaywall — Adapty sẽ trả vỠbiến thể được phân khúc theo AA:
final subscription = Adapty().didUpdateProfileStream.listen((profile) async {
  if (!profile.appliedAttributionSources.contains(AdaptyAttributionSource.appleAds)) return;
  final paywall = await Adapty().getPaywall(placementId: placementId);
  // present the segmented paywall, then cancel the subscription and the timer
});

didUpdateProfileStream là má»™t broadcast stream và không replay, vì vậy hãy kiểm tra hồ sÆ¡ ngưá»i dùng hiện tại má»™t lần bằng getProfile(). Khi khởi động lại ứng dụng, attribution đã được lưu trữ sẽ không phát lại sá»± kiện. 4. Bắt đầu đồng hồ đếm ngược 3–5 giây song song vá»›i gói đăng ký. Nếu đồng hồ kích hoạt trước khi AdaptyAttributionSource.appleAds xuất hiện, hãy tải paywall cho đối tượng mặc định bằng getPaywallForDefaultAudience. Hiển thị paywall nào được trả vá» trước và há»§y luồng còn lại để tránh tải paywall hai lần. Hãy cấu hình paywall dá»± phòng cho placement đó để ngưá»i dùng không bị kẹt nếu yêu cầu mạng thất bại.

Ví dụ đầy đủ

Cách triển khai dưới đây chạy Ä‘ua giữa attribution và má»™t khoảng timeout, tải trước paywall cho đối tượng mặc định song song, và trả vá» paywall phù hợp. Phía gá»i hàm chỉ cần await má»™t hàm duy nhất — không cần listener hay cá» trạng thái nào ở call site:

  • Nếu attribution vá» kịp trong timeout, hàm trả vá» paywall theo phân khúc thông qua getPaywall.
  • Nếu timeout hết trước, hàm trả vá» paywall đối tượng mặc định đã tải trước thông qua getPaywallForDefaultAudience.

/// Returns the Apple Ads-segmented paywall if attribution is applied within
/// [timeout], otherwise the default-audience paywall. Call after Adapty().activate().
Future<AdaptyPaywall> getPaywallOrDefault({
  required String placementId,
  required Duration timeout,
}) {
  // Prefetch the default-audience paywall right away so the timeout path resolves
  // without an extra network round-trip. `getPaywallForDefaultAudience` skips the
  // wait for segmentation data. `..ignore()` keeps an unused prefetch from surfacing
  // as an unhandled error; the error still reaches the caller if this paywall wins.
  final defaultPaywall =
      Adapty().getPaywallForDefaultAudience(placementId: placementId)..ignore();

  final completer = Completer<AdaptyPaywall>();
  late final StreamSubscription<AdaptyProfile> subscription;
  late final Timer timer;

  void resolve(Future<AdaptyPaywall> paywall) {
    if (completer.isCompleted) return;
    timer.cancel();
    subscription.cancel();
    completer.complete(paywall);
  }

  void onProfile(AdaptyProfile profile) {
    if (profile.appliedAttributionSources.contains(AdaptyAttributionSource.appleAds)) {
      resolve(Adapty().getPaywall(placementId: placementId));
    }
  }

  // Attribution path: react to profile updates as attribution is applied.
  subscription = Adapty().didUpdateProfileStream.listen(onProfile);

  // The stream is a broadcast stream and doesn't replay, so check the current
  // profile too — on relaunches attribution is already stored and won't re-emit.
  Adapty().getProfile().then(onProfile).ignore();

  // Timeout path: fall back to the prefetched default-audience paywall.
  timer = Timer(timeout, () => resolve(defaultPaywall));

  return completer.future;
}

Gá»i từ màn hình splash cá»§a bạn, sau đó hiển thị paywall khi promise được giải quyết:

try {
  final paywall = await getPaywallOrDefault(
    placementId: 'YOUR_PLACEMENT_ID',
    timeout: const Duration(seconds: 5),
  );
  // present the paywall
} on AdaptyError catch (adaptyError) {
  // handle the error or show a fallback paywall
} catch (e) {
  // handle the error
}

Äiá»u chỉnh timeout theo thá»i gian bạn muốn ngưá»i dùng chá» trước khi paywall xuất hiện. Hầu hết ngưá»i dùng không có attribution từ Apple Ads, nên há» sẽ chá» hết toàn bá»™ thá»i gian timeout — 3 đến 5 giây là mức cân bằng hợp lý. Attribution nếu có thưá»ng đến trong vài giây sau khi khởi động ứng dụng. Nếu ứng dụng cá»§a bạn đã lắng nghe didUpdateProfileStream cho các mục đích khác (ví dụ: kiểm tra trạng thái gói đăng ký), bạn không cần thay đổi gì. didUpdateProfileStream là má»™t broadcast stream, nên nó há»— trợ nhiá»u listener độc lập mà không ảnh hưởng đến nhau.

ÿÿÿÿ