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ỗiSốMô tảGiải pháp
AdaptyErrorCode.NO_PRODUCT_IDS_FOUND1000Khô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_PAYMENTS1003In-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_FOUND22Sả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_FAILED2005Yê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_INITIALIZED20SDK 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.

Các bước tiếp theo