Files
jrshikoku/docs/recording-file-import-export.md

4.2 KiB

保存した運用録画のファイルインポート/エクスポート方針

目的

保存した走行位置録画を、クリップボードだけでなくファイルとして受け渡しできるようにする。 録画データを JSON として書き出し、同じ JSON を選択して取り込める構成にする。

導入済みの必須ライブラリ

  • expo-file-system: 録画 JSON を一時ファイルまたは Documents 配下へ書き出し、インポート時に選択済みファイルを読み込む。
  • expo-document-picker: ユーザーに録画 JSON ファイルを選ばせる。読み込み直後に扱いやすくするため、実装時は copyToCacheDirectory: true を使う。

既存の expo-sharing は単一ファイルの共有 fallback として残す。react-native-share は複数画像や複数ファイルの同時共有、共有先ごとの制御が必要なケースで使う。既存の expo-clipboard はコピペ export/import の fallback として残す。

実装済み

  • 録画1件と全件の JSON envelope 書き出し。
  • react-native-share によるネイティブ共有/保存。
  • Web では Blobdownload による JSON ダウンロード。
  • expo-document-pickerexpo-file-system による JSON 読み込み。
  • 既存保存形式と同じ検証処理を通したインポート。
  • 録画本体は Paths.document/train-recordings 配下の JSON ファイルへ保存し、AsyncStorage/SQLite には軽量な一覧メタだけ保存する。
  • 旧SQLite保存の録画本体は、起動時/インポート時にファイルへ移行して旧キーを削除する。

想定する実装方針

ネイティブ

  1. 録画データを version 付き envelope JSON に変換する。
  2. expo-file-systemcacheDirectory.json ファイルを書き出す。
  3. 単一 JSON は expo-sharing または react-native-share で共有する。
  4. 複数画像や複数ファイルを同時共有する場合は react-native-shareurls を使う。
  5. インポートは expo-document-picker で JSON を選択する。
  6. 選択したファイルを expo-file-system で読み込み、既存の検証処理を通して保存する。

Web

Web ではローカル file URI の expo-sharing が使えないため、BlobURL.createObjectURL による download を別実装にする。 インポートはブラウザの file input 相当で読み込む方針にする。

正式採用する共有ライブラリ

  • react-native-share: 複数画像や複数ファイルを同時共有するために正式採用する。Expo config plugin は options 付きで登録し、初期状態では iosandroid の query 追加を空配列にしている。特定アプリ向けの shareSingleisPackageInstalled が必要になった時点で、対象アプリの scheme/package を追加する。
  • enableBase64ShareAndroid: 初期状態では false。ファイル URI 共有を基本にするため、Android の legacy storage permission を増やさない。base64 共有が必要になった場合だけ有効化する。

今回インストールしない候補

  • pako または fflate: 録画 JSON が大きくなったときの gzip/deflate 圧縮候補。まずは plain JSON で運用し、共有できないサイズになった時点で入れる。
  • expo-file-system config plugin options: iOS の Files アプリからアプリ Documents を直接見せたい場合に enableFileSharingsupportsOpeningDocumentsInPlace を検討する。現時点では共有シートと DocumentPicker で足りる。
  • expo-sharing の共有受け取り設定: 他アプリから「このアプリで開く」導線を作る候補。まずはアプリ内のインポートボタンから選択する方式にする。
  • react-native-blob-util: 大容量/バックグラウンド/Android Storage Access Framework の細かい制御が必要になった場合の候補。Expo managed workflow では導入コストが上がるため、現時点では使わない。

参考