Lấy flows & paywalls - Kotlin Multiplatform

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

Sau khi bạn đã thiết kế flow hoặc paywall trong Paywall Builder, bạn có thể hiển thị nó trong ứng dụng di động của mình. 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 hiển thị của nó như mô tả bên dưới.

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, nơ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ị flow trong ứng dụng di động (nhấn để mở rộng)
  1. Tạo sản phẩm của bạn trong Adapty Dashboard.
  2. Tạo flow/paywall và tích hợp sản phẩm vào đó trong Adapty Dashboard.
  3. Tạo placement và tích hợp flow/paywall vào đó trong Adapty Dashboard.
  4. Cài đặt Adapty SDK vào ứng dụng di động của bạn.

Lấy flow/paywall

Nếu bạn đã thiết kế một flow hoặc paywall bằng Flow Builder hoặc Paywall 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 đó đã bao gồm cả nội dung cần 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 trình bày nó trong ứng dụng di động.

Để đảm bảo hiệu suất tối ưu, bạn nên lấy flow hoặc paywall cùng với cấu hình view 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.

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


Adapty.getFlow(
    placementId = "YOUR_PLACEMENT_ID",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { flow ->
    // the requested flow/paywall
}.onError { error ->
    // handle the error
}

Tham số:

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: AdaptyPaywallFetchPolicy.Default

Theo mặc định, SDK sẽ cố tải dữ liệu từ máy chủ và trả về dữ liệu đã cache trong trường hợp 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 vấn đề với kết nối internet không ổn định, hãy cân nhắc sử dụng AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad để trả về dữ liệu đã cache nếu có. Trong trường hợp này, người dùng có thể không nhận được dữ liệu mới nhất tuyệt đối, nhưng họ sẽ có trải nghiệm tải nhanh hơn, bất kể kết nối internet của họ có bị gián đoạn hay không. Cache được cập nhật thường xuyên, vì vậy có thể sử dụng an toàn trong phiên làm việc để tránh các yêu cầu mạ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 gỡ cài đặt ứng dụng hoặc thông qua việ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 máy chủ 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 đồng thời đảm bảo độ tin cậy ngay cả trong 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ị được 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 Kotlin Multiplatform: Bạn có thể tạo Duration với các hàm mở rộng như 5.seconds, trong đó .seconds là từ kotlin.time.Duration.Companion.seconds.

Tham số phản hồi:

Tham sốMô tả
FlowMột đối tượng AdaptyFlow chứa placement, các định danh (instanceIdentity, variationId), tên, các biến thể paywall (paywalls — danh sách các AdaptyFlowPaywall), và Remote Config (remoteConfigs — danh sách với một mục cho mỗi ngôn ngữ). Để lấy sản phẩm thực tế phục vụ việc tải trước, tùy chỉnh giao diện, hoặc kiểm tra theo chương trình, hãy gọi getPaywallProducts(flow).

Lấy cấu hình view

Sau khi đã lấy được flow hoặc paywall, hãy tải cấu hình view của nó và tạo view trong một bước duy nhất bằng phương thức createFlowView. Không có cờ riêng nào để kiểm tra: nếu placement được thiết kế trong Flow Builder (một flow) hoặc Paywall Builder (một paywall), createFlowView sẽ trả về view đã sẵn sàng để hiển thị. Nếu placement là paywall tùy chỉnh không có giao diện Builder, createFlowView sẽ trả về AdaptyResult.Errorxử lý nó như một remote config paywall.

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


AdaptyUI.createFlowView(
    flow = flow,
    loadTimeout = 5.seconds,
    preloadProducts = true
).onSuccess { view ->
    // use view
}.onError { error ->
    // the flow has no view configured, or view creation failed
}
ParameterPresenceDescription
flowbắt buộcMột đối tượng AdaptyFlow lấy được qua Adapty.getFlow.
loadTimeouttùy chọnGiá 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 đã lưu trong 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ị được 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. Bạn có thể sử dụng các hàm mở rộng như 5.seconds từ kotlin.time.Duration.Companion.
preloadProductstùy chọnĐặt thành true để tải trước sản phẩm nhằm cải thiện hiệu năng. Khi được bật, sản phẩm sẽ được tải trước, giảm thời gian cần thiết để hiển thị flow hoặc paywall.
productPurchaseParamstùy chọnMột map từ AdaptyProductIdentifier đến AdaptyPurchaseParameters. Dùng để cấu hình các tham số mua hàng cụ thể như ưu đãi cá nhân hóa hoặc tham số cập nhật gói đăng ký cho từng sản phẩm trong flow hoặc paywall.

Nếu bạn đang sử dụng nhiều ngôn ngữ, hãy tìm hiểu cách thêm localization cho Builder.

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, nên bạn không cần lo lắng về việc tối ưu tốc độ. Tuy nhiên, trong 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ể sử dụng phương thức getFlowForDefaultAudience, phương thức này lấy flow hoặc paywall của placement đã 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ư được mô tả chi tiết trong phần Lấy flow/paywall ở trên.

Tại sao chúng tôi khuyến nghị sử dụng getFlow

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

  • 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 (cũ) hoặc chấp nhận rằng người dùng với phiên bản hiện tại (cũ) 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 chấp nhận những hạn chế đó để đổi lấy tốc độ tải flow hoặc paywall nhanh hơn, hãy dùng phương thức getFlowForDefaultAudience như sau. Nếu không, hãy tiếp tục dùng getFlow đã mô tả ở trên.


Adapty.getFlowForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
).onSuccess { flow ->
    // the requested flow
}.onError { error ->
    // handle the error
}
Tham sốBắt buộcMô tả
placementIdbắt buộcMã định danh của Placement. Đây là giá trị bạn đã chỉ định khi tạo placement trong Adapty Dashboard.
fetchPolicymặc định: AdaptyPaywallFetchPolicy.Default

