Kotlin Multiplatform SDKのエラーハンドリング
このページでは、Adapty Kotlin Multiplatform SDKのエラーハンドリングについて説明します。
エラー処理の基本
Adapty SDKのメソッドはサスペンド関数で、AdaptyResultを返します。これは成功またはエラーのいずれかです。onSuccessとonErrorで両方のケースを処理します:
Adapty.getProfile()
.onSuccess { profile ->
// Handle success
}
.onError { error ->
// Handle error
println("Adapty error: ${error.message}")
}
AdaptyResultはシールドクラスなので、結果を値として必要なときに直接分岐することもできます:
when (val result = Adapty.getProfile()) {
is AdaptyResult.Success -> {
val profile = result.value
// Handle success
}
is AdaptyResult.Error -> {
val error = result.error
// Handle error
}
}
よくあるエラーコード
AdaptyError.code は数値ではなく AdaptyErrorCode 列挙型の値です。数値コードではなく、列挙型の定数と比較してください。以下の数値は、ログやサポートチケットに記録される際に使われるものとして参考情報として掲載しています。
| エラーコード | 番号 | 説明 | 解決策 |
|---|---|---|---|
AdaptyErrorCode.NO_PRODUCT_IDS_FOUND | 1000 | ペイウォール内のプロダクトがいずれもストアで利用できません。 | コード-1000 noProductIDsFoundエラーの修正方法を参照してください。 |
AdaptyErrorCode.CANT_MAKE_PAYMENTS | 1003 | このデバイスではアプリ内課金が許可されていません。 | コード-1003 cantMakePaymentsエラーの修正方法を参照してください。 |
AdaptyErrorCode.PRODUCT_NOT_FOUND | 22 | 購入しようとしたプロダクトがストアで利用できません。 | プロダクトがストアおよびAdapty ダッシュボードで設定されているか確認してください。 |
AdaptyErrorCode.NETWORK_FAILED | 2005 | ネットワークリクエストが失敗しました。 | ユーザーに接続を確認するよう促すか、再度呼び出してください。 |
AdaptyErrorCode.ADAPTY_NOT_INITIALIZED | 20 | 呼び出し前にSDKがアクティベートされていませんでした。 | 他のSDK呼び出しを行う前に、Adapty.activateが完了するまで待機してください。 |
AdaptyErrorCode の全コード一覧については、SDK モデルリファレンスを参照してください。
特定のエラーの処理
ネットワークエラー
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)
}
}
}
購入エラー
makePurchase は失敗と結果を別々に報告します。AdaptyResult.Error は呼び出し自体が失敗したことを意味し、成功した結果は AdaptyPurchaseResult を返します。これにより、ユーザーが購入を完了したか、キャンセルしたか、保留中のままにしたかを確認できます。
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)
}
}
エラー回復戦略
ネットワークエラー時のリトライ
SDK のメソッドはサスペンド関数であるため、リトライループは delay を挟んだシンプルなループで実装できます。
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
}
キャッシュデータへのフォールバック
フローを自分でキャッシュする必要はありません。Adapty SDK がデバイス上にキャッシュし、ネットワークに失敗した場合はキャッシュされたコピーを返します。独自のキャッシュを実装する代わりに、フェッチポリシーを渡してください。
Adapty.getFlow(
placementId = "YOUR_PLACEMENT_ID",
fetchPolicy = AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad
)
.onSuccess { flow ->
// Use the flow
}
.onError { error ->
showErrorMessage(error.message)
}
ReturnCacheDataElseLoad を使用すると、不安定な接続環境のユーザーはフローをより速く取得できますが、最新バージョンが表示されない場合があります。ネットワークもキャッシュもフローを返せない場合、SDK はアプリにバンドルしたフォールバックファイルを使用します。