Lấy flows & paywalls - Android

Nội dung mà getFlow trả về
✦
Flow Được tạo trong Flow & Paywall Builder — render nguyên bản trên thiết bị, không cần WebView
✦
Paywall của Paywall Builder cũ Toàn bộ nội dung được tạo trong Paywall Builder cũ

Sau khi bạn đã thiết kế flow của mình, bạn có thể hiển thị nó trong ứng dụng di động. Bước đầu tiên là lấy flow hoặc paywall được liên kết với placement cùng cấu hình view của nó như mô tả bên dưới.

Tip

Bạn muốn xem ví dụ thực tế về cách tích hợp Adapty SDK vào ứng dụng di động? Hãy xem ứng dụng mẫu của chúng tôi, minh họa toàn bộ quá trình thiết lập, bao gồm hiển thị paywall, thực hiện mua hàng và các chức năng cơ bản khác.

Trước khi bắt đầu

Bạn cần có:

Lấy flow/paywall

Nếu bạn đã thiết kế một flow hoặc paywall trong builder, bạn không cần lo lắng về việc render nó trong code ứng dụng di động để hiển thị cho người dùng. Flow hoặc paywall như vậy đã bao gồm cả nội dung hiển thị lẫn cách hiển thị. Tuy nhiên, bạn vẫn cần lấy ID của nó thông qua placement, cấu hình view, rồi mới trình bày nó trong ứng dụng di động.

Để đảm bảo hiệu suất tối ưu, điều quan trọng là phải lấy flow hoặc paywall và cấu hình view của nó càng sớm càng tốt, để có đủ thời gian tải hình ảnh trước khi hiển thị cho người dùng.

Tip

Để làm ấm nhiều placement cùng lúc, hãy gọi preloadFlows (Android SDK 4.1+). Phương thức này chỉ cache JSON của placement, vì vậy bạn vẫn cần lấy cấu hình view để có layout và hình ảnh.

Để lấy một flow hoặc paywall, sử dụng phương thức getFlow:

The input is empty — there is no content to translate.

Tham sốBắt buộcMô tả
placementIdbắt buộcMã định danh của Placement mong muốn. Đây là giá trị bạn đã chỉ định khi tạo placement trong Adapty Dashboard.
fetchPolicymặc định: AdaptyPlacementFetchPolicy.Default

fetchPolicy xác định SDK sẽ đọc từ lớp nào trước, chứ không phải có được dùng cache hay không. Theo mặc định, SDK sẽ gọi lên server trước và trả về dữ liệu đã cache nếu yêu cầu đó thất bại. Chúng tôi khuyến nghị tùy chọn này vì nó đảm bảo người dùng luôn nhận được dữ liệu mới nhất.

Tuy nhiên, nếu bạn cho rằng người dùng của mình thường xuyên gặp sự cố về kết nối mạng, hãy cân nhắc dùng AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad — tùy chọn này đảo ngược thứ tự đó: đọc cache trước và chỉ gọi lên server khi không có dữ liệu nào trong cache. Người dùng có thể không nhận được dữ liệu mới nhất tuyệt đối, nhưng thời gian tải sẽ nhanh hơn, bất kể kết nối mạng có ổn định hay không. Cache được cập nhật thường xuyên, vì vậy hoàn toàn an toàn khi sử dụng trong phiên để tránh các yêu cầu mạng không cần thiết.

Chính sách thứ ba, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), nằm giữa hai tùy chọn trên: đọc cache trước khi bản cache còn trẻ hơn maxAgeMillis, và gọi lên server khi bản cache đã cũ hơn giá trị đó.

Lưu ý rằng cache vẫn được giữ nguyên sau khi khởi động lại ứng dụng và chỉ bị xóa khi ứng dụng được cài đặt lại hoặc thông qua thao tác dọn dẹp thủ công.

Adapty SDK lưu trữ các flow và paywall cục bộ theo hai lớp: cache được cập nhật thường xuyên như mô tả ở trên và paywall dự phòng. Chúng tôi cũng sử dụng CDN để tải chúng nhanh hơn và một server dự phòng độc lập trong trường hợp CDN không thể truy cập. Hệ thống này được thiết kế để đảm bảo bạn luôn nhận được phiên bản mới nhất trong khi vẫn đảm bảo độ tin cậy ngay cả khi kết nối mạng hạn chế.

