# デバイス上のアプリのトラブルシューティング

デバイス上のアプリに関する既知の問題の解決方法をご紹介します。

- **アプリが Stripe にアップロードされない**

  APK が大きすぎる場合や、アップロードのインターネット速度が遅すぎる場合は、[Files](https://docs.stripe.com/api/files.md) API を使用して APK をアップロードするときにタイムアウトエラーが発生することがあります。Stripe は、サーバーに 45 秒のタイムアウトを適用しており、アプリがその時間内にアップロードされない場合にエラーを生成します。この問題を解決するには、より快適なインターネット環境を備えたサーバー (AWS EC2 インスタンス、別の VPS など) に APK をアップロードして、そこから Stripe にアップロードします。お使いのサーバーと Stripe サーバー間のネットワーク接続は、家庭またはオフィスから ISP 経由で Stripe に接続するよりはるかに高速です。

- **サンドボックスで承認された本番環境用アプリの再送信**

  サンドボックスでアプリの承認を取得し、そのアプリを本番環境で使用する場合は、承認のために再度送信する必要があります。[アプリの審査プロセス](https://docs.stripe.com/terminal/features/apps-on-devices/app-review.md)は、サンドボックスと本番環境の両方で同じです。自動承認を受けるには、必ず同じ APK をアップロードしてください。

- **アプリからデバイス管理者設定画面にアクセスする**

  デフォルトでは、デバイスユーザーは、画面の左端からスワイプし、**設定**をタップすることで管理者設定にアクセスできます。この方法は、デフォルトの起動アプリがサードパーティーアプリの場合は使用できません。`stripe://settings/` URI を使用して管理者設定にディープリンクし、**アクティビティー** または**フラグメント**で以下のコードを使用することで、アプリから URI を起動できます。

  #### Kotlin

  ```kotlin
  startActivity(
    Intent(Intent.ACTION_VIEW)
      .setData(Uri.parse("stripe://settings/"))
  )
  ```

- **DevKit のデバイス言語の更新**

  DevKit のリーダーアプリでは現在、デバイスの言語を更新することはできません。デバイスの言語は、Android 設定アプリから変更できます。次のように `adb` を使用して、Android 設定アプリを起動してください。

  ```
  $ adb shell am start -a android.settings.SETTINGS
  ```

- **Stripe デバイスでの Android 設定**

  セキュリティと信頼性の理由から、本番環境の Stripe デバイスでは Android 設定アプリがブロックされます。このため、Stripe デバイスでは Android 設定を起動したり、ディープリンクしたりすることはできません。

- **Stripe Reader S700/S710 で複数のアプリを実行する**

  Stripe Reader S700/S710 は複数のアプリの実行をサポートしていますが、アプリランチャーは提供されていません。アプリを切り替えられるようにするには、アプリ内に機能を構築する必要があります。アプリをデプロイする際に `default_kiosk_application` を指定すると、デバイスが更新を確認するときと決済後に起動するアプリを設定できます。ダッシュボードを使用して、1 つのデバイスに複数のアプリを設定することはできません。

- **Stripe デバイスに ウェブアプリをデプロイする**

  ウェブアプリをパッケージ化して、Stripe デバイスで実行できます。Android との互換性を確保するためにウェブアプリを変更し、Android アプリケーションパッケージ (APK) を生成するには、[Cordova](https://cordova.apache.org/) などのフレームワークを使用します。その後、Stripe ダッシュボードで [APK をアップロード](https://docs.stripe.com/terminal/features/apps-on-devices/submit.md)できます。

  フレームワークは Stripe や [Android Terminal SDK](https://stripe.dev/stripe-terminal-android/) を認識しないため、ウェブアプリと SDK の間に JavaScript ブリッジを作成して JavaScript からコマンドを送信する必要があります。

  また、[サーバー主導型の実装](https://docs.stripe.com/terminal/payments/setup-integration.md)を使用して支払いを回収することもできます。この場合、Terminal ハンドオフクライアントライブラリや JavaScript ブリッジを使用する必要はありません。この実装により、Stripe はすべての支払い回収コマンドとデバイスとの通信を処理できます。

- **アプリでの継続的な再起動**

  Stripe Terminal のカードリーダーは、クラッシュが発生するとデフォルトのアプリを再起動します。この動作が示すことは、本番環境と DevKit デバイスで異なります。

  - 本番環境: アプリを本番環境デバイスのデフォルトのアプリとして設定する場合、クラッシュが発生するとアプリが自動的に再起動します。初期化中にアプリがクラッシュすると (例: データベース移行時の欠落や破損など)、デバイスがクラッシュループに入ることがあります。

  - DevKit: Stripe 決済アプリを DevKit デバイスのデフォルトのアプリとして設定する場合、アプリはデバイスのキューに入れられ、その後プライマリーアプリになります。アプリがクラッシュすると、代わりに Stripe 決済アプリが再起動します。

- **多数の明細項目を含む決済を処理するとアプリがクラッシュする**

  大量の明細項目のある決済を処理しようとしたときにアプリがクラッシュする場合、その原因はメモリである可能性があります。Android OS では、アクティビティの状態を保存する際に、プロセス間通信 (IPC) で送信されるデータ量が 500 KB に制限されています。アプリのクラッシュを防ぐためには、データをメモリ上に保管するのではなく、データベースなどに保存することを検討してください。

- **デプロイされたアプリのバグ**

  すでにデプロイされているアプリにバグが見つかった場合は、アプリの問題を修正し、新しいバージョンをアップロードしてから[アプリをデプロイ](https://docs.stripe.com/terminal/features/apps-on-devices/deploy-with-api.md)できます。

- **本番環境のリーダーでアプリのログを表示する**

  Stripe は、本番環境のリーダーのログを公開しません。Stripe では、可観測性を Sentry の実装に依存しています。

- **DevKit 上でサイドロードした POS アプリが、決済取引完了後に起動しなくなった**

  Apps on Devices 用に設定された Stripe リーダーでは、取引の完了後に[優先キオスクアプリ](https://docs.stripe.com/terminal/features/apps-on-devices/deploy-with-api.md)が起動します。DevKit では、デバイスをデプロイグループに含めた場合にのみ、デバイスの優先キオスクアプリが設定されます。

  DevKit デバイスで設定するキオスクアプリを指定するには、次のようにします。

  1. DevKit デバイスタイプのみを選択してアプリをアップロードします。これにより、[アプリレビュー](https://docs.stripe.com/terminal/features/apps-on-devices/app-review.md)をスキップできます。
  2. DevKit を対象とするデプロイグループに[アプリバージョンをデプロイ](https://docs.stripe.com/terminal/features/apps-on-devices/deploy-with-api.md)します。
