Kotlin APIリファレンス
パッケージはdev.opentester.sdkです。SDK 0.1.0を対象とします。
OpenTesterConfig
data class OpenTesterConfig(
val appId: String,
val apiBaseUrl: String,
val webBaseUrl: String,
val redirectUri: String,
val allowInsecureLocalhost: Boolean = false,
val languageTag: String = "en",
)| フィールド | 説明 |
|---|---|
appId | コンソールで発行したアプリID。サーバーはUUIDを要求 |
apiBaseUrl | APIオリジン。例: https://api.opentester.app。SDKが/api/v1を追加 |
webBaseUrl | Webオリジン。SDKがログイン用の/sdk/authorizeを追加 |
redirectUri | 登録済みHTTPS App Link。query、fragment、ユーザー情報は不可 |
allowInsecureLocalhost | 開発用ローカルHTTPとサンプルコールバックを許可。既定はfalse |
languageTag | SDKメッセージ、APIのAccept-Language、ブラウザー認証の言語。既定はen |
オリジンにパス、認証情報、query、fragmentは含めません。通常はHTTPSが必須です。allowInsecureLocalhost = trueの場合、HTTPはlocalhost、127.0.0.1、10.0.2.2、[::1]のみ許可します。Androidの平文通信ポリシーも別途設定します。
開発用カスタムschemeはopentester-sampleのみ許可します。配布時は検証済みHTTPS App Linksを使います。不正な設定はコンストラクターで例外になります。
SDKの対応言語は英語、韓国語、日本語、ドイツ語、フランス語、ヒンディー語、ブラジルポルトガル語、トルコ語、インドネシア語です。例: ko-KR、ja-JP、pt-BR。未対応言語は英語にフォールバックします。ユーザーが書いた報告は翻訳しません。
OpenTester
class OpenTester(val config: OpenTesterConfig)Activity再生成後も1つのインスタンスを保持します。通信関数はDispatchers.IOを使い、接続タイムアウトは10秒、読み取りは15秒です。HTTPリダイレクトには追従しません。
| 関数 | 戻り値 | 動作 |
|---|---|---|
authenticate(activity: Activity) | Unit | 新規認証を開始し、ブラウザーのCustom Tabを開く。メインスレッドで呼ぶ |
createAuthenticationUri() | Uri | 独自のシステムブラウザー起動処理に渡す新規認証URIを作成 |
suspend handleCallback(callback: Uri) | AccessGrant | コールバック検証、コード交換、SDKセッション保存 |
suspend checkAccess() | AccessGrant | サーバーで現在の参加権限を確認 |
suspend submitBug(report: BugReport) | SubmittedIssue | バグを送信 |
suspend submitFeedback(report: FeedbackReport) | SubmittedIssue | 改善意見を送信 |
logout() | Unit | メモリ内トークンと進行中の認証を削除 |
authenticate()とcreateAuthenticationUri()は既存SDKセッションを初期化します。logout()はブラウザーセッションを終了しません。認証ガイドを参照してください。
AccessGrantとTester
data class Tester(
val id: String,
val name: String,
val email: String,
)
data class AccessGrant(
val appId: String,
val campaignId: String,
val user: Tester,
)AccessGrantは認証・権限確認時点の承認結果です。campaignIdはアプリのテストキャンペーンIDです。トークンはSDKメモリ内に保持され、このモデルには含まれません。メールなどのテスター情報を不要にログへ残さないでください。
BugReport
data class BugReport(
val title: String,
val description: String,
val steps: String = "",
val expected: String = "",
val actual: String = "",
val appVersion: String,
val deviceInfo: String,
val clientRequestId: String = UUID.randomUUID().toString(),
)appVersionとdeviceInfoには既定値がありません。端末情報を送らない場合は""を指定します。clientRequestIdはjava.util.UUIDで生成され、再試行時も同じ値を使います。
FeedbackReport
data class FeedbackReport(
val title: String,
val description: String,
val appVersion: String,
val deviceInfo: String = "",
val clientRequestId: String = UUID.randomUUID().toString(),
)改善意見にはsteps、expected、actualがありません。両モデルの制限と重複処理は入力制限を参照してください。
SubmittedIssue
data class SubmittedIssue(
val id: String,
val title: String,
val status: String,
)新規報告はopenです。重複リクエストには既存報告の現在の状態を返す場合があります。文字列としてopen、confirmed、fixed、closedを返します。
OpenTesterException
以下の型はすべてOpenTesterExceptionを継承します。
| 型 | 追加フィールド | 意味と対処 |
|---|---|---|
NotAuthenticated | なし | SDKセッションなし・期限切れ。ログインを開始 |
InvalidCallback | なし | 認証なし・期限切れ・コールバックやstateの不一致。新規ログイン |
Api | statusCode: Int | HTTP失敗。400は入力確認、401は再ログイン、403は参加確認 |
Network | 原因例外 | 接続失敗・タイムアウト。同じUUIDで報告を再試行 |
InvalidResponse | 原因例外 | JSONやモデルの解析失敗。サーバーURLとバージョンを確認 |
不正な設定や空のタイトル・説明は、この階層以外の入力検証例外になる場合があります。ホストアプリのエラーとコルーチンのキャンセルも別途処理します。