loadTimeoutmặc định: 5 giây

Giá trị này giới hạn thời gian chờ cho phương thức này. Nếu hết thời gian chờ, dữ liệu đã cache hoặc dữ liệu dự phòng cục bộ sẽ được trả về.

Lưu ý rằng trong một số trường hợp hiếm gặp, phương thức này có thể hết thời gian chờ muộn hơn một chút so với giá trị đã chỉ định trong loadTimeout, do thao tác có thể bao gồm nhiều yêu cầu khác nhau bên dưới.

Đối với Android: Bạn có thể tạo TimeInterval bằng các extension function (ví dụ: 5.seconds, trong đó .seconds được lấy từ import com.adapty.utils.seconds), hoặc TimeInterval.seconds(5). Để không giới hạn thời gian, dùng TimeInterval.INFINITE.

Tham số phản hồi:

Tham sốMô tả
FlowMột đối tượng AdaptyFlow chứa placement, các định danh (id, variationId), tên biến thể (variationName, tùy chọn, SDK 4.2+), tên, các biến thể paywall của nó (paywalls), remote configs, và cờ hasViewConfiguration cho biết flow có bao gồm cấu hình giao diện hay không. Để lấy sản phẩm thực tế cho việc tải trước, giao diện tùy chỉnh, hoặc kiểm tra theo chương trình, hãy gọi getPaywallProducts(flow).

Lấy cấu hình giao diện

Sau khi tải flow hoặc paywall, hãy kiểm tra xem nó có chứa cấu hình giao diện hay không thông qua flow.hasViewConfiguration. Cờ này cho biết placement được thiết kế theo cách nào trong Adapty Dashboard:

  • true — placement được thiết kế trong Flow & Paywall Builder (một flow) hoặc old Paywall Builder (một paywall). Adapty tự render giao diện cho bạn. Tiếp tục với các bước bên dưới để lấy cấu hình view và hiển thị flow hoặc paywall.
  • false — placement là một paywall tùy chỉnh không có Builder UI. Xử lý như một Remote Config paywall.
Important

Đảm bảo rằng bạn đã xuất bản flow. Một flow có chỉnh sửa chưa được xuất bản sẽ có trạng thái Dirty, và placement của nó vẫn tiếp tục hiển thị phiên bản đã xuất bản lần cuối.

Note

Nếu bạn đang sử dụng nhiều ngôn ngữ, hãy tìm hiểu cách thêm bản địa hóa trong Builder và cách sử dụng mã ngôn ngữ đúng cách tại đây.

Sau khi tải xong, hiển thị flow hoặc paywall.

Lấy flow hoặc paywall cho đối tượng mặc định để tải nhanh hơn

Thông thường, flow và paywall được tải gần như ngay lập tức, vì vậy bạn không cần lo lắng về việc tăng tốc quá trình này. Tuy nhiên, trong những trường hợp bạn có nhiều đối tượng và placement, và người dùng có kết nối internet yếu, việc tải flow hoặc paywall có thể mất nhiều thời gian hơn mong muốn. Trong tình huống đó, bạn có thể muốn hiển thị flow hoặc paywall mặc định để đảm bảo trải nghiệm người dùng mượt mà thay vì không hiển thị gì cả.

Để giải quyết vấn đề này, bạn có thể dùng phương thức getFlowForDefaultAudience, phương thức này lấy flow hoặc paywall của placement được chỉ định cho đối tượng All Users. Tuy nhiên, điều quan trọng cần hiểu là cách tiếp cận được khuyến nghị là lấy flow hoặc paywall bằng phương thức getFlow, như đã trình bày trong phần Lấy flow/paywall ở trên.

Warning

Lý do chúng tôi khuyến nghị dùng getFlow

Phương thức getFlowForDefaultAudience có một số hạn chế đáng kể:

  • Các vấn đề tương thích ngược tiềm ẩn: Nếu bạn cần hiển thị các flow khác nhau cho các phiên bản ứng dụng khác nhau (hiện tại và tương lai), bạn có thể gặp khó khăn. Bạn sẽ phải thiết kế các flow hỗ trợ phiên bản hiện tại (legacy) hoặc chấp nhận rằng người dùng đang dùng phiên bản hiện tại (legacy) có thể gặp sự cố với các flow không được hiển thị.
  • Mất khả năng nhắm mục tiêu: Tất cả người dùng sẽ thấy cùng một flow được thiết kế cho đối tượng All Users, nghĩa là bạn mất đi khả năng nhắm mục tiêu cá nhân hóa (bao gồm theo quốc gia, attribution marketing hoặc các thuộc tính tùy chỉnh của riêng bạn).