Theo mặc định, SDK sẽ cố tải dữ liệu từ máy chủ và trả về dữ liệu đã lưu trong cache nếu thất bại. Chúng tôi khuyến nghị cách 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 tình trạng kết nối không ổn định, hãy cân nhắc dùng AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad để trả về dữ liệu cache nếu có. Trong trường hợp này, người dùng có thể không nhận được dữ liệu mới nhất, nhưng tốc độ tải sẽ nhanh hơn bất kể kết nối internet 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 làm việc để tránh các yêu cầu mạng không cần thiết.

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 gỡ cài đặt ứng dụng hoặc thực hiện dọn dẹp thủ công.

Tùy chỉnh assets

Để 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.

Hình ảnh hero và video có ID được định sẵn: hero_imagehero_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 một custom ID trong Adapty dashboard.

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

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

Đây là ví dụ về cách bạn có thể cung cấp các asset tùy chỉnh thông qua một map:

SDK Kotlin Multiplatform chỉ hỗ trợ asset cục bộ. Đối với nội dung từ xa, bạn cần tải xuống và lưu vào bộ nhớ đệm cục bộ trước khi sử dụng chúng trong các asset tùy chỉnh.

// Import generated Res class for accessing resources

viewModelScope.launch {
    // Get URIs for bundled resources using Res.getUri()
    val heroImagePath = Res.getUri("files/images/hero_image.png")
    val demoVideoPath = Res.getUri("files/videos/demo_video.mp4")

    // Or read image as byte data
    val imageByteData = Res.readBytes("files/images/avatar.png")

    // Create custom assets map
    val customAssets: Map<String, AdaptyCustomAsset> = mapOf(
        // Load image from app resources (bundled with the app)
        // Files should be placed in commonMain/composeResources/files/
        "hero_image" to AdaptyCustomAsset.localImageResource(
            path = heroImagePath
        ),

        // Or use image byte data
        "avatar" to AdaptyCustomAsset.localImageData(
            data = imageByteData
        ),

        // Load video from app resources
        "demo_video" to AdaptyCustomAsset.localVideoResource(
            path = demoVideoPath
        ),

        // Or use a video file from device storage
        "intro_video" to AdaptyCustomAsset.localVideoFile(
            path = "/path/to/local/video.mp4"
        ),

        // Apply custom brand colors
        "brand_primary" to AdaptyCustomAsset.color(
            colorHex = "#FF6B35"
        ),

        // Create gradient background
        "card_gradient" to AdaptyCustomAsset.linearGradient(
            colors = listOf("#1E3A8A", "#3B82F6", "#60A5FA"),
            stops = listOf(0.0f, 0.5f, 1.0f)
        )
    )

    // Use custom assets when creating the flow view
    AdaptyUI.createFlowView(
        flow = flow,
        customAssets = customAssets
    ).onSuccess { view ->
        // Present the flow with custom assets
        view.present()
    }.onError { error ->
        // Handle the error - the flow will fall back to default appearance
    }
}

