Kotlin Multiplatform SDKのエラー処理
エージェントツールをインストール
AI コーディングツールから Adapty SDK の連携をまるごと実行できます。 詳細
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
git clone https://github.com/adaptyteam/adapty-sdk-integration-skill.git
cp -r adapty-sdk-integration-skill/skills/* ~/.copilot/skills/
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
git clone https://github.com/adaptyteam/adapty-sdk-integration-skill.git
cp -r adapty-sdk-integration-skill/skills/* ~/.agents/skills/
スキル対応の任意のエージェントにインストールできます。更新するには npx skills update を実行してください。
npx skills add adaptyteam/adapty-sdk-integration-skill --all
インストール後、プロジェクトでスキルを実行します:
/adapty-sdk-integration
このページでは、Adapty Kotlin Multiplatform SDKにおけるエラー処理について説明します。
エラー処理の基本
Adapty SDK のすべてのメソッドは成功またはエラーのいずれかの結果を返します。必ず両方のケースを処理してください:
Adapty.getProfile { result ->
when (result) {
is AdaptyResult.Success -> {
val profile = result.value
// Handle success
}
is AdaptyResult.Error -> {
val error = result.error
// Handle error
Log.e("Adapty", "Error: ${error.message}")
}
}
} Adapty.getProfile(result -> {
if (result instanceof AdaptyResult.Success) {
AdaptyProfile profile = ((AdaptyResult.Success<AdaptyProfile>) result).getValue();
// Handle success
} else if (result instanceof AdaptyResult.Error) {
AdaptyError error = ((AdaptyResult.Error) result).getError();
// Handle error
Log.e("Adapty", "Error: " + error.getMessage());
}
}); よくあるエラーコード
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.getPaywall("main") { result ->
when (result) {
is AdaptyResult.Success -> {
val paywall = result.value
// Use paywall
}
is AdaptyResult.Error -> {
val error = result.error
when (error.code) {
AdaptyErrorCode.NETWORK_FAILED -> {
// Network error - show offline message
showOfflineMessage()
}
else -> {
// Other errors
showErrorMessage(error.message)
}
}
}
}
} Adapty.getPaywall("main", result -> {
if (result instanceof AdaptyResult.Success) {
AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
// Use paywall
} else if (result instanceof AdaptyResult.Error) {
AdaptyError error = ((AdaptyResult.Error) result).getError();
switch (error.getCode()) {
case NETWORK_FAILED:
// Network error - show offline message
showOfflineMessage();
break;
default:
// Other errors
showErrorMessage(error.getMessage());
break;
}
}
}); 購入エラー
product.makePurchase { result ->
when (result) {
is AdaptyResult.Success -> {
val purchase = result.value
// Purchase successful
showSuccessMessage()
}
is AdaptyResult.Error -> {
val error = result.error
when (error.code) {
AdaptyErrorCode.CANT_MAKE_PAYMENTS -> {
// Can't make payments
showPaymentNotAvailableMessage()
}
AdaptyErrorCode.PRODUCT_NOT_FOUND -> {
// Product not available
showProductNotAvailableMessage()
}
else -> {
// Other purchase errors
showPurchaseErrorMessage(error.message)
}
}
}
}
} product.makePurchase(result -> {
if (result instanceof AdaptyResult.Success) {
AdaptyPurchase purchase = ((AdaptyResult.Success<AdaptyPurchase>) result).getValue();
// Purchase successful
showSuccessMessage();
} else if (result instanceof AdaptyResult.Error) {
AdaptyError error = ((AdaptyResult.Error) result).getError();
switch (error.getCode()) {
case CANT_MAKE_PAYMENTS:
// Can't make payments
showPaymentNotAvailableMessage();
break;
case PRODUCT_NOT_FOUND:
// Product not available
showProductNotAvailableMessage();
break;
default:
// Other purchase errors
showPurchaseErrorMessage(error.getMessage());
break;
}
}
}); エラー回復戦略
ネットワークエラー時のリトライ
fun getPaywallWithRetry(placementId: String, maxRetries: Int = 3) {
var retryCount = 0
fun attemptGetPaywall() {
Adapty.getPaywall(placementId) { result ->
when (result) {
is AdaptyResult.Success -> {
val paywall = result.value
// Use paywall
}
is AdaptyResult.Error -> {
val error = result.error
if (error.code == AdaptyErrorCode.NETWORK_FAILED && retryCount < maxRetries) {
// Network error - retry
retryCount++
Handler(Looper.getMainLooper()).postDelayed({
attemptGetPaywall()
}, 1000 * retryCount) // Exponential backoff
} else {
// Max retries reached or other error
showErrorMessage(error.message)
}
}
}
}
}
attemptGetPaywall()
} public void getPaywallWithRetry(String placementId, int maxRetries) {
AtomicInteger retryCount = new AtomicInteger(0);
Runnable attemptGetPaywall = new Runnable() {
@Override
public void run() {
Adapty.getPaywall(placementId, result -> {
if (result instanceof AdaptyResult.Success) {
AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
// Use paywall
} else if (result instanceof AdaptyResult.Error) {
AdaptyError error = ((AdaptyResult.Error) result).getError();
if (error.getCode() == AdaptyErrorCode.NETWORK_FAILED && retryCount.get() < maxRetries) {
// Network error - retry
retryCount.incrementAndGet();
new Handler(Looper.getMainLooper()).postDelayed(this, 1000 * retryCount.get());
} else {
// Max retries reached or other error
showErrorMessage(error.getMessage());
}
}
});
}
};
attemptGetPaywall.run();
} キャッシュデータへのフォールバック
class PaywallManager {
private var cachedPaywall: AdaptyPaywall? = null
fun getPaywall(placementId: String) {
Adapty.getPaywall(placementId) { result ->
when (result) {
is AdaptyResult.Success -> {
val paywall = result.value
cachedPaywall = paywall
showPaywall(paywall)
}
is AdaptyResult.Error -> {
val error = result.error
if (error.code == AdaptyErrorCode.NETWORK_FAILED && cachedPaywall != null) {
// Network error - use cached paywall
showPaywall(cachedPaywall!!)
showOfflineIndicator()
} else {
// No cache available or other error
showErrorMessage(error.message)
}
}
}
}
}
} public class PaywallManager {
private AdaptyPaywall cachedPaywall;
public void getPaywall(String placementId) {
Adapty.getPaywall(placementId, result -> {
if (result instanceof AdaptyResult.Success) {
AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
cachedPaywall = paywall;
showPaywall(paywall);
} else if (result instanceof AdaptyResult.Error) {
AdaptyError error = ((AdaptyResult.Error) result).getError();
if (error.getCode() == AdaptyErrorCode.NETWORK_FAILED && cachedPaywall != null) {
// ネットワークエラー - キャッシュされたペイウォールを使用
showPaywall(cachedPaywall);
showOfflineIndicator();
} else {
// キャッシュが利用できないか、その他のエラー
showErrorMessage(error.getMessage());
}
}
});
}
}