Nếu bạn sẵn sàng chấp nhận những hạn chế này để đổi lấy tốc độ tải flow hoặc paywall nhanh hơn, hãy sử dụng phương thức getFlowForDefaultAudience như sau. Nếu không, hãy tiếp tục dùng getFlow được mô tả ở trên.

Tham sốBắt buộcMô tả
placementIdbắt buộcĐịnh danh của Placement. Đây là giá trị bạn đã chỉ định khi tạo placement trong Adapty Dashboard.
fetchPolicymặc định: AdaptyPlacementFetchPolicy.Default

fetchPolicy xác định SDK đọc từ lớp nào trước, chứ không phải liệu có được phép dùng cache hay không. Mặc định, SDK sẽ gọi lên server trước và chỉ trả về dữ liệu cache nếu request đó thất bại. Chúng tôi khuyến nghị cách này vì đảm bảo người dùng luôn nhận được dữ liệu mới nhất.

Tuy nhiên, nếu bạn cho rằng người dùng thường xuyên gặp phải kết nối internet không ổn định, hãy cân nhắc dùng AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad — chính sách này đảo ngược thứ tự trên: đọc cache trước và chỉ gọi server khi không có gì trong cache. Người dùng có thể không nhận được dữ liệu mới nhất tuyệt đối, nhưng thời gian tải sẽ nhanh hơn dù kết nối có chập chờn. Cache được cập nhật thường xuyên nên hoàn toàn an toàn khi dùng trong phiên làm việc để tránh các request mạng không cần thiết.

Chính sách thứ ba, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), nằm giữa hai cách trên: đọc cache trước khi bản cache còn trẻ hơn maxAgeMillis, và gọi server khi cache đã cũ hơn ngưỡng đó.

Lưu ý rằng cache vẫn được giữ nguyên khi khởi động lại ứng dụng và chỉ bị xóa khi cài đặt lại ứng dụng hoặc thực hiện dọn dẹp thủ công.

Tùy chỉnh tài nguyên

Để tùy chỉnh hình ảnh và video trong flow hoặc paywall của bạn, hãy triển khai custom assets.

Hero image và video có ID được định sẵn: hero_image và hero_video. Trong một custom asset bundle, bạn nhắm đến các phần tử này bằng ID của chúng và tùy chỉnh hành vi của chúng.

Đối với các hình ảnh và video khác, bạn cần đặt custom ID trong Adapty dashboard.

Ví dụ, bạn có thể:

  • Hiển thị hình ảnh hoặc video khác nhau cho từng nhóm người dùng.
  • Hiển thị ảnh xem trước cục bộ trong khi ảnh chính từ xa đang tải.
  • Hiển thị ảnh xem trước trước khi phát video.
  • Hiển thị media được đóng gói sẵn trong ứng dụng để màn hình đầu tiên hiển thị mà không cần tải xuống. Xem Hiển thị media màn hình đầu từ app bundle.

Đây là ví dụ về cách cung cấp custom asset thông qua một dictionary đơn giản:

val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val flowView = AdaptyUI.getFlowView(
    activity,
    flowConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
Note

Nếu không tìm thấy asset, flow sẽ hiển thị giao diện mặc định của nó.

Đối với video, bạn có thể tùy chọn truyền resolution để giữ chỗ layout và đặt tỷ lệ khung hình (width / height) trước khi video tải:

AdaptyCustomVideoAsset.file(
    FileLocation.fromResId(requireContext(), R.raw.custom_video),
    preview = AdaptyCustomImageAsset.file(
        FileLocation.fromResId(requireContext(), R.drawable.video_preview),
    ),
    resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920),
)

Sau khi bạn thiết kế phần giao diện cho paywall của mình bằng Paywall Builder cũ trong Adapty Dashboard, bạn có thể hiển thị nó trong ứng dụng di động. Bước đầu tiên trong quá trình này là lấy paywall được liên kết với placement cùng cấu hình giao diện của nó như mô tả bên dưới.

