Lấy flows & paywalls - Unity

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 bằng Paywall Builder, 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 giao diệ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ấp để mở rộng)
  1. Tạo sản phẩm trong Adapty Dashboard.
  2. Tạo flow/paywall và thêm sản phẩm vào đó trong Adapty Dashboard.
  3. Tạo placement và thêm flow/paywall vào đó trong Adapty Dashboard.
  4. Cài đặt Adapty SDK trong ứng dụng di động của bạn.

Tải 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 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 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ó qua placement, cấu hình view, rồi mới hiển thị nó trong ứng dụng di động.

Để đảm bảo hiệu suất tối ưu, hãy truy xuất flow hoặc paywall cùng với cấu hình view càng sớm càng tốt, nhằm có đủ thời gian tải ả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(
    "YOUR_PLACEMENT_ID",
    AdaptyPlacementFetchPolicy.Default,
    TimeSpan.FromSeconds(5),
    (flow, error) => {
        if (error != null) {
            // handle the error
            return;
        }

        // flow - the requested flow/paywall
    }
);

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

Theo mặc định, SDK sẽ cố tải dữ liệu từ server và trả về dữ liệu đã cache nếu thất bại. Chúng tôi khuyên dùng 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 kết nối internet không ổn định, hãy cân nhắc dùng AdaptyPlacementFetchPolicy.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 sẽ có tốc độ tải nhanh hơn bất kể chất lượng kết nối. 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 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.

Adapty SDK lưu trữ 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 dùng CDN để tải nhanh hơn và một server dự phòng độc lập trong trường hợp CDN không khả dụng. 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 internet yếu.

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, do thao tác có thể bao gồm nhiều yêu cầu khác nhau bên dưới.

Thông số phản hồi:

Thông 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 AdaptyFlowPaywall), và Remote Config (RemoteConfigs — danh sách với một mục cho mỗi locale). Để lấy các sản phẩm thực tế cho việc tải trước, UI tùy chỉnh, hoặc kiểm tra theo chương trình, hãy gọi GetPaywallProducts(flow).

Tải cấu hình giao diện

Sau khi tải flow hoặc paywall, hãy tải cấu hình giao diện và tạo view trong một bước duy nhất bằng phương thức CreateFlowView. Không cần kiểm tra cờ riêng biệt: 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ó Builder UI, CreateFlowView sẽ trả về lỗi — xử lý nó như một remote config paywall.

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

var parameters = new AdaptyUICreateFlowViewParameters()
    .SetPreloadProducts(true)
    .SetLoadTimeout(TimeSpan.FromSeconds(5));

AdaptyUI.CreateFlowView(flow, parameters, (view, error) => {
    if (error != null) {
        // the flow has no view configured, or view creation failed
        return;
    }

    // use view
});
Tham sốBắt buộcMô tả
flowbắt buộcMột đối tượng AdaptyFlow lấy qua Adapty.GetFlow.
Localetùy chọnMã định danh của localization trong Builder để hiển thị flow hoặc paywall, ví dụ en hoặc pt-br. Flow được bản địa hóa khi view của nó được tạo, vì vậy đây là nơi duy nhất để chọn localization. SDK không đọc ngôn ngữ của thiết bị: khi bỏ qua tham số này, flow sẽ hiển thị bằng en, hoặc bằng ngôn ngữ mặc định của nó nếu flow không có localization en. Mã phải khớp chính xác với mã localization của flow. Xem Sử dụng localization và mã ngôn ngữ.
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 đã 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 trong.
PreloadProductstùy chọnĐặt thành true để tải trước sản phẩm nhằm cải thiện hiệu suất. 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ị flow hoặc paywall.
ProductPurchaseParameterstùy chọnChỉ dành cho Android (bị bỏ qua trên iOS). Một dictionary ánh xạ AdaptyProductIdentifier sang AdaptyPurchaseParameters. Dùng để cấu hình các tham số mua hàng cụ thể như ưu đãi được 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 flow hoặc paywall.
EnableSafeAreaPaddingstùy chọnChỉ dành cho Android (bị bỏ qua trên iOS). Khi đặt thành true, view của flow sẽ áp dụng safe-area paddings. Mặc định: true. Giá trị mặc định phù hợp với hầu hết các trường hợp.

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 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ă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à 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 những tình huống như vậy, 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 sẽ 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ư đã mô tả chi tiết trong phần Lấy flow/paywall ở trên.

Lý do 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ế 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 dùng GetFlow được mô tả ở trên.

Adapty.GetFlowForDefaultAudience(
    "YOUR_PLACEMENT_ID",
    AdaptyPlacementFetchPolicy.Default,
    (flow, error) => {
        if (error != null) {
            // handle the error
            return;
        }

        // flow - the requested flow
    }
);
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

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ị dùng 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 tình trạng kết nối không ổn định, hãy cân nhắc dùng AdaptyPlacementFetchPolicy.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, nhưng thời gian tải sẽ nhanh hơn bất kể kết nối internet kém ổn định đến đâu. Bộ nhớ đệm đượ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.