Nếu một asset không tìm thấy hoặc tải thất bại, flow hoặc paywall sẽ quay về giao diện mặc định được cấu hình trong Builder.

Sau khi bạn đã thiết kế phần giao diện cho paywall của mình bằng Paywall Builder mới 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 và cấu hình hiển thị của nó như mô tả bên dưới.

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, vui lòng tham khảo chủ đề Fetch paywalls và sản phẩm cho paywall remote config trong ứng dụng mobile của 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, nơ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 mobile của bạn (nhấn để mở rộng)
  1. Tạo sản phẩm trong Adapty Dashboard.
  2. Tạo paywall và thêm sản phẩm vào đó trong Adapty Dashboard.
  3. Tạo placement và thêm paywall vào đó trong Adapty Dashboard.
  4. Cài đặt Adapty SDK vào ứng dụng di động của bạn.

Lấy 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 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 thức 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 hiển thị nó trong ứng dụng.

Để đảm bảo hiệu suất tối ưu, điều quan trọng là phải truy xuất paywall và cấu hình view của nó càng sớm càng tốt, tạo đủ thời gian để hình ảnh 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:


Adapty.getPaywall(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}

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 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 được kỳ vọng là mã ngôn ngữ gồm một hoặc hai subtag phân tách bằng ký tự dấu trừ (-). Subtag đầu tiên là ngôn ngữ, subtag thứ hai là vùng.

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

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

fetchPolicymặc định: AdaptyPaywallFetchPolicy.Default

Theo mặc định, SDK sẽ cố tải dữ liệu từ máy chủ và trả về dữ liệu đã cache trong trường hợp 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 tình trạng internet không ổn định, hãy cân nhắc sử dụng AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad để trả về dữ liệu đã cache nếu tồn tại. Trong trường hợp này, người dùng có thể không nhận được dữ liệu mới nhất tuyệt đối, nhưng sẽ trải nghiệm thời gian tải nhanh hơn, bất kể kết nối internet của họ kém đến đâu. Cache được cập nhật thường xuyên, vì vậy có thể sử dụng an toàn trong phiên làm việc để tránh các yêu cầu mạng.

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 ứng dụng được cài đặt lại hoặc thông qua việc 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. 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 của paywall trong khi vẫn đảm bảo độ tin cậy ngay cả khi 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ị được 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 Kotlin Multiplatform: Bạn có thể tạo TimeInterval bằng các extension function (như 5.seconds, trong đó .seconds là từ import com.adapty.utils.seconds), hoặc TimeInterval.seconds(5). Để không giới hạn, sử 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, định danh paywall, Remote Config và một số thuộc tính khác.

Lấy cấu hình view của paywall được thiết kế bằng Paywall Builder

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 view sẽ không thể lấy được.

Sau khi lấy paywall, hãy kiểm tra xem nó có chứa ViewConfiguration 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 của Paywall Builder; nếu không, xử lý nó như một paywall Remote Config.

Sử dụng phương thức createPaywallView để tải cấu hình view.


if (paywall.hasViewConfiguration) {
    AdaptyUI.createPaywallView(
        paywall = paywall,
        loadTimeout = 5.seconds,
        preloadProducts = true
    ).onSuccess { paywallView ->
        // use paywallView
    }.onError { error ->
        // handle the error
    }
} else {
    // use your custom logic
}
ParameterPresenceDescription
paywallrequiredMột đối tượng AdaptyPaywall để lấy controller cho paywall mong muốn.
loadTimeoutoptionalGiá 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 đã lưu trong 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, do thao tác có thể bao gồm nhiều request khác nhau bên dưới. Bạn có thể sử dụng các hàm mở rộng như 5.seconds từ kotlin.time.Duration.Companion.
preloadProductsoptionalĐặt thành true để tải trước sản phẩm nhằm cải thiện hiệu năng. Khi được bật, các sản phẩm sẽ được tải trước, giảm thời gian cần thiết để hiển thị paywall.
productPurchaseParamsoptionalMột map từ AdaptyProductIdentifier đến AdaptyPurchaseParameters. Dùng để cấu hình các tham số mua hàng cụ thể như ưu đãi cá nhân hóa hoặc các tham số cập nhật gói đăng ký cho từng sản phẩm trong paywall.

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 Paywall Builder.

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, 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 trường hợp bạn có nhiều đối tượng và paywall, và người dùng có 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 những tình huống như vậy, bạn có thể muốn hiển thị một 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ị paywall nào 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 sẽ 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ư được mô tả chi tiết trong phần Lấy thông tin Paywall ở trên.

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ể:

  • 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 (cũ) hoặc chấp nhận rằng người dùng dùng phiên bản hiện tại (cũ) có thể gặp sự cố với các paywall 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 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 nhắm mục tiêu (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 chấp nhận những hạn chế này để đổi lấy tốc độ tải paywall nhanh hơn, hãy 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.


Adapty.getPaywallForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}
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 dịch paywall. Tham số này là mã ngôn ngữ gồm một hoặc nhiều subtag được phân tách bằng ký tự dấu trừ (-). Subtag đầu tiên là ngôn ngữ, subtag thứ hai là vùng.

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

