📁

iOSの空き容量取得時、keyごとの挙動を調査したメモ

2023/10/01に公開

Swift上でiOS端末の空き容量を取得するとき、3種のkeyを使います。この3つについて、公式ドキュメント上に用途は記載があるのですが、取得される容量が具体的にどう変わるかが不明だったため調査しました。

TL;DR

  • 実機において、空き容量は volumeAvailableCapacityForImportantUsageKey > volumeAvailableCapacityForOpportunisticUsageKey > volumeAvailableCapacityKey の順に大きい結果となりました。
  • 一方シミュレータでは上記3つのkeyの空き容量は常に同値となりました。
    • 意図した空き容量がとれているか確認するため、極力実機を使って動作確認をすることが推奨されます。

免責事項

厳密に設計した調査ではないため、あくまで参考値として見ていただければと思います。

調査した背景

公式ドキュメントを見ると、端末の空き容量を取得する際は下記の3種のkeyを利用します(英文は公式ドキュメントのdescriptionから引用)。

  • volumeAvailableCapacityKey: Key for the volume’s available capacity in bytes (read-only).
  • volumeAvailableCapacityForImportantUsageKey: Key for the volume’s available capacity in bytes for storing important resources (read-only).
  • volumeAvailableCapacityForOpportunisticUsageKey: Key for the volume’s available capacity in bytes for storing nonessential resources (read-only).

上記descriptionを見たとき、volumeAvailableCapacityKey が空き容量全体を示している?と読み取りました。しかしながら、実装してみると他のkeyで得られる空き容量より小さい値となっていました。そのため、端末に十分な空き容量があるにもかかわらず容量が不足していると誤検知する懸念が発生しました。また、同じくドキュメントのDecide Which Query Type to Useを見る限り、volumeAvailableCapacityKey に関しての記述が見つかりませんでした。

以上より、これらのkeyに対する空き容量が具体的にどうなるかが気になったため、今回調査しました。

調査環境・方法

実機とエミュレータによっての差異を見るため、下記の端末を利用しました。

  • 利用端末
    • 実機: iPhone 12 mini(iOS 16.7)
    • エミュレータ: iPhone 14(iOS 16.4)、iPhone XR(iOS 16.4)

上記端末ごとに、ダミーファイルを書き込んだ上で各keyごとの空き容量をXCode 14.3.1のdebuggerで測定しました。利用したコードは以下の様になります。

func readAvailableFreeSpaceGB() -> nil {
    let fileURL = URL(fileURLWithPath: "/")  // fileURLWithPath: NSHomeDirectory() でも同等の結果になる
    let values = try fileURL.resourceValues(
        forKeys: [
            .volumeTotalCapacityKey,
            .volumeAvailableCapacityKey,
            .volumeAvailableCapacityForImportantUsageKey,
            .volumeAvailableCapacityForOpportunisticUsageKey
        ])
    return  // ここにブレークポイントを設置し、valuesの値を取得
}

調査結果

1. エミュレータの機種ごとでの違いの比較

  • 機種による顕著な差異は見られませんでした。また、各AvailableCapacityごとの差異も見られませんでした。
  • エミュレータを稼働しているMacの全容量が494.38GB、空き容量がおよそ123.7GBでした。これらの値は、エミュレータ上の全容量と全空き容量と概ね一致しています。
項目 iPhone 14(GB) iPhone XR(GB)
volumeTotalCapacityKey 494.38 494.38
volumeAvailableCapacityForImportantUsageKey 123.67 123.70
volumeAvailableCapacityForOpportunisticUsageKey 123.67 123.70
volumeAvailableCapacityKey 123.67 123.70
設定での全容量 494.38 494.38
設定での全空き容量 123.85 123.65

2. iPhone XRエミュレータでの空き容量ごとの比較

  • 1.と同様の傾向が見られました。
  • 空き容量が変わっても、各AvailableCapacity同士で差異は見られませんでした。
項目 Mac空き容量=135.05GB での容量(GB) Mac空き容量=34.8GB での容量(GB) Mac空き容量=25.08GB での容量(GB)
volumeTotalCapacityKey 494.38 494.38 494.38
volumeAvailableCapacityForImportantUsageKey 123.70 23.41 13.39
volumeAvailableCapacityForOpportunisticUsageKey 123.70 23.41 13.39
volumeAvailableCapacityKey 123.70 23.41 13.39
Total capacity(Preference) 494.38 494.38 494.38
Total available capacity(Preference) 123.65 23.40 13.64

3. 実機での空き容量ごとの比較

  • volumeAvailableCapacityForImportantUsageKey > volumeAvailableCapacityForOpportunisticUsageKey > volumeAvailableCapacityKey の順に空き容量が大きくなりました。
  • volumeAvailableCapacityForImportantUsageKey は実機全体の空き容量と比例して増減するものの、他のkeyは必ずしも比例関係になりません。特に volumeAvailableCapacityKey が顕著で、実機の空き容量が減少すると減り方がわずかになります。
項目 実機空き容量=34.67GBでの容量(GB) 実機空き容量=24.9GBでの容量(GB) 実機空き容量=20.11GBでの容量(GB) 実機空き容量=17.59GBでの容量(GB) 実機空き容量=8.04GBでの容量(GB)
volumeTotalCapacityKey 63.87 63.87 63.87 63.87 63.87
volumeAvailableCapacityForImportantUsageKey 34.67 24.90 20.10 17.68 8.04
volumeAvailableCapacityForOpportunisticUsageKey 32.62 22.86 18.04 16.66 7.06
volumeAvailableCapacityKey 17.48 7.72 2.95 1.56 1.40
Total capacity(Preference) 64.00 64 64 64 64
Total available capacity(Preference) 34.67 24.9 20.11 17.59 8.04

実機におけるkeyごとの空き容量の遷移

Discussion