ストレージサイズを取得する

設定アプリの情報>使用可能に表示されているストレージサイズを取得したい場合がある。

以前は実際より小さい値しか取得できなかった

Swift 3.0の時代には下記のようなコードが紹介されていたが、設定アプリの表示されている値よりも小さい値が返却される。

var systemFreeSize: NSNumber? {
    guard let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else {
        return nil
    }
    guard let attributes = try? FileManager.default.attributesOfFileSystem(forPath: documents) else {
        return nil
    }
    guard let systemFreeSize = attributes[.systemFreeSize] as? NSNumber else {
        return nil
    }
    return NSNumber(value: round(systemFreeSize.doubleValue / Double(1000 * 1000 * 1000) * 100) / 100)
}

iOS 11以降では正しい値が取得できる

iOS 11以降でURLResourceKeyに追加されたvolumeAvailableCapacityForImportantUsageKeyを使用すると設定アプリと一致する値が取得できる。

var systemFreeSize: NSNumber? {
    guard let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else {
        return nil
    }
    do {
        let values = try URL(fileURLWithPath: documents).resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey])
        guard let capacity = values.volumeAvailableCapacityForImportantUsage else {
            return nil
        }
        return NSNumber(value: round(Double(capacity) / Double(1000 * 1000 * 1000) * 100) / 100)
    } catch {
        return nil
    }
}