Lưu ý rằng bộ nhớ đệm vẫn được giữ 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 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 các custom asset.

Hero image 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 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 cho một số người dùng.
  • Hiển thị ảnh preview cục bộ trong khi hình ảnh chính từ xa đang tải.
  • Hiển thị ảnh preview trước khi phát video.

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

var customAssets = new Dictionary<string, AdaptyCustomAsset>
{
    { "custom_image", AdaptyCustomAsset.LocalImageFile("custom_assets/images/custom_image.png") },
    { "hero_video", AdaptyCustomAsset.LocalVideoFile("custom_assets/videos/custom_video.mp4") }
};

var parameters = new AdaptyUICreateFlowViewParameters()
    .SetCustomAssets(customAssets)
    .SetLoadTimeout(TimeSpan.FromSeconds(3));

AdaptyUI.CreateFlowView(flow, parameters, (view, error) => {
    // handle the result
});

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 lại giao diện mặc định đã được cấu hình trong Builder.

Thiết lập timer do lập trình viên định nghĩa

Để sử dụng timer tùy chỉnh trong ứng dụng Unity của bạn, hãy truyền một dictionary gồm các ID timer và ngày kết thúc tương ứng vào phương thức SetCustomTimers. Dưới đây là ví dụ:

var customTimers = new Dictionary<string, DateTime> {
    { "CUSTOM_TIMER_6H", DateTime.Now.AddHours(6) },
    { "CUSTOM_TIMER_NY", new DateTime(2026, 1, 1) }
};

var parameters = new AdaptyUICreateFlowViewParameters()
    .SetCustomTimers(customTimers)
    .SetLoadTimeout(TimeSpan.FromSeconds(3));

AdaptyUI.CreateFlowView(flow, parameters, (view, error) => {
    // handle the result
});

Trong ví dụ này, CUSTOM_TIMER_NYCUSTOM_TIMER_6HTimer ID của các timer do nhà phát triển định nghĩa mà bạn đã thiết lập trong Adapty Dashboard. Timer resolver đảm bảo ứng dụng của bạn tự động cập nhật từng timer với giá trị chính xác. Ví dụ:

  • CUSTOM_TIMER_NY: Thời gian còn lại cho đến khi timer kết thúc, chẳng hạn như Ngày đầu năm mới.
  • CUSTOM_TIMER_6H: Thời gian còn lại trong khoảng 6 giờ bắt đầu từ khi người dùng mở flow hoặc paywall.

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 view của nó như mô tả bên dưới.

Paywall Builder mới hoạt động với Unity SDK phiên bản 3.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, vui lòng tham khảo chủ đề Lấy paywall và sản phẩm cho Remote Config paywall trong ứng dụng di động 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 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 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 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 lắng về việc render nó trong mã ứng dụng di động để hiển thị cho người dùng. Paywall như vậy chứa cả nội dung cần hiển thị và cách hiển thị nó. 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 sau đó hiển thị nó trong ứng dụng di động của bạn.

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

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

Adapty.GetPaywall("YOUR_PLACEMENT_ID", "en", (paywall, error) => {
  if(error != null) {
    // handle the error
    return;
  }
  
  // paywall - the resulting object
});

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.
locale

tùy chọn

mặc định: en

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

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

Xem 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 chúng.

fetchPolicymặc định: .reloadRevalidatingCacheData

Theo mặc định, SDK sẽ cố gắng tải dữ liệu từ máy chủ và sẽ 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 gặp vấn đề với kết nối internet không ổn định, hãy cân nhắc sử dụng .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ẽ 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 việc sử dụng nó trong phiên là an toàn để tránh các yêu cầu mạng.

Lưu ý rằng cache vẫn còn nguyên 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 để lấy 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 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 kém.

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 các yêu cầu khác nhau bên dưới.

Tham số phản hồi:

Tham sốMô tả
PaywallMột đối tượng AdaptyPaywall với 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 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 không đượ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ó ViewConfiguration không, điều này cho biết nó được tạo bằng Paywall Builder. Điều này sẽ hướng dẫn bạn cách hiển thị paywall. Nếu ViewConfiguration có mặt, hãy xử lý nó như paywall Paywall Builder; nếu không, xử lý nó như paywall remote config.

Trong Unity SDK, hãy gọi trực tiếp phương thức CreatePaywallView mà không cần lấy cấu hình view thủ công trước.

Kết quả của phương thức CreatePaywallView chỉ có thể được sử dụng một lần. Nếu bạn cần sử dụng lại, hãy gọi phương thức CreatePaywallView từ đầu. Gọi nó hai lần mà không tạo lại có thể dẫn đến lỗi AdaptyUIError.viewAlreadyPresented.

var parameters = new AdaptyUICreatePaywallViewParameters()
  .SetPreloadProducts(preloadProducts)
  .SetLoadTimeout(new TimeSpan(0, 0, 3));

AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
  // handle the result
});

Tham số:

