Hiển thị flow ở chế độ Observer trong iOS SDK
Cài đặt công cụ agent
Thực hiện toàn bộ quá trình tích hợp Adapty SDK từ công cụ lập trình AI của bạn. Tìm hiểu thêm
Cài đặt vào bất kỳ agent nào hỗ trợ skill. Để cập nhật, chạy npx skills update.
Các skill bao gồm tích hợp SDK, xây dựng flow và paywall, kiểm tra trước khi phát hành, di chuyển placement và nhiều hơn nữa. Mô tả công việc bằng ngôn ngữ thường ngày và agent sẽ chọn skill phù hợp.
Nếu bạn sử dụng chế độ Observer, bạn chịu trách nhiệm về logic mua hàng của riêng mình. Nhưng bạn có thể ủy quyền giao diện người dùng paywall cho Flow & Paywall Builder.
Thiết kế màn hình trong builder, và SDK sẽ render nó theo dạng native. Cập nhật nội dung, bố cục và giá cả bất cứ lúc nào mà không cần phát hành lại ứng dụng. Khi người dùng nhấn nút mua, SDK sẽ gọi code của bạn để hoàn tất giao dịch.
Hướng dẫn này trình bày cách hiển thị màn hình đó và xử lý lệnh gọi mua hàng. Nếu Adapty thực hiện giao dịch mua thay cho bạn, hãy xem Hiển thị flows & paywalls.
Trước khi bắt đầu
Bạn cần:
- Adapty iOS SDK v4 trở lên: Các phiên bản cũ hơn không thể render flow. Để chuyển từ v3, xem hướng dẫn migration.
observerModeđặt thànhtrue: Xem hướng dẫn cài đặt iOS SDK.- Tích hợp cửa hàng ban đầu: Thiết lập Adapty với App Store.
- Một flow đã xuất bản có sản phẩm: Xây dựng trong Flow & Paywall Builder và gán sản phẩm vào đó.
- Một placement cho flow: Tạo một placement và gán flow của bạn vào đó.
- Flow đã được tải trong ứng dụng: Lấy flow và cấu hình của nó trước khi hiển thị.
Triển khai
-
Triển khai đối tượng
AdaptyObserverModeResolver:func observerMode(didInitiatePurchase product: AdaptyPaywallProduct, onStartPurchase: @MainActor @Sendable @escaping () -> Void, onFinishPurchase: @MainActor @Sendable @escaping () -> Void) { // use the product object to handle the purchase // call onStartPurchase / onFinishPurchase to notify AdaptyUI about the purchase progress } func observerModeDidInitiateRestorePurchases(onStartRestore: @MainActor @Sendable @escaping () -> Void, onFinishRestore: @MainActor @Sendable @escaping () -> Void) { // call onStartRestore / onFinishRestore to notify AdaptyUI about the restore progress } -
Tạo một đối tượng cấu hình flow, truyền resolver của bạn vào tham số
observerModeResolver::do { let flowConfiguration = try await AdaptyUI.getFlowConfiguration( forFlow: flow, observerModeResolver: <AdaptyObserverModeResolver> ) } catch { // handle the error }Tham số yêu cầu:
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| forFlow | bắt buộc | Đối tượng AdaptyFlow lấy qua Adapty.getFlow(placementId:). Xem Lấy flow và paywall. |
| observerModeResolver | bắt buộc | AdaptyObserverModeResolver bạn đã triển khai ở trên. |
-
Khởi tạo flow controller bằng
AdaptyUI.flowController(with:delegate:):import AdaptyUI let visualFlow = try AdaptyUI.flowController( with: flowConfiguration, delegate: <AdaptyFlowControllerDelegate> )Tham số yêu cầu:
| Parameter | Presence | Description |
|---|---|---|
| flowConfiguration | required | Một đối tượng AdaptyUI.FlowConfiguration chứa thông tin hiển thị của flow. Xem Lấy flow và paywall. |
| delegate | required | Một AdaptyFlowControllerDelegate để lắng nghe các sự kiện của flow. Xem Xử lý sự kiện flow & paywall. |
Trả về:
| Đối tượng | Mô tả |
|---|---|
| AdaptyFlowController | Một đối tượng đại diện cho màn hình flow được yêu cầu. |
-
Hiển thị controller:
present(visualFlow, animated: true)
Đừng quên liên kết paywall với giao dịch mua hàng. Nếu không, Adapty sẽ không xác định được paywall nguồn của giao dịch mua hàng.
Trong SwiftUI, lấy cấu hình flow bằng resolver và truyền vào modifier .flow:
@State var flowPresented = false
@State var flowConfiguration: AdaptyUI.FlowConfiguration?
var body: some View {
Text("Hello, AdaptyUI!")
.flow(
isPresented: $flowPresented,
flowConfiguration: flowConfiguration,
didPerformAction: { action in
switch action {
case .close:
flowPresented = false
default:
break
}
},
didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
didReceiveError: { error in flowPresented = false }
)
.task {
flowConfiguration = try? await AdaptyUI.getFlowConfiguration(
forFlow: flow,
observerModeResolver: <AdaptyObserverModeResolver>
)
}
}Tham số observerModeResolver: trên getFlowConfiguration là thứ giúp flow được render tôn trọng logic mua hàng tùy chỉnh của bạn — modifier này sử dụng các callback giống hệt như chế độ đầy đủ.
Đừng quên liên kết paywall với giao dịch mua hàng. Nếu không, Adapty sẽ không xác định được paywall nguồn của giao dịch mua.
Trước khi bắt đầu hiển thị paywall (Nhấp để mở rộng)
- Thiết lập tích hợp ban đầu của Adapty với Google Play và với App Store.
2. Cài đặt và cấu hình Adapty SDK. Đảm bảo đặt tham số
observerModethànhtrue. Tham khảo hướng dẫn theo từng framework cho iOS. 3. Tạo sản phẩm trong Adapty Dashboard. 4. Cấu hình paywall, gán sản phẩm vào paywall và tùy chỉnh chúng bằng Paywall Builder trong Adapty Dashboard. 5. Tạo placement và gán paywall vào placement trong Adapty Dashboard. 6. Lấy paywall Paywall Builder và cấu hình của chúng trong code ứng dụng di động của bạn.
-
Implement the
AdaptyObserverModeResolverobject:func observerMode(didInitiatePurchase product: AdaptyPaywallProduct, onStartPurchase: @MainActor @Sendable @escaping () -> Void, onFinishPurchase: @MainActor @Sendable @escaping () -> Void) { // use the product object to handle the purchase // use the onStartPurchase and onFinishPurchase callbacks to notify AdaptyUI about the process of the purchase } func observerModeDidInitiateRestorePurchases(onStartRestore: @MainActor @Sendable @escaping () -> Void, onFinishRestore: @MainActor @Sendable @escaping () -> Void) { // use the onStartRestore and onFinishRestore callbacks to notify AdaptyUI about the process of the restore }
Sự kiện observerMode(didInitiatePurchase:onStartPurchase:onFinishPurchase:) sẽ thông báo cho bạn biết rằng người dùng đã khởi tạo một giao dịch mua. Bạn có thể kích hoạt flow mua hàng tùy chỉnh của mình để phản hồi callback này.
Sự kiện observerModeDidInitiateRestorePurchases(onStartRestore:onFinishRestore:) sẽ thông báo cho bạn biết rằng người dùng đã khởi tạo khôi phục giao dịch. Bạn có thể kích hoạt flow khôi phục tùy chỉnh của mình để phản hồi callback này.
Ngoài ra, hãy nhớ gọi các callback sau để thông báo cho AdaptyUI về quá trình mua hàng hoặc khôi phục. Điều này cần thiết để paywall hoạt động đúng, chẳng hạn như hiển thị loader:
| Callback | Mô tả |
|---|---|
| onStartPurchase() | Callback cần được gọi để thông báo cho AdaptyUI rằng quá trình mua hàng đã bắt đầu. |
| onFinishPurchase() | Callback cần được gọi để thông báo cho AdaptyUI rằng quá trình mua hàng đã hoàn tất. |
| onStartRestore() | Callback cần được gọi để thông báo cho AdaptyUI rằng quá trình khôi phục đã bắt đầu. |
| onFinishRestore() | Callback cần được gọi để thông báo cho AdaptyUI rằng quá trình khôi phục đã hoàn tất. |
-
Tạo đối tượng cấu hình paywall:
do { let paywallConfiguration = try AdaptyUI.getPaywallConfiguration( forPaywall: <paywall object>, observerModeResolver: <AdaptyObserverModeResolver> ) } catch { // handle the error }Tham số yêu cầu:
| Parameter | Presence | Description |
|---|---|---|
| Paywall | required | Đối tượng AdaptyPaywall để lấy controller cho paywall mong muốn. |
| ObserverModeResolver | required | Đối tượng AdaptyObserverModeResolver bạn đã triển khai ở bước trước. |
-
Khởi tạo paywall trực quan bạn muốn hiển thị bằng cách sử dụng phương thức
.paywallController(for:products:viewConfiguration:delegate:):import AdaptyUI let visualPaywall = AdaptyUI.paywallController( with: <paywall configuration object>, delegate: <AdaptyPaywallControllerDelegate> )
Các tham số yêu cầu:
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| Paywall Configuration | bắt buộc | Một đối tượng AdaptyUI.PaywallConfiguration chứa thông tin hiển thị của paywall. Sử dụng phương thức AdaptyUI.getPaywallConfiguration(forPaywall:locale:). Tham khảo chủ đề Lấy paywall Paywall Builder và cấu hình của chúng để biết thêm chi tiết. |
| Delegate | bắt buộc | Một AdaptyPaywallControllerDelegate để lắng nghe các sự kiện của paywall. Tham khảo chủ đề Xử lý sự kiện paywall để biết thêm chi tiết. |
Trả về:
| Đối tượng | Mô tả |
|---|---|
| AdaptyPaywallController | Một đối tượng đại diện cho màn hình paywall được yêu cầu |
Sau khi đối tượng được tạo thành công, bạn có thể hiển thị nó như sau:
present(visualPaywall, animated: true)Đừng quên liên kết paywall với giao dịch mua hàng. Nếu không, Adapty sẽ không xác định được paywall nguồn của giao dịch mua hàng.
Để hiển thị paywall trực quan trên màn hình thiết bị, sử dụng modifier .paywall trong SwiftUI:
@State var paywallPresented = false
var body: some View {
Text("Hello, AdaptyUI!")
.paywall(
isPresented: $paywallPresented,
paywallConfiguration: <paywall configuration object>,
didPerformAction: { action in
switch action {
case .close:
paywallPresented = false
default:
// Handle other actions
break
}
},
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
didFailRendering: { error in paywallPresented = false }
)
}(empty input — nothing to translate)
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| Paywall Configuration | bắt buộc | Đối tượng AdaptyUI.PaywallConfiguration chứa thông tin hiển thị của paywall. Sử dụng phương thức AdaptyUI.getPaywallConfiguration(forPaywall:locale:). Tham khảo chủ đề Fetch Paywall Builder paywalls and their configuration để biết thêm chi tiết. |
| Products | tùy chọn | Cung cấp một mảng các đối tượng AdaptyPaywallProduct để tối ưu hóa thời điểm hiển thị sản phẩm trên màn hình. Nếu truyền vào nil, AdaptyUI sẽ tự động lấy các sản phẩm cần thiết. |
| TagResolver | tùy chọn | Định nghĩa một dictionary gồm các custom tag và giá trị tương ứ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ể để cá nhân hóa nội dung trong paywall. Tham khảo chủ đề Custom tags in Paywall Builder để biết thêm chi tiết. |
| ObserverModeResolver | tùy chọn | Đối tượng AdaptyObserverModeResolver mà bạn đã triển khai ở bước trước |
Tham số closure:
| Tham số closure | Mô tả |
|---|---|
| didFinishRestore | Nếu Adapty.restorePurchases() thành công, callback này sẽ được gọi. |
| didFailRestore | Nếu Adapty.restorePurchases() thất bại, callback này sẽ được gọi. |
| didFailRendering | Nếu xảy ra lỗi trong quá trình hiển thị giao diện, callback này sẽ được gọi. |
Tham khảo chủ đề iOS - Xử lý sự kiện để biết thêm về các tham số closure khác.
Đừng quên Liên kết paywall với giao dịch mua hàng. Nếu không, Adapty sẽ không xác định được paywall nguồn của giao dịch mua hàng.
Before you start presenting paywalls (Click to Expand)
- Thiết lập tích hợp ban đầu của Adapty với Google Play và với App Store.
- Cài đặt và cấu hình Adapty SDK. Đảm bảo đặt tham số
observerModethànhtrue. Tham khảo hướng dẫn theo từng framework của chúng tôi cho iOS, React Native, Flutter, và Unity. - Tạo sản phẩm trong Adapty Dashboard.
- Cấu hình paywall, gán sản phẩm vào chúng, và tùy chỉnh bằng Paywall Builder trong Adapty Dashboard.
- Tạo placement và gán paywall vào chúng trong Adapty Dashboard.
- Lấy paywall Paywall Builder và cấu hình của chúng trong mã ứng dụng di động của bạn.
-
Triển khai đối tượng
AdaptyObserverModeDelegate:func paywallController(_ controller: AdaptyPaywallController, didInitiatePurchase product: AdaptyPaywallProduct, onStartPurchase: @escaping () -> Void, onFinishPurchase: @escaping () -> Void) { // use the product object to handle the purchase // use the onStartPurchase and onFinishPurchase callbacks to notify AdaptyUI about the process of the purchase }
paywallController(_:didInitiatePurchase:onStartPurchase:onFinishPurchase:) sẽ thông báo cho bạn biết rằng người dùng đã bắt đầu một giao dịch mua. Bạn có thể kích hoạt flow mua hàng tùy chỉnh của mình để phản hồi sự kiện này.
Ngoài ra, hãy nhớ gọi các callback sau để thông báo cho AdaptyUI về tiến trình của giao dịch mua. Điều này cần thiết để paywall hoạt động đúng cách, chẳng hạn như hiển thị loader và các tác vụ khác:
| Callback | Mô tả |
|---|---|
| onStartPurchase | Callback cần được gọi để thông báo cho AdaptyUI rằng quá trình mua hàng đã bắt đầu. |
| onFinishPurchase | Callback cần được gọi để thông báo cho AdaptyUI rằng quá trình mua hàng đã hoàn tất. |
- Khởi tạo paywall trực quan bạn muốn hiển thị bằng phương thức
.paywallController(for:products:viewConfiguration:delegate:observerModeDelegate:):
import AdaptyUI
let visualPaywall = AdaptyUI.paywallController(
for: <paywall object>,
products: <paywall products array>,
viewConfiguration: <LocalizedViewConfiguration>,
delegate: <AdaptyPaywallControllerDelegate>
observerModeDelegate: <AdaptyObserverModeDelegate>
)Các tham số yêu cầu:
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| Paywall | bắt buộc | Đối tượng AdaptyPaywall để lấy controller cho paywall mong muốn. |
| Products | tùy chọn | Cung cấp mảng các đối tượng AdaptyPaywallProduct để tối ưu thời điểm hiển thị sản phẩm trên màn hình. Nếu truyền nil, AdaptyUI sẽ tự động tải các sản phẩm cần thiết. |
| ViewConfiguration | bắt buộc | Đối tượng AdaptyUI.LocalizedViewConfiguration chứa thông tin hiển thị chi tiết của paywall. Sử dụng phương thức AdaptyUI.getViewConfiguration(paywall:locale:). Tham khảo chủ đề Fetch Paywall Builder paywalls and their configuration để biết thêm chi tiết. |
| Delegate | bắt buộc | AdaptyPaywallControllerDelegate để lắng nghe các sự kiện của paywall. Tham khảo chủ đề Handling paywall events để biết thêm chi tiết. |
| ObserverModeDelegate | bắt buộc | Đối tượng AdaptyObserverModeDelegate mà bạn đã triển khai ở bước trước |
| TagResolver | tùy chọn | Định nghĩa một dictionary gồm các custom tag và giá trị tương ứng 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ể để cá nhân hóa nội dung trong paywall. Tham khảo chủ đề Custom tags in Paywall Builder để biết thêm chi tiết. |
Trả về:
| Đối tượng | Mô tả |
|---|---|
| AdaptyPaywallController | Một đối tượng đại diện cho màn hình paywall được yêu cầu |
Sau khi đối tượng được tạo thành công, bạn có thể hiển thị nó như sau:
present(visualPaywall, animated: true)Đừng quên Liên kết paywall với giao dịch mua hàng. Nếu không, Adapty sẽ không xác định được paywall nguồn của giao dịch mua hàng.
Để hiển thị paywall trực quan trên màn hình thiết bị, sử dụng modifier .paywall trong SwiftUI:
@State var paywallPresented = false
var body: some View {
Text("Hello, AdaptyUI!")
.paywall(
isPresented: $paywallPresented,
paywall: <paywall object>,
configuration: <LocalizedViewConfiguration>,
didPerformAction: { action in
switch action {
case .close:
paywallPresented = false
default:
// Handle other actions
break
}
},
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
didFailRendering: { error in paywallPresented = false },
observerModeDidInitiatePurchase: { product, onStartPurchase, onFinishPurchase in
// use the product object to handle the purchase
// use the onStartPurchase and onFinishPurchase callbacks to notify AdaptyUI about the process of the purchase
},
)
}(empty input — nothing to translate)
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| Paywall | bắt buộc | Một đối tượng AdaptyPaywall để lấy controller cho paywall mong muốn. |
| Product | tùy chọn | Cung cấp một mảng các đối tượng AdaptyPaywallProduct để tối ưu hóa thời điểm hiển thị sản phẩm trên màn hình. Nếu truyền nil, AdaptyUI sẽ tự động tải các sản phẩm cần thiết. |
| Configuration | bắt buộc | Một đối tượng AdaptyUI.LocalizedViewConfiguration chứa thông tin hiển thị của paywall. Sử dụng phương thức AdaptyUI.getViewConfiguration(paywall:locale:). Tham khảo chủ đề Tải paywall Paywall Builder và cấu hình của chúng để biết thêm chi tiết. |
| TagResolver | tùy chọn | Định nghĩa một từ điển các thẻ tùy chỉnh và giá trị tương ứng. Các thẻ tùy chỉnh đóng vai trò là placeholder trong nội dung paywall, được thay thế động bằng các chuỗi cụ thể để cá nhân hóa nội dung trong paywall. Tham khảo chủ đề Custom tags in paywall builder để biết thêm chi tiết. |
Closure parameters:
| Tham số Closure | Mô tả |
|---|---|
| didFinishRestore | Nếu Adapty.restorePurchases() thành công, callback này sẽ được gọi. |
| didFailRestore | Nếu Adapty.restorePurchases() thất bại, callback này sẽ được gọi. |
| didFailRendering | Nếu xảy ra lỗi trong quá trình render giao diện, callback này sẽ được gọi. |
| observerModeDidInitiatePurchase | Callback này được gọi khi người dùng bắt đầu thực hiện một giao dịch mua. |
Tham khảo chủ đề iOS - Xử lý sự kiện để biết các tham số closure khác.
Đừng quên Liên kết paywall với giao dịch mua. Nếu không, Adapty sẽ không xác định được paywall nguồn của giao dịch mua đó.