Xem Localizations và mã locale để 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: AdaptyPaywallFetchPolicy.Default

Theo mặc định, SDK sẽ cố tải dữ liệu từ máy chủ và trả về dữ liệu đã lưu trong bộ nhớ đệm nếu thất bại. Chúng tôi khuyến nghị cách 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 tình trạng kết nối internet không ổn định, hãy cân nhắc sử dụng AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad để trả về dữ liệu đã lưu trong bộ nhớ đệm nếu có. Trong trường hợp này, 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ể chất lượng kết nối internet của họ ra sao. Bộ nhớ đệm đượ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 làm việc để tránh các yêu cầu mạng.

Lưu ý rằng bộ nhớ đệm vẫn giữ nguyên khi khởi động lại ứng dụng và chỉ bị xóa khi gỡ cài đặt ứng dụng hoặc xóa thủ công.

Tùy chỉnh assets

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

Hero image và video có ID được xác định sẵn: hero_imagehero_video. Trong một custom asset bundle, bạn nhắm tới 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 ID tùy chỉnh 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ị hình ảnh xem trước cục bộ trong khi hình ảnh chính từ xa đang tải.
  • Hiển thị hình ảnh xem trước trước khi phát video.

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

Dưới đây là ví dụ về cách bạn có thể cung cấp custom asset thông qua một map:

Kotlin Multiplatform SDK chỉ hỗ trợ asset cục bộ. Đối với nội dung từ xa, bạn cần tải xuống và lưu cache asset cục bộ trước khi sử dụng chúng trong custom asset.

// Import generated Res class for accessing resources

viewModelScope.launch {
    // Get URIs for bundled resources using Res.getUri()
    val heroImagePath = Res.getUri("files/images/hero_image.png")
    val demoVideoPath = Res.getUri("files/videos/demo_video.mp4")

    // Or read image as byte data
    val imageByteData = Res.readBytes("files/images/avatar.png")

    // Create custom assets map
    val customAssets: Map<String, AdaptyCustomAsset> = mapOf(
        // Load image from app resources (bundled with the app)
        // Files should be placed in commonMain/composeResources/files/
        "hero_image" to AdaptyCustomAsset.localImageResource(
            path = heroImagePath
        ),

        // Or use image byte data
        "avatar" to AdaptyCustomAsset.localImageData(
            data = imageByteData
        ),

        // Load video from app resources
        "demo_video" to AdaptyCustomAsset.localVideoResource(
            path = demoVideoPath
        ),

        // Or use a video file from device storage
        "intro_video" to AdaptyCustomAsset.localVideoFile(
            path = "/path/to/local/video.mp4"
        ),

        // Apply custom brand colors
        "brand_primary" to AdaptyCustomAsset.color(
            colorHex = "#FF6B35"
        ),

        // Create gradient background
        "card_gradient" to AdaptyCustomAsset.linearGradient(
            colors = listOf("#1E3A8A", "#3B82F6", "#60A5FA"),
            stops = listOf(0.0f, 0.5f, 1.0f)
        )
    )

    // Use custom assets when creating paywall view
    AdaptyUI.createPaywallView(
        paywall = paywall,
        customAssets = customAssets
    ).onSuccess { paywallView ->
        // Present the paywall with custom assets
        paywallView.present()
    }.onError { error ->
        // Handle the error - paywall will fall back to default appearance
    }
}

Nếu một tài nguyên không được tìm thấy hoặc tải thất bại, paywall sẽ trở về giao diện mặc định được cấu hình trong Paywall Builder.