Suburi / CSV & JSON
エクスポートデータ仕様
最終更新日:2026年10月8日 · JSON schemaVersion 1
次回アップデートで追加予定の記録エクスポート機能の仕様です。対応版のアプリでご利用いただけます。
iPhone アプリの「設定 > データ > 記録をエクスポート」で出力されるファイル(CSV / JSON)の仕様。
- 対象: 記録エクスポート機能の初版(JSON
schemaVersion = 1)
1. 概要
| 形式 | 用途 | 単位 | 時系列データ |
|---|---|---|---|
| CSV | Excel / Numbers での集計・閲覧 | 1 稽古 = 1 行 | 含まない |
| JSON | データの保管、プログラムでの分析 | 1 稽古 = records の 1 要素 |
含む(1振りごとの加速度、心拍) |
どちらの形式も、出力対象の稽古記録は同じ(後述の「出力対象」で決まる)。アプリへのインポート機能は将来の対応を予定しています。
出力対象
| 条件 | 選択肢 | 判定 |
|---|---|---|
| 競技 | すべての競技 / 1つの競技設定 | configurationId の一致 |
| 期間 | 全期間 / 今年 / 期間を指定 | startedAt が範囲内(下記) |
期間の範囲は端末のカレンダーとタイムゾーンで計算する。
| 期間 | 範囲(from <= startedAt < to) |
|---|---|
| 全期間 | 制限なし |
| 今年 | 今年の 1月1日 0:00 〜 翌年 1月1日 0:00 |
| 期間を指定 | 開始日の 0:00 〜 終了日の翌日 0:00(終了日を丸1日含む)。開始日と終了日が逆でも入れ替えて扱う |
並び順は常に startedAt の新しい順。
対象はこの端末に保存されている記録だけ。iCloud 同期が終わっていない記録は含まれない。
無料版(お試し)の制限
| 課金済み(拡張パック) | 無料 | |
|---|---|---|
| 出力件数 | 対象の全件 | 新しい順に直近 3 件 |
| 各記録の中身 | 全項目 | 全項目(時系列も省略しない) |
対象が 3 件を超えていて、実際に切り捨てが起きたときだけ「サンプル」扱いになり、次の2点が変わる。
- ファイル名の末尾に
_sampleが付く - JSON の
meta.isSampleがtrueになる
対象が 3 件以下なら、無料でも全件が出力されるのでサンプル扱いにはならない。課金状態はエクスポートを実行した瞬間に判定する。
2. 共通ルール
ファイル名
suburi_export_{yyyyMMdd}_{HHmm}[_sample].{csv|json}
- 日時はエクスポートした時刻(端末のタイムゾーン、グレゴリオ暦)
- 例:
suburi_export_20261008_0900.csv、suburi_export_20261008_0900_sample.json
日時の表記
すべての日時は ISO 8601(秒まで、端末タイムゾーンのオフセット付き)。
2026-10-08T09:00:00+09:00
- 秒未満は切り捨てられる
- オフセットはエクスポートした端末のタイムゾーン。タイムゾーン名は JSON の
meta.timeZoneに入る - UTC の端末では
Zで表記される(例:2026-10-08T00:00:00Z)
文字コード
- CSV: UTF-8(BOM 付き)。Excel で開いたときに日本語が文字化けしないようにするため
- JSON: UTF-8(BOM なし)
競技名・単位の決め方
sport_name / count_unit(JSON では sportName / countUnit)は、記録の configurationId に対応する現在の競技設定から取る。
- 競技設定の名前や単位を後から変えると、過去の記録も新しい名前で出力される
- 競技設定が削除済みで見つからない場合は、
sport_typeのプリセット名と既定の単位を使う(例:golf→ 「ゴルフ」)。sport_typeが未知の値ならgenericのものを使う
3. CSV 仕様
形式
- RFC 4180 準拠
- 1 行目はヘッダー行
- 行区切りは CRLF(
\r\n)。最終行の後ろにも CRLF が付く - 区切り文字はカンマ
- 値にカンマ
,、ダブルクォート"、改行(\n/\r)が含まれる場合だけ、値全体を"で囲み、中の"は""に置き換える - 記録が 0 件のときは、ヘッダー行だけのファイルになる(画面上はエクスポートできない)
列定義
列の並びは下表の順で固定。
| # | 列名 | 型 | 内容 | 例 |
|---|---|---|---|---|
| 1 | practice_id |
文字列 | 稽古記録の ID(UUID) | 95493221-87AE-4A03-A6D6-274361380DDD |
| 2 | started_at |
日時 | 稽古の開始日時 | 2026-10-08T07:00:00+09:00 |
| 3 | ended_at |
日時 | 稽古の終了日時 | 2026-10-08T07:02:53+09:00 |
| 4 | sport_type |
文字列 | 競技の種類(下記の値) | kendo |
| 5 | sport_name |
文字列 | 競技の表示名 | 剣道 |
| 6 | count |
整数 | 回数(素振りの本数など) | 173 |
| 7 | count_unit |
文字列 | 回数の単位 | 本 |
| 8 | exercise_time_sec |
整数 | 運動時間(秒) | 173 |
| 9 | satisfaction |
整数 | 満足度(0〜5、0 は未評価) | 4 |
| 10 | measurement_type |
文字列 | 計測方法(下記の値) | apple_watch |
| 11 | tag |
文字列 | 日誌タグ。複数ある場合はカンマ区切り | 基本,朝稽古 |
| 12 | memo |
文字列 | 日誌のメモ(改行を含むことがある) | 面打ちを重点的に |
例
practice_id,started_at,ended_at,sport_type,sport_name,count,count_unit,exercise_time_sec,satisfaction,measurement_type,tag,memo
95493221-87AE-4A03-A6D6-274361380DDD,2026-10-08T07:00:00+09:00,2026-10-08T07:02:53+09:00,kendo,剣道,173,本,173,4,apple_watch,基本,"面, 小手
胴の順で"
1EE319AA-5667-4043-B408-2DF003AB6429,2026-10-07T07:00:00+09:00,2026-10-07T07:02:39+09:00,kendo,剣道,159,本,159,0,apple_watch,,
(実際のファイルは先頭に BOM が付き、行区切りは CRLF)
4. JSON 仕様
形式
- インデント付き(pretty print)、キーはアルファベット順
/はエスケープしない- 数値は JSON の number。小数の桁数は丸めない
全体構造
{
"meta" : { ... },
"records" : [ { ... }, { ... } ]
}
meta
| キー | 型 | 内容 | 例 |
|---|---|---|---|
schemaVersion |
整数 | この JSON 構造のバージョン(現在 1) |
1 |
exportedAt |
日時文字列 | エクスポートした日時 | "2026-10-08T11:12:57+09:00" |
appVersion |
文字列 | null |
出力したアプリのバージョン。取得できない場合は null |
"3.0.0" |
timeZone |
文字列 | 日時の表記に使ったタイムゾーン(IANA 名) | "Asia/Tokyo" |
isSample |
真偽値 | 無料版の制限で一部だけを出力した場合に true |
true |
totalRecords |
整数 | 選んだ条件に一致した記録の総数 | 4 |
includedRecords |
整数 | このファイルに含まれる記録の数 | 3 |
records[]
| キー | 型 | 内容 | CSV の対応列 |
|---|---|---|---|
practiceId |
文字列 | 稽古記録の ID(UUID) | practice_id |
configurationId |
文字列 | 競技設定の ID(UUID 文字列) | (なし) |
sportType |
文字列 | 競技の種類 | sport_type |
sportName |
文字列 | 競技の表示名 | sport_name |
count |
整数 | 回数 | count |
countUnit |
文字列 | 回数の単位 | count_unit |
exerciseTimeSeconds |
整数 | 運動時間(秒) | exercise_time_sec |
satisfaction |
整数 | 満足度(0〜5、0 は未評価) | satisfaction |
measurementType |
文字列 | 計測方法 | measurement_type |
tag |
文字列 | 日誌タグ(カンマ区切り) | tag |
memo |
文字列 | 日誌のメモ | memo |
startedAt |
日時文字列 | 開始日時 | started_at |
endedAt |
日時文字列 | 終了日時 | ended_at |
createdAt |
日時文字列 | 記録が作られた日時 | (なし) |
modifiedAt |
日時文字列 | 記録が最後に更新された日時 | (なし) |
accelerations |
配列 | 1振りごとの加速度(下記)。elapsedTime の昇順 |
(なし) |
heartrates |
配列 | 心拍(下記)。date の昇順 |
(なし) |
records[].accelerations[]
Apple Watch が振りを1回検知するたびに 1 要素記録される。そのため Apple Watch で計測した記録では、通常 accelerations の要素数は count と一致する。
| キー | 型 | 単位 | 内容 |
|---|---|---|---|
elapsedTime |
数値 | 秒 | 稽古開始から、その振りを検知するまでの経過時間 |
x |
数値 | G | 検知した振りの加速度(X 軸) |
y |
数値 | G | 検知した振りの加速度(Y 軸)。アプリ内の「打突力」グラフはこの値を使う |
z |
数値 | G | 検知した振りの加速度(Z 軸) |
- 加速度は CoreMotion の
userAcceleration(重力を除いた加速度)を、時計の装着腕・竜頭の向きに合わせて正規化した値 - 検知方式によって、記録する値の取り方が異なる。どちらも AccMag(3軸の合成値)ではない
- V1(CoreML 分類器): 判定ウィンドウ内での各軸の最大値。x / y / z が同じ瞬間の値とは限らない
- V2(PeakStateMachine): 振りを検知した区間のピーク付近の 1 サンプル(3軸は同じ瞬間の値)
- どちらの方式で計測した記録かは、このファイルからは判別できない
records[].heartrates[]
| キー | 型 | 単位 | 内容 |
|---|---|---|---|
date |
日時文字列 | — | 計測した日時 |
bpm |
数値 | 拍/分 | 心拍数 |
例(抜粋)
以下の例では、記録 2 件と時系列の一部を省略しています。includedRecords はファイル全体の件数です。appVersion は例示であり、リリース番号の告知ではありません。
{
"meta" : {
"appVersion" : "3.0.0",
"exportedAt" : "2026-10-08T11:12:57+09:00",
"includedRecords" : 3,
"isSample" : true,
"schemaVersion" : 1,
"timeZone" : "Asia/Tokyo",
"totalRecords" : 4
},
"records" : [
{
"accelerations" : [
{ "elapsedTime" : 0.92, "x" : 0.41, "y" : 4.87, "z" : -0.63 },
{ "elapsedTime" : 1.85, "x" : 0.38, "y" : 5.12, "z" : -0.58 }
],
"configurationId" : "0F6C3E7A-2B1D-4C59-9A8E-5D2F7B3C1A90",
"count" : 173,
"countUnit" : "本",
"createdAt" : "2026-10-08T07:03:10+09:00",
"endedAt" : "2026-10-08T07:02:53+09:00",
"exerciseTimeSeconds" : 173,
"heartrates" : [
{ "bpm" : 96, "date" : "2026-10-08T07:00:05+09:00" },
{ "bpm" : 104, "date" : "2026-10-08T07:00:10+09:00" }
],
"measurementType" : "apple_watch",
"memo" : "面打ちを重点的に",
"modifiedAt" : "2026-10-08T07:03:10+09:00",
"practiceId" : "95493221-87AE-4A03-A6D6-274361380DDD",
"satisfaction" : 4,
"sportName" : "剣道",
"sportType" : "kendo",
"startedAt" : "2026-10-08T07:00:00+09:00",
"tag" : "基本"
}
]
}
(実際の出力は配列の要素も1行ずつ展開される)
5. 値の一覧
sport_type / sportType
| 値 | 表示名(既定) | 単位(既定) |
|---|---|---|
kendo |
剣道 | 本 |
baseball |
野球 | 回 |
golf |
ゴルフ | 回 |
tennis |
テニス | 回 |
badminton |
バドミントン | 回 |
table_tennis |
卓球 | 回 |
squash |
スカッシュ | 回 |
cricket |
クリケット | 回 |
hockey |
ホッケー | 回 |
fencing |
フェンシング | 回 |
bowling |
ボウリング | 回 |
music |
音楽 | 回 |
guitar |
ギター | 回 |
metronome |
メトロノーム | 回 |
generic |
その他 | 回 |
既定の表示名・単位は SuburiType.displayName / defaultCountUnit の値(言語設定に関係なく日本語)。ユーザーが競技設定で名前・単位を変えている場合は、そちらが出力される。
measurement_type / measurementType
| 値 | 意味 | 時系列データ |
|---|---|---|
apple_watch |
Apple Watch で計測 | あり(通常 count と同数の加速度、心拍) |
manual |
手入力 | なし(accelerations / heartrates は空配列、exercise_time_sec は 0、started_at と ended_at は同じ) |
6. 互換性の方針
- CSV: 列は末尾に追加するだけにし、既存の列の順番・名前・意味は変えない。読み込む側は列名で参照することを推奨
- JSON: キーの追加は
schemaVersionを変えずに行う。既存キーの削除・型の変更・意味の変更をするときはschemaVersionを上げる。読み込む側は知らないキーを無視すること - 将来のインポート機能は
schemaVersionで互換性を判定する予定
7. 取り扱いの注意
- ファイルは端末の中で作られ、共有シートで利用者が選んだ先にだけ渡される。開発者のサーバーには送られない
memo/tagには利用者が自由に書いた内容が入る。サポート対応などでファイルを受け取った場合も、ログや公開の場に貼らないこと- 作成したファイルはアプリの一時フォルダ(
tmp/Export/)に置かれ、共有シートまたは画面を閉じた時点で削除される
Last updated: October 8, 2026 · JSON schemaVersion 1
This specification covers record export planned for the next update. The feature will be available in the app version that supports it.
This specification describes the CSV and JSON files produced by the iPhone app under Settings > Data > Export Records.
- Scope: the first release of record export (JSON
schemaVersion = 1).
1. Overview
| Format | Use | Record unit | Time series |
|---|---|---|---|
| CSV | Viewing and aggregating in Excel / Numbers | One practice per row | Not included |
| JSON | Keeping a copy of your data and programmatic analysis | One practice per element in records |
Included (per-swing acceleration and heart rate) |
Both formats export the same practices, selected by the conditions below. An in-app import feature is planned for the future.
Records included
| Filter | Options | Matching rule |
|---|---|---|
| Activity | All activities / one activity configuration | Matching configurationId |
| Period | All time / this year / custom period | startedAt falls within the range below |
Period boundaries use the device's calendar and time zone.
| Period | Range (from <= startedAt < to) |
|---|---|
| All time | No limit |
| This year | January 1 at 00:00 this year to January 1 at 00:00 next year |
| Custom period | Start date at 00:00 to the day after the end date at 00:00 (the entire end date is included). Reversed start and end dates are swapped. |
Records are always ordered by startedAt, newest first.
Only records stored on this device are included. Records that have not finished syncing from iCloud are excluded.
Free trial limits
| Expansion pack purchased | Free | |
|---|---|---|
| Number of records | All matching records | Three most recent matching records |
| Contents of each record | All fields | All fields (including the full time series) |
An export is treated as a sample only when more than three records match and some are actually omitted. In that case:
- The filename ends in
_sample. - JSON
meta.isSampleistrue.
If three or fewer records match, the free version exports all of them and the file is not a sample. Purchase status is checked when the export runs.
2. Common rules
Filename
suburi_export_{yyyyMMdd}_{HHmm}[_sample].{csv|json}
- The timestamp is the export time, using the device's time zone and the Gregorian calendar.
- Examples:
suburi_export_20261008_0900.csv,suburi_export_20261008_0900_sample.json.
Dates and times
All timestamps use ISO 8601, to the second, with the device's time zone offset.
2026-10-08T09:00:00+09:00
- Fractional seconds are discarded.
- The offset is that of the exporting device's time zone. Its name is in JSON
meta.timeZone. - Devices set to UTC use
Z, for example2026-10-08T00:00:00Z.
Encoding
- CSV: UTF-8 with a BOM, to help Excel display Japanese text correctly.
- JSON: UTF-8 without a BOM.
Activity names and count units
sport_name / count_unit (JSON: sportName / countUnit) come from the current activity configuration matching the record's configurationId.
- Changing a configuration's name or unit also changes how earlier records appear in exports.
- If the configuration has been deleted or cannot be found, the preset name and default unit for
sport_typeare used (for example,golf→ 「ゴルフ」). Unknownsport_typevalues use the defaults forgeneric.
3. CSV specification
Format
- Follows RFC 4180.
- The first row contains column headers.
- Rows end with CRLF (
\r\n), including the final row. - Fields are separated by commas.
- Only values containing a comma
,, a double quote", or a newline (\n/\r) are enclosed in double quotes. Each double quote within the value is replaced with"". - With no records, the file contains only the header row (the app screen does not allow exporting zero records).
Columns
Column order is fixed as shown below.
| # | Column | Type | Meaning | Example |
|---|---|---|---|---|
| 1 | practice_id |
String | Practice record ID (UUID) | 95493221-87AE-4A03-A6D6-274361380DDD |
| 2 | started_at |
Timestamp | Practice start | 2026-10-08T07:00:00+09:00 |
| 3 | ended_at |
Timestamp | Practice end | 2026-10-08T07:02:53+09:00 |
| 4 | sport_type |
String | Activity type (values below) | kendo |
| 5 | sport_name |
String | Activity display name | 剣道 |
| 6 | count |
Integer | Count (for example, number of swings) | 173 |
| 7 | count_unit |
String | Count unit | 本 |
| 8 | exercise_time_sec |
Integer | Exercise duration in seconds | 173 |
| 9 | satisfaction |
Integer | Satisfaction (0–5; 0 means unrated) | 4 |
| 10 | measurement_type |
String | Measurement method (values below) | apple_watch |
| 11 | tag |
String | Journal tags, separated by commas if multiple | 基本,朝稽古 |
| 12 | memo |
String | Journal note; may contain newlines | 面打ちを重点的に |
Example
practice_id,started_at,ended_at,sport_type,sport_name,count,count_unit,exercise_time_sec,satisfaction,measurement_type,tag,memo
95493221-87AE-4A03-A6D6-274361380DDD,2026-10-08T07:00:00+09:00,2026-10-08T07:02:53+09:00,kendo,剣道,173,本,173,4,apple_watch,基本,"面, 小手
胴の順で"
1EE319AA-5667-4043-B408-2DF003AB6429,2026-10-07T07:00:00+09:00,2026-10-07T07:02:39+09:00,kendo,剣道,159,本,159,0,apple_watch,,
Actual files begin with a BOM and use CRLF line endings. Example values remain in Japanese because exports use the activity configuration's names and units.
4. JSON specification
Format
- Pretty-printed, with keys in alphabetical order.
/is not escaped.- Numbers are JSON numbers. Decimal precision is not rounded.
Top-level structure
{
"meta" : { ... },
"records" : [ { ... }, { ... } ]
}
meta
| Key | Type | Meaning | Example |
|---|---|---|---|
schemaVersion |
Integer | JSON structure version (currently 1) |
1 |
exportedAt |
Timestamp string | Export time | "2026-10-08T11:12:57+09:00" |
appVersion |
String or null |
App version, or null if unavailable |
"3.0.0" |
timeZone |
String | Time zone used for timestamps (IANA name) | "Asia/Tokyo" |
isSample |
Boolean | true if the free limit caused records to be omitted |
true |
totalRecords |
Integer | Total records matching the selected filters | 4 |
includedRecords |
Integer | Records included in this file | 3 |
records[]
| Key | Type | Meaning | CSV column |
|---|---|---|---|
practiceId |
String | Practice record ID (UUID) | practice_id |
configurationId |
String | Activity configuration ID (UUID string) | None |
sportType |
String | Activity type | sport_type |
sportName |
String | Activity display name | sport_name |
count |
Integer | Count | count |
countUnit |
String | Count unit | count_unit |
exerciseTimeSeconds |
Integer | Exercise duration in seconds | exercise_time_sec |
satisfaction |
Integer | Satisfaction (0–5; 0 means unrated) | satisfaction |
measurementType |
String | Measurement method | measurement_type |
tag |
String | Journal tags, separated by commas | tag |
memo |
String | Journal note | memo |
startedAt |
Timestamp string | Practice start | started_at |
endedAt |
Timestamp string | Practice end | ended_at |
createdAt |
Timestamp string | Record creation time | None |
modifiedAt |
Timestamp string | Last record update | None |
accelerations |
Array | Per-swing acceleration (below), ordered by elapsedTime, ascending |
None |
heartrates |
Array | Heart rate (below), ordered by date, ascending |
None |
records[].accelerations[]
One element is recorded each time Apple Watch detects a swing. For Apple Watch measurements, the number of elements normally matches count.
| Key | Type | Unit | Meaning |
|---|---|---|---|
elapsedTime |
Number | Seconds | Time from practice start until the swing was detected |
x |
Number | G | Detected swing acceleration on the X axis |
y |
Number | G | Detected swing acceleration on the Y axis; used by the app's strike-strength graph |
z |
Number | G | Detected swing acceleration on the Z axis |
- Values are CoreMotion
userAcceleration(acceleration excluding gravity), normalized for the wrist and Digital Crown orientation. - How values are captured depends on the detection method. Neither method exports AccMag (the combined three-axis magnitude).
- V1 (CoreML classifier): the maximum value of each axis within the classification window. The three values may come from different instants.
- V2 (PeakStateMachine): one sample near the peak of the detected swing interval. All three axes come from the same instant.
- The file does not identify which detection method was used.
records[].heartrates[]
| Key | Type | Unit | Meaning |
|---|---|---|---|
date |
Timestamp string | — | Measurement time |
bpm |
Number | Beats per minute | Heart rate |
Example (excerpt)
The example below omits two records and part of the time series. includedRecords describes the full file. appVersion is an example, not a release version announcement.
{
"meta" : {
"appVersion" : "3.0.0",
"exportedAt" : "2026-10-08T11:12:57+09:00",
"includedRecords" : 3,
"isSample" : true,
"schemaVersion" : 1,
"timeZone" : "Asia/Tokyo",
"totalRecords" : 4
},
"records" : [
{
"accelerations" : [
{ "elapsedTime" : 0.92, "x" : 0.41, "y" : 4.87, "z" : -0.63 },
{ "elapsedTime" : 1.85, "x" : 0.38, "y" : 5.12, "z" : -0.58 }
],
"configurationId" : "0F6C3E7A-2B1D-4C59-9A8E-5D2F7B3C1A90",
"count" : 173,
"countUnit" : "本",
"createdAt" : "2026-10-08T07:03:10+09:00",
"endedAt" : "2026-10-08T07:02:53+09:00",
"exerciseTimeSeconds" : 173,
"heartrates" : [
{ "bpm" : 96, "date" : "2026-10-08T07:00:05+09:00" },
{ "bpm" : 104, "date" : "2026-10-08T07:00:10+09:00" }
],
"measurementType" : "apple_watch",
"memo" : "面打ちを重点的に",
"modifiedAt" : "2026-10-08T07:03:10+09:00",
"practiceId" : "95493221-87AE-4A03-A6D6-274361380DDD",
"satisfaction" : 4,
"sportName" : "剣道",
"sportType" : "kendo",
"startedAt" : "2026-10-08T07:00:00+09:00",
"tag" : "基本"
}
]
}
Actual output expands array elements over multiple lines.
5. Allowed values
sport_type / sportType
| Value | Default display name | Default unit |
|---|---|---|
kendo |
剣道 | 本 |
baseball |
野球 | 回 |
golf |
ゴルフ | 回 |
tennis |
テニス | 回 |
badminton |
バドミントン | 回 |
table_tennis |
卓球 | 回 |
squash |
スカッシュ | 回 |
cricket |
クリケット | 回 |
hockey |
ホッケー | 回 |
fencing |
フェンシング | 回 |
bowling |
ボウリング | 回 |
music |
音楽 | 回 |
guitar |
ギター | 回 |
metronome |
メトロノーム | 回 |
generic |
その他 | 回 |
Default display names and units are Japanese, regardless of the app's language setting. If the user customizes a configuration's name or unit, those custom values are exported instead.
measurement_type / measurementType
| Value | Meaning | Time series |
|---|---|---|
apple_watch |
Measured with Apple Watch | Available (normally one acceleration element per count, plus heart rate) |
manual |
Entered manually | None (accelerations / heartrates are empty arrays, exercise_time_sec is 0, and started_at equals ended_at) |
6. Compatibility policy
- CSV: New columns will only be appended. Existing column order, names, and meanings will stay the same. Read fields by column name.
- JSON: New keys may be added without changing
schemaVersion. Removing a key or changing its type or meaning requires a version increase. Readers should ignore unknown keys. - A future import feature is planned to use
schemaVersionto determine compatibility.
7. Handling exported files
- Files are created on the device and shared only to the destination the user chooses in the share sheet. Exports are not sent to the developer's server.
memoandtagcontain user-written text. If you receive a file for support, do not paste this content into logs or public spaces.- Generated files are placed in the app's temporary folder (
tmp/Export/) and deleted when the share sheet or export screen closes.