Ich suche nach einer besseren Möglichkeit, verfügbaren / freien Speicherplatz auf dem iPhone / iPad-Gerät programmgesteuert zu erkennen.
Derzeit verwende ich den NSFileManager, um den Speicherplatz zu ermitteln. Das Folgende ist der Ausschnitt des Codes, der die Arbeit für mich erledigt:
-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);
return freeSpace;
}
Bin ich mit dem obigen Ausschnitt richtig? oder gibt es eine bessere Möglichkeit, den insgesamt verfügbaren / freien Speicherplatz zu ermitteln?
Ich muss den gesamten freien Speicherplatz ermitteln, da wir verhindern müssen, dass unsere Anwendung im Szenario mit geringem Speicherplatz eine Synchronisierung durchführt.
Antworten:
UPDATE : Da nach dieser Antwort viel Zeit vergangen ist und neue Methoden / APIs hinzugefügt wurden, überprüfen Sie bitte die aktualisierten Antworten unten für Swift usw.; Da ich sie selbst nicht benutzt habe, kann ich nicht für sie bürgen.
Ursprüngliche Antwort : Ich habe festgestellt, dass die folgende Lösung für mich funktioniert:
Es gibt mir genau die Größe zurück, die iTunes anzeigt, wenn das Gerät an den Computer angeschlossen ist.
quelle
NSUInteger
anstelle von Sachen wieuint64_t
? Wir schreiben Obj-C, nicht C ++ oder C. NSUInteger gibt Ihnen jetzt eine vorzeichenlose 64-Bit-Ganzzahl, aber wenn sich etwas ändert, kann ich mir vorstellen, dass Apple dieses Makro aktualisiert (sagen wir, 128 Bit werden irgendwann real).Überarbeitete Quelle mit unsigned long long:
BEARBEITEN: Es scheint, dass jemand diesen Code so bearbeitet hat, dass er 'uint64_t' anstelle von 'unsigned long long' verwendet. Während dies in absehbarer Zeit in Ordnung sein sollte, sind sie nicht dasselbe. 'uint64_t' ist 64 Bit und wird es immer sein. In 10 Jahren könnte 'unsigned long long' 128 sein. Es ist ein kleiner Punkt, aber warum ich unsignedLongLong verwendet habe.
quelle
Ich habe eine Klasse geschrieben, um mit Swift verfügbaren / verwendeten Speicher zu erhalten. Demo unter: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 aktualisiert.
Demo
quelle
Wenn Sie einen formatierten String mit Größe benötigen, können Sie sich eine schöne Bibliothek auf GitHub ansehen :
quelle
Verwenden Sie nicht "unsigned", es sind nur 32 Bit, die über 4 GB hinauslaufen, was weniger als der typische freie Speicherplatz für iPad / iPhone ist. Verwenden Sie unsigned long long (oder uint64_t) und rufen Sie den Wert auch mit unsignedLongLongValue als 64-Bit-Int aus der NSNumber ab.
quelle
Wenn Sie den verbleibenden freien Speicherplatz mit Swift nutzen möchten, ist dies etwas anders. Sie müssen AttributeOfFileSystemForPath () anstelle von AttributeOfItemAtPath () verwenden:
Edit: Aktualisiert für Swift 1.0
Edit 2: Aktualisiert für die Sicherheit, Martin R Antwort mit .
Edit 3: Aktualisiert für Swift 2.0 (von dgellow )
quelle
Hier ist meine Antwort und warum es besser ist.
Antwort (schnell):
Antwort (Ziel-C):
Warum ist es besser:
NSByteCountFormatter
, was bedeutet, dass keine verrückten manuellen Berechnungen von Bytes bis Gigabytes erforderlich sind . Apple macht das für Sie!NSByteCountFormatter
erledigt dies für Sie. Wenn beispielsweise die Sprache des Geräts auf Englisch eingestellt ist, wird in der Zeichenfolge 248,8 MB angezeigt, in Französisch jedoch 248,8 Mo, für andere Sprachen usw.quelle
Wichtige Klarstellung (zumindest für mich). Wenn ich meinen iPod an meinen Mac anschließe, werden diese Informationen von der iTunes App angezeigt.
Wenn ich den obigen Code verwende:
Das countStyle NSByteCountFormatterCountStyleFile zeigt mir: 17,41 GB
Der countStyle NSByteCountFormatterCountStyleBinary zeigt mir: 16,22 GB
16,22 GB ( NSByteCountFormatterCountStyleBinary ) Es ist genau die Nummer, die mir die iTunes App anzeigt , wenn ich meinen iPod an meinen Mac anschließe.
quelle
Aktualisieren Sie mit einer neuen genauen API, um die verfügbare Größe auf der Festplatte in iOS11 zu erhalten. Hier ist die Beschreibung für den neuen API-Ressourcenschlüssel:
Ich habe die Ergebnisse von Schlüssel " FileAttributeKey.systemFreeSize " und Schlüssel " URLResourceKey.volumeAvailableCapacityForImportantUsageKey " verglichen und festgestellt, dass die von " volumeAvailableCapacityForImportantUsageKey " zurückgegebenen Ergebnisse genau mit dem auf der Benutzeroberfläche angezeigten verfügbaren Speicher übereinstimmen. Hier ist die schnelle Implementierung:
quelle
volumeAvailableCapacityForOpportunisticUsageKey
.NSHomeDirectory()
oder abfragenNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. Gibt es einen Unterschied bei der Verwendung dieser beiden?Sie können eine andere Lösung mit der Verwendung finden Swift 4 und
extension
das gibt Ihnen eine gute Option.Hier ist die
UIDevice
Erweiterung.Und Beispielnutzung:
quelle
!
sondernguard
in Sicherheit bringentypecasting
odernil
überprüfen.Für iOS> = 6.0 können Sie das neue verwenden
NSByteCountFormatter
. Dieser Code erhält die Anzahl der verbleibenden freien Bytes als formatierte Zeichenfolge.quelle
Der folgende Code ist die Implementierung der Swift 3.0-Version der zuvor von ChrisJF bereitgestellten Antwort:
quelle
für Swift als UIDevice-Erweiterung
Wie benutzt man:
Ausgabe wird sein:
quelle
Ich weiß, dass dieser Beitrag etwas alt ist, aber ich denke, diese Antwort kann jemandem helfen. Wenn Sie den verwendeten / freien / gesamten Speicherplatz auf dem Gerät kennen möchten, können Sie Luminous verwenden . Es ist in Swift geschrieben. Sie müssen nur anrufen:
oder
quelle
Schnelle Implementierung des obigen Codes: -
Nennen Sie es aus einer anderen Klasse.
Beim Testen des zurückgegebenen Werts entspricht dies dem anderer Apps. Zumindest in meinem iPhone 6S +. Es ist nur die schnelle Implementierung der oben gezeigten Antwort. Und für mich hat die akzeptierte Antwort nicht funktioniert.
quelle
ChrisJF Antwort in Swift 2.1 Version:
quelle
Wenn Sie Zeit sparen möchten, verwenden Sie die folgende CocoaPod-Bibliothek. Ich habe es nicht benutzt, aber es scheint, als sollte es funktionieren.
https://cocoapods.org/pods/SystemServices
quelle
Swift 5-Erweiterung für
FileManager
mit korrekter Fehlerbehandlung und ohne automatische Zeichenfolgenkonvertierung (konvertieren Sie die Byteanzahl nach Ihren Wünschen in Zeichenfolgen). Folgt auchFileManager
der Benennung.Anwendungsbeispiel:
quelle