Warning

Các paywall được xây dựng trong Paywall Builder của SDK 3.x yêu cầu Android SDK phiên bản 3.0 trở lên.

Vui lòng lưu ý rằng chủ đề này đề cập đến các paywall được tùy chỉnh bằng Paywall Builder. Nếu bạn đang triển khai paywall theo cách thủ công, hãy tham khảo chủ đề Lấy paywall và sản phẩm cho Remote Config paywall trong ứng dụng di động.

Tip

Bạn muốn xem ví dụ thực tế về cách tích hợp Adapty SDK vào ứng dụng di động? Hãy xem ứng dụng mẫu của chúng tôi, minh họa toàn bộ quá trình thiết lập, bao gồm hiển thị paywall, thực hiện mua hàng và các chức năng cơ bản khác.

Trước khi bắt đầu hiển thị paywall trong ứng dụng di động của bạn (nhấn để mở rộng)
  1. Tạo sản phẩm của bạn trong Adapty Dashboard.
  2. Tạo một paywall và thêm các sản phẩm vào đó trong Adapty Dashboard.
  3. Tạo các placement và thêm paywall vào đó trong Adapty Dashboard.
  4. Cài đặt Adapty SDK trong ứng dụng di động của bạn.

Tải paywall được thiết kế bằng Paywall Builder

Nếu bạn đã thiết kế paywall bằng Paywall Builder, bạn không cần lo về việc render nó trong code ứng dụng để hiển thị cho người dùng. Paywall như vậy đã bao gồm cả nội dung hiển thị lẫn cách hiển thị. Tuy nhiên, bạn vẫn cần lấy ID của nó thông qua placement, cấu hình view của nó, rồi mới hiển thị trong ứng dụng.

Để đảm bảo hiệu suất tối ưu, bạn nên lấy paywall và cấu hình view của nó càng sớm càng tốt, để ảnh có đủ thời gian tải xuống trước khi hiển thị cho người dùng.

Để lấy paywall, sử dụng phương thức getPaywall:

Tham số:

Tham sốBắt buộcMô tả
placementIdbắt buộcĐịnh danh của Placement mong muốn. Đây là giá trị bạn đã chỉ định khi tạo một placement trong Adapty Dashboard.
locale

tùy chọn

mặc định: en

Định danh của bản dịch paywall. Tham số này được kỳ vọng là một mã ngôn ngữ gồm một hoặc hai subtag được phân tách bằng ký tự dấu trừ (-). Subtag đầu tiên đại diện cho ngôn ngữ, subtag thứ hai đại diện cho khu vực.

Ví dụ: en nghĩa là tiếng Anh, pt-br đại diện cho tiếng Bồ Đào Nha của Brazil.

Xem Localizations and locale codes để biết thêm thông tin về mã locale và cách chúng tôi khuyến nghị sử dụng chúng.

fetchPolicymặc định: AdaptyPlacementFetchPolicy.Default

fetchPolicy xác định lớp nào SDK đọc trước, chứ không phải liệu có thể sử dụng cache hay không. Theo mặc định, SDK sẽ đến máy chủ trước và trả về dữ liệu đã cache nếu yêu cầu đó thất bại. Chúng tôi khuyến nghị dùng phương án này vì nó đảm bảo người dùng luôn nhận được dữ liệu mới nhất.

Tuy nhiên, nếu bạn cho rằng người dùng của mình thường xuyên gặp vấn đề về kết nối internet không ổn định, hãy cân nhắc sử dụng AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad — tùy chọn này đảo ngược thứ tự đó: đọc cache trước và chỉ đến máy chủ khi không có gì trong cache. Người dùng có thể không nhận được dữ liệu mới nhất tuyệt đối, nhưng sẽ có thời gian tải nhanh hơn, bất kể kết nối internet có chập chờn đến đâu. Cache được cập nhật thường xuyên, nên hoàn toàn an toàn khi sử dụng trong phiên để tránh các yêu cầu mạng.

Một chính sách thứ ba, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), nằm giữa hai tùy chọn trên: đọc cache trước khi bản cache còn trẻ hơn maxAgeMillis, và đến máy chủ khi bản cache đã cũ hơn.