Tham sốBắt buộcMô tả
paywallbắt buộcMột đối tượng AdaptyPaywall để lấy controller cho paywall mong muốn.
loadTimeoutmặc định: 5 giâyGiá 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 các yêu cầu khác nhau bên dưới.
PreloadProductstùy chọnCung cấp một mảng AdaptyPaywallProducts để tối ưu hóa thời gian hiển thị sản phẩm trên màn hình. Nếu nil được truyền vào, AdaptyUI sẽ tự động lấy các sản phẩm cần thiết.
CustomTagstùy chọnĐịnh nghĩa một dictionary các custom tag và giá trị đã được xử lý của chúng. Custom tag đóng vai trò là placeholder trong nội dung paywall, được thay thế động bằng các chuỗi cụ thể cho nội dung được cá nhân hóa trong paywall. Tham khảo chủ đề Custom tags in paywall builder để biết thêm chi tiết.
CustomTimerstùy chọnĐịnh nghĩa một dictionary các custom timer và ngày kết thúc của chúng. Custom timer cho phép bạn hiển thị đồng hồ đếm ngược trong paywall của mình.

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 và cách sử dụng mã locale đúng cách tại đây.

Sau khi có view, hiển thị paywall.

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.

Hình ảnh hero và video có ID được định nghĩa sẵn: hero_imagehero_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 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.

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

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

var customAssets = new Dictionary<string, AdaptyCustomAsset>
{
    { "custom_image", AdaptyCustomAsset.LocalImageFile("custom_assets/images/custom_image.png") },
    { "hero_video", AdaptyCustomAsset.LocalVideoFile("custom_assets/videos/custom_video.mp4") }
};

var parameters = new AdaptyUICreatePaywallViewParameters()
    .SetCustomAssets(customAssets)
    .SetLoadTimeout(new TimeSpan(0, 0, 3));

AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
    // handle the result
});

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

Thiết lập timer do nhà phát triển định nghĩa

Để sử dụng custom timer trong ứng dụng Unity của bạn, bạn có thể truyền một dictionary gồm các ID timer và ngày kết thúc của chúng trực tiếp vào phương thức SetCustomTimers. Dưới đây là ví dụ:

var customTimers = new Dictionary<string, DateTime> {
    { "CUSTOM_TIMER_6H", DateTime.Now.AddHours(6) },
    { "CUSTOM_TIMER_NY", new DateTime(2025, 1, 1) }
};

var parameters = new AdaptyUICreatePaywallViewParameters()
    .SetCustomTimers(customTimers)
    .SetLoadTimeout(new TimeSpan(0, 0, 3));

AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
    // handle the result
});

Trong ví dụ này, CUSTOM_TIMER_NYCUSTOM_TIMER_6H là các Timer ID của các timer do nhà phát triển định nghĩa mà bạn đặt trong Adapty Dashboard. Bộ xử lý timer đảm bảo ứng dụng của bạn cập nhật động mỗi timer với giá trị chính xác. Ví dụ:

  • CUSTOM_TIMER_NY: Thời gian còn lại cho đến khi timer kết thúc, chẳng hạn như Năm mới.
  • CUSTOM_TIMER_6H: Thời gian còn lại trong khoảng thời gian 6 giờ bắt đầu khi người dùng mở paywall.

Tăng tốc lấy paywall với paywall đối tượng mặc định

Thông thường, paywall được lấy 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 các trường hợp bạn có nhiều đối tượng và paywall, và người dùng của bạn có kết nối internet yếu, việc lấy 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ị 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ư đã trình bày chi tiết trong phần Fetch Paywall ở trên.

Hãy cân nhắc sử dụng GetPaywall thay vì GetPaywallForDefaultAudience, vì phương thức sau có những hạn chế quan trọng:

  • Vấn đề tương thích: Có thể gây ra sự cố khi hỗ trợ nhiều phiên bản ứng dụng, đòi hỏi thiết kế tương thích ngược hoặc chấp nhận rằng các phiên bản cũ có thể hiển thị không đúng.
  • Không có cá nhân hóa: Chỉ hiển thị nội dung cho đối tượng “All Users”, loại bỏ khả năng nhắm mục tiêu dựa trên quốc gia, attribution, hoặc thuộc tính tùy chỉnh.

Nếu tốc độ tải nhanh hơn có giá trị hơn những hạn chế này trong trường hợp của bạn, hãy dùng GetPaywallForDefaultAudience như hướng dẫn bên dưới. Nếu không, hãy dùng GetPaywall như đã mô tả ở trên.

Adapty.GetPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", (paywall, error) => {
  if(error != null) {
    // handle the error
    return;
  }
  
  // paywall - the resulting object
});

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 được phân tách bằng ký tự 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).

fetchPolicymặc định: .reloadRevalidatingCacheData

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 kết nối internet không ổn định, hãy cân nhắc dùng .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 sẽ có tốc độ tải nhanh hơn, bất kể kết nối internet của họ 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 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 gỡ cài đặt ứng dụng hoặc xóa 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 paywall mới nhất trong khi vẫn đảm bảo độ tin cậy ngay cả khi kết nối internet hạn chế.