SwiftでiPhoneやiPadなどに搭載されているストレージがどれ程空いているかを調べる方法です。
アプリ内でダウンロードなどを行う際、残りの空き容量が少なければ警告を出したり、ダウンロードを中止したりといった処理をするために必要です。
サンプルコード
ViewController.swift
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) if let systemAttributes = try? FileManager.default.attributesOfFileSystem(forPath: documentDirectoryPath.last!) { // systemAttributes の値を全て出力 for value in systemAttributes { print(value) } if let freeSize = systemAttributes[FileAttributeKey.systemFreeSize] as? NSNumber { // GB単位で空き容量を取得 1024ではなく1000とする方が端末の表示に近い値になる let storageGB = freeSize.doubleValue / Double(1000 * 1000 * 1000) // 小数点第2位以下を四捨五入 print(round(storageGB * 100) / 100) } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
1KB = 1024byte として計算すると、端末内の設定で確認できるストレージの「使用可能」の数値よりもかなり小さくなります。実際にはシステムに占有されているため使えないといった理由があるのかもしれません。
stack overflow によると、以前からこの現象が起きていたことが確認できます。
サンプルの実行結果
端末内の設定での表示が以下のようであるとします。
このとき、上のプログラムを実行すると、以下のような出力が得られます。
attributesOfFileSystem には、空き容量以外にストレージの最大容量などの情報も含まれています。
次に、いくらかファイルを保存して容量を減らしてみます。いくつかのファイルを保存して容量が以下のような表示になったとします。
再度ストレージ容量を出力してみると、以下のようになります。
端末の表示と若干の差がありますが、ストレージの空き容量が取得できます。