Lưu ý rằng cache vẫn còn nguyên sau khi khởi động lại ứng dụng và chỉ bị xóa khi gỡ cài đặt ứng dụng hoặc thực hiện dọn dẹp thủ công.

Adapty SDK lưu trữ paywall cục bộ theo hai lớp: cache được cập nhật thường xuyên như mô tả ở trên và paywall dự phòng. Chúng tôi cũng sử dụng CDN để tải paywall nhanh hơn và một máy chủ dự phòng độc lập trong trường hợp CDN không thể truy cập được. Hệ thống này được thiết kế để đảm bảo bạn luôn nhận được phiên bản paywall mới nhất trong khi vẫn đảm bảo độ tin cậy ngay cả trong những trường hợp kết nối internet hạn chế.

loadTimeoutmặc định: 5 giây

Giá trị này giới hạn thời gian chờ cho phương thức này. Nếu hết thời gian chờ, dữ liệu đã cache hoặc fallback cục bộ sẽ được trả về.

Lưu ý rằng trong một số trường hợp hiếm gặp, phương thức này có thể hết thời gian chờ muộn hơn một chút so với giá trị đã chỉ định trong loadTimeout, vì thao tác có thể bao gồm nhiều yêu cầu khác nhau bên dưới.

Đối với Android: Bạn có thể tạo TimeInterval bằng các extension function (như 5.seconds, trong đó .seconds lấy từ import com.adapty.utils.seconds), hoặc TimeInterval.seconds(5). Để không giới hạn thời gian, dùng TimeInterval.INFINITE.

Tham số phản hồi:

Tham sốMô tả
PaywallMột đối tượng AdaptyPaywall chứa danh sách ID sản phẩm, mã định danh paywall, Remote Config và một số thuộc tính khác.

Lấy cấu hình hiển thị của paywall được thiết kế bằng Paywall Builder

Important

Hãy đảm bảo bật toggle Show on device trong Paywall Builder. Nếu tùy chọn này chưa được bật, cấu hình hiển thị sẽ không thể lấy được.

Sau khi fetch paywall, hãy kiểm tra xem nó có chứa ViewConfiguration hay không — đây là dấu hiệu cho thấy paywall được tạo bằng Paywall Builder. Thông tin này sẽ giúp bạn xác định cách hiển thị paywall. Nếu có ViewConfiguration, hãy xử lý nó như một paywall Paywall Builder; nếu không, xử lý nó như một paywall Remote Config.

Note

Nếu bạn hỗ trợ nhiều ngôn ngữ, hãy thêm bản địa hóa vào paywall của bạn. Để biết các mã cần sử dụng, xem Bản địa hóa và mã ngôn ngữ.

Sau khi tải xong, hiển thị paywall.

Lấy paywall cho đối tượng mặc định để tải nhanh hơn

Thông thường, paywall được tải gần như ngay lập tức, nên bạn không cần lo về việc tối ưu tốc độ. Tuy nhiên, nếu bạn có nhiều đối tượng và paywall, hoặc người dùng đang kết nối internet yếu, việc tải paywall có thể mất nhiều thời gian hơn mong muốn. Trong trường hợp đó, bạn có thể muốn hiển thị một paywall mặc định để đảm bảo trải nghiệm mượt mà cho người dùng thay vì không hiển thị gì cả.

Để giải quyết vấn đề này, bạn có thể sử dụng phương thức getPaywallForDefaultAudience, phương thức này lấy paywall của placement được chỉ định cho đối tượng All Users. Tuy nhiên, điều quan trọng cần hiểu là cách tiếp cận được khuyến nghị là lấy paywall bằng phương thức getPaywall, như đã trình bày chi tiết trong phần Lấy thông tin Paywall ở trên.

Warning

Lý do chúng tôi khuyến nghị sử dụng getPaywall

Phương thức getPaywallForDefaultAudience có một số hạn chế đáng kể:

  • Các vấn đề tương thích ngược tiềm ẩn: Nếu bạn cần hiển thị các paywall khác nhau cho các phiên bản ứng dụng khác nhau (hiện tại và tương lai), bạn có thể gặp khó khăn. Bạn sẽ phải thiết kế các paywall hỗ trợ phiên bản hiện tại (legacy), hoặc chấp nhận rằng người dùng đang dùng phiên bản hiện tại (legacy) có thể gặp sự cố với các paywall không hiển thị được.
  • Mất khả năng nhắm mục tiêu: Tất cả người dùng sẽ thấy cùng một paywall được thiết kế cho đối tượng All Users, nghĩa là bạn mất đi khả năng cá nhân hóa (bao gồm nhắm mục tiêu theo quốc gia, attribution marketing hoặc các thuộc tính tùy chỉnh của riêng bạn).

