Xử lý lỗi trong Kotlin Multiplatform SDK
Trang này đề cập đến việc xử lý lỗi trong Adapty Kotlin Multiplatform SDK.
Xử lý lỗi cơ bản
Các phương thức của Adapty SDK là suspend function trả về AdaptyResult, là thành công hoặc lỗi. Xử lý cả hai trường hợp bằng onSuccess và onError:
Adapty.getProfile()
.onSuccess { profile ->
// Handle success
}
.onError { error ->
// Handle error
println("Adapty error: ${error.message}")
}
AdaptyResult là một sealed class, vì vậy bạn cũng có thể phân nhánh trực tiếp trên nó khi cần kết quả dưới dạng giá trị:
when (val result = Adapty.getProfile()) {
is AdaptyResult.Success -> {
val profile = result.value
// Handle success
}
is AdaptyResult.Error -> {
val error = result.error
// Handle error
}
}
Mã lỗi thường gặp
AdaptyError.code là giá trị enum AdaptyErrorCode, không phải số — hãy so sánh với hằng số enum, không phải với mã số. Các con số dưới đây chỉ được hiển thị vì đó là thứ thường xuất hiện trong dòng log hoặc ticket hỗ trợ.
| Mã lỗi | Số | Mô tả | Giải pháp |
|---|---|---|---|
AdaptyErrorCode.NO_PRODUCT_IDS_FOUND | 1000 | Không có sản phẩm nào trong paywall khả dụng trên cửa hàng. | Xem Cách sửa lỗi Code-1000 noProductIDsFound. |
AdaptyErrorCode.CANT_MAKE_PAYMENTS | 1003 | In-app purchase không được phép trên thiết bị này. | Xem Cách sửa lỗi Code-1003 cantMakePayments. |
AdaptyErrorCode.PRODUCT_NOT_FOUND | 22 | Sản phẩm yêu cầu mua không khả dụng trên cửa hàng. | Kiểm tra xem sản phẩm đã được cấu hình trong cửa hàng và trên Adapty Dashboard chưa. |
AdaptyErrorCode.NETWORK_FAILED | 2005 | Yêu cầu mạng thất bại. | Yêu cầu người dùng kiểm tra kết nối, hoặc thử lại lần nữa. |
AdaptyErrorCode.ADAPTY_NOT_INITIALIZED | 20 | SDK chưa được kích hoạt trước khi gọi. | Chờ Adapty.activate hoàn tất trước khi thực hiện bất kỳ lệnh gọi SDK nào khác. |
Để xem danh sách đầy đủ các mã lỗi, hãy tham khảo AdaptyErrorCode trong tài liệu tham khảo mô hình SDK.
Xử lý các lỗi cụ thể
Lỗi mạng
Adapty.getFlow("YOUR_PLACEMENT_ID")
.onSuccess { flow ->
// Use the flow
}
.onError { error ->
when (error.code) {
AdaptyErrorCode.NETWORK_FAILED -> {
// Network error - show offline message
showOfflineMessage()
}
else -> {
showErrorMessage(error.message)
}
}
}
Lỗi khi mua hàng
makePurchase báo cáo lỗi và kết quả riêng biệt. AdaptyResult.Error có nghĩa là lệnh gọi thất bại; kết quả thành công trả về AdaptyPurchaseResult cho biết người dùng đã hoàn tất giao dịch, hủy bỏ, hay để giao dịch ở trạng thái chờ xử lý:
Adapty.makePurchase(product)
.onSuccess { purchaseResult ->
when (purchaseResult) {
is AdaptyPurchaseResult.Success -> showSuccessMessage()
AdaptyPurchaseResult.UserCanceled -> {
// The user dismissed the store sheet — not an error
}
AdaptyPurchaseResult.Pending -> {
// Awaiting an out-of-band payment, such as a prepaid plan
showPendingMessage()
}
}
}
.onError { error ->
when (error.code) {
AdaptyErrorCode.CANT_MAKE_PAYMENTS -> showPaymentNotAvailableMessage()
AdaptyErrorCode.PRODUCT_NOT_FOUND -> showProductNotAvailableMessage()
else -> showPurchaseErrorMessage(error.message)
}
}
Chiến lược khôi phục lỗi
Thử lại khi gặp lỗi mạng
Vì các phương thức SDK là suspend function, vòng lặp thử lại chỉ đơn giản là một vòng lặp thông thường với delay giữa các lần thử:
suspend fun getFlowWithRetry(placementId: String, maxRetries: Int = 3): AdaptyFlow? {
repeat(maxRetries) { attempt ->
when (val result = Adapty.getFlow(placementId)) {
is AdaptyResult.Success -> return result.value
is AdaptyResult.Error -> {
if (result.error.code != AdaptyErrorCode.NETWORK_FAILED) {
showErrorMessage(result.error.message)
return null
}
delay(1000L * (attempt + 1))
}
}
}
return null
}
Dự phòng về dữ liệu đã được cache
Bạn không cần tự cache các flow. Adapty SDK đã tự động cache chúng trên thiết bị và trả về bản cache khi mạng bị lỗi, vì vậy hãy truyền vào một fetch policy thay vì tự viết logic cache:
Adapty.getFlow(
placementId = "YOUR_PLACEMENT_ID",
fetchPolicy = AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad
)
.onSuccess { flow ->
// Use the flow
}
.onError { error ->
showErrorMessage(error.message)
}
Với ReturnCacheDataElseLoad, người dùng có kết nối không ổn định sẽ nhận được flow nhanh hơn, nhưng có thể không thấy phiên bản mới nhất. Nếu cả mạng lẫn bộ nhớ cache đều không trả về flow, SDK sẽ tự động dùng tệp dự phòng mà bạn đã đóng gói kèm theo ứng dụng.