[Swift3.0] iOS端末のストレージ空き容量を取得する

2016年10月4日(更新: 2016年10月4日)

ストレージのアイコン

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 によると、以前からこの現象が起きていたことが確認できます。

storage – Why does the value from NSFileSystemFreeSize differ from the free size reported in the iOS Settings? – Stack Overflow

サンプルの実行結果

端末内の設定での表示が以下のようであるとします。

iPhoneのストレージ空き容量

このとき、上のプログラムを実行すると、以下のような出力が得られます。

attributesOfFileSystemの中身と空き容量

attributesOfFileSystem には、空き容量以外にストレージの最大容量などの情報も含まれています。

次に、いくらかファイルを保存して容量を減らしてみます。いくつかのファイルを保存して容量が以下のような表示になったとします。

保存後のiPhoneのストレージ空き容量

再度ストレージ容量を出力してみると、以下のようになります。

保存後のattributesOfFileSystemの中身と空き容量

端末の表示と若干の差がありますが、ストレージの空き容量が取得できます。

コメントを残す

メールアドレスが公開されることはありません。