---
title: SDKのトラブルシューティング
description: エミュレーター接続、ログインコールバック、権限エラー、重複送信を確認します。
---

# SDKのトラブルシューティング {#sdk-troubleshooting}

## エミュレーターで確認する {#test-with-the-emulator}

SDKリポジトリのサンプルアプリでローカルサーバーとSDKの流れを確認できます。ローカルの開発者コンソールで`opentester-sample://callback`を登録し、テスターの参加を承認します。

Android SDKとJDKを用意して実行します。

```sh
cd opentester-android-sdk
./gradlew :opentester:testDebugUnitTest :sample:assembleDebug
adb install -r sample/build/outputs/apk/debug/sample-debug.apk
```

`adb`がPATHにない場合はAndroid SDKの`platform-tools/adb`を使います。サンプルの既定値はWebが`http://10.0.2.2:3000`、APIが`http://10.0.2.2:4000`です。APIの許可OriginにそのWebオリジンを含めます。

1. コンソールのアプリIDを入力します。
2. ブラウザーで承認済みの**テスターアカウント**にログインします。
3. アプリ接続を承認してサンプルに戻ります。
4. 権限確認とバグ・改善意見の送信を試します。
5. 開発者コンソールで報告を確認します。

USB接続の実機では以下を実行し、`http://localhost:3000`と`http://localhost:4000`を使えます。

```sh
adb reverse tcp:3000 tcp:3000
adb reverse tcp:4000 tcp:4000
```

ローカルHTTPとカスタムコールバックはdebug manifestでのみ許可します。配布アプリでは[HTTPS App Links](/ja/sdk/authentication)を設定してください。

## ログイン画面は開くがアプリに戻らない {#login-opens-but-does-not-return-to-the-app}

- コンソールのコールバック、`OpenTesterConfig.redirectUri`、manifestのhost/pathを一致させます。
- `assetlinks.json`のapplication IDと署名証明書がインストール済みアプリと一致するか確認します。
- Activityを`exported="true"`にし、`VIEW`、`DEFAULT`、`BROWSABLE`を宣言します。
- サンプルのカスタムschemeはローカル開発用です。本番ではHTTPSが必須です。

## 進行中のログインがない、またはstateが不正 {#no-pending-login-or-invalid-state}

ログインを開始したSDKインスタンスでコールバックを処理します。`Application`などに保持し、プロセス終了後は再ログインします。

コールバックは一度だけ処理し、Intentの`data`を消去します。`createAuthenticationUri()`を繰り返すとstateが置き換わります。コード交換のエラーやキャンセル後もログインからやり直します。

## 401または403が返る {#401-or-403-responses}

| 応答 | 確認事項 |
| --- | --- |
| `401` | コードの期限切れ・使用済み、またはトークン期限切れ。再ログイン |
| `403` | 対象アプリの参加状態が`approved`か確認 |

端末ブラウザーとデスクトップではアカウントが異なる場合があります。所有者とテスターを混同しないでください。Google Group加入だけではSDK権限は付与されません。承認取り消し後の失敗は正常で、`401`と`403`はSDKのメモリ内セッションも削除します。

## 通信エラーや不正なレスポンス {#network-errors-or-invalid-responses}

- `apiBaseUrl`に`/api/v1`を追加しないでください。
- `webBaseUrl`にはAPIではなくWebサイトを指定します。
- エミュレーターから開発マシンには`10.0.2.2`で接続します。
- ローカルHTTPには`allowInsecureLocalhost = true`とAndroidのdebug用通信設定の両方が必要です。任意のLAN HTTPアドレスは許可されません。
- プロキシによるリダイレクトやHTMLログイン画面への置き換えを確認します。SDKはリダイレクトを追いません。

接続タイムアウトは10秒、読み取りは15秒です。オフライン時の権限確認を成功として扱わないでください。

## 再試行すると同じ報告が返る {#a-retry-returns-the-same-report}

同じアプリ・テスター・`clientRequestId`では、内容が変わっても既存報告を返します。新規報告は新しいUUID、再試行は元のUUIDを使います。重複ができる場合は毎回`BugReport`や`FeedbackReport`を作り直していないか確認します。[再試行](/ja/sdk/feedback#retry)を参照してください。

## エラーが自動送信されない {#errors-are-not-submitted-automatically}

テキスト送信には`submitBug()`または`submitFeedback()`を呼びます。未処理例外収集、自動クラッシュ報告、添付、セッション録画、オフラインキューは未実装です。

## Mavenの依存関係が見つからない {#maven-dependency-cannot-be-found}

`app.opentester:android-sdk:0.1.0`を使い、`settings.gradle.kts`に`mavenCentral()`を追加します。Kotlinパッケージ`dev.opentester.sdk`とMaven group IDは異なります。JitPackでは`https://jitpack.io`と`com.github.opentesterapp:opentester-android-sdk:v0.1.0`を併せて指定します。

## releaseビルドでSDKクラスが見つからない {#release-build-cannot-find-sdk-classes}

`debugImplementation`はreleaseでは使えません。テスト用Activity、Application、manifestを`src/debug/`またはテストflavorのソースセットに置き、共通コードにはビルド別の実装を注入します。サンプルはSDK検証用で、一般公開用テンプレートではありません。