Nếu bạn chấp nhận những hạn chế này để đổi lấy tốc độ tải paywall nhanh hơn, hãy sử dụng phương thức getPaywallForDefaultAudience như sau. Nếu không, hãy tiếp tục dùng getPaywall đã mô tả ở trên.

Note

Phương thức getPaywallForDefaultAudience khả dụng từ Android SDK 2.11.3 trở lên

Tham sốBắt buộcMô tả
placementIdbắt buộcĐịnh danh của Placement. Đây là giá trị bạn đã chỉ định khi tạo placement trong Adapty Dashboard.
locale

tùy chọn

mặc định: en

Định danh của bản địa hóa paywall. Tham số này là mã ngôn ngữ gồm một hoặc nhiều subtag phân cách bởi dấu trừ (-). Subtag đầu tiên là mã ngôn ngữ, subtag thứ hai là mã vùng.

Ví dụ: en là tiếng Anh, pt-br là tiếng Bồ Đào Nha Brazil.

Xem Bản địa hóa và mã ngôn ngữ để biết thêm thông tin về mã ngôn ngữ và cách chúng tôi khuyến nghị sử dụng chúng.

fetchPolicymặc định: AdaptyPlacementFetchPolicy.Default

fetchPolicy xác định tầng nào SDK đọc trước, không phải liệu SDK có thể sử dụng cache hay không. Theo mặc định, SDK sẽ gọi lên server trước và trả về dữ liệu từ cache nếu yêu cầu đó thất bại. Chúng tôi khuyến nghị tùy chọn này vì nó đảm bảo người dùng của bạn luôn nhận được dữ liệu mới nhất.

Tuy nhiên, nếu bạn cho rằng người dùng của mình thường xuyên gặp kết nối internet không ổn định, hãy cân nhắc dùng AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad — thứ tự được đảo ngược: SDK đọc cache trước và chỉ gọi lên server khi không có gì trong cache. Người dùng có thể không nhận được dữ liệu mới nhất tuyệt đối, nhưng thời gian tải sẽ nhanh hơn dù kết nối có chập chờn đến đâu. Cache được cập nhật thường xuyên nên hoàn toàn an toàn khi dùng trong phiên làm việc để tránh các yêu cầu mạng.

Chính sách thứ ba, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), nằm giữa hai chính sách trên: SDK đọc cache trước khi bản cache còn trẻ hơn maxAgeMillis, và chuyển sang gọi server khi cache đã cũ hơn ngưỡng đó.

Lưu ý rằng cache vẫn được giữ nguyên sau khi khởi động lại ứng dụng và chỉ bị xóa khi ứng dụng được cài đặt lại hoặc được dọn dẹp thủ công.

Tùy chỉnh assets

Để tùy chỉnh hình ảnh và video trong paywall, hãy triển khai custom assets.

Hero image và video có ID được định sẵn: hero_image và hero_video. Trong một custom asset bundle, bạn nhắm đến các phần tử này theo ID của chúng và tùy chỉnh hành vi của chúng.

Đối với các hình ảnh và video khác, bạn cần đặt custom ID trong Adapty dashboard.

Ví dụ, bạn có thể:

  • Hiển thị hình ảnh hoặc video khác nhau cho một số người dùng.
  • Hiển thị ảnh xem trước cục bộ trong khi hình ảnh chính từ xa đang tải.
  • Hiển thị ảnh xem trước trước khi phát video.
Important

Để sử dụng tính năng này, hãy cập nhật Adapty Android SDK lên phiên bản 3.7.0 trở lên.

Đây là ví dụ về cách bạn có thể cung cấp các tài nguyên tùy chỉnh thông qua một dictionary đơn giản:

val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val paywallView = AdaptyUI.getPaywallView(
    activity,
    viewConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
Note

Nếu không tìm thấy asset, paywall sẽ hiển thị với giao diện mặc định của nó.