iOS-Äquivalent für gemeinsame Android-Einstellungen

105

Ich portiere eine Android-App auf iOS. Eine Sache, die ich verwendet habe, waren die freigegebenen Einstellungen in Android, um jedes Mal zu speichern, wenn ein Level abgeschlossen wurde.

Auf diese Weise kann der Benutzer, wenn er wieder in die App zurückkehrt, sehen, dass er Stufe 3 erreicht hat oder was auch immer.

Gibt es einen ähnlichen Mechanismus in iOS? oder muss ich manuell in eine anwendungsspezifische Datei schreiben?

Wenn ja, wie schreibe ich in Dateien, die nur für meine Anwendung sichtbar sind?

Vielen Dank.

FaddishWorm
quelle
1
Ich denke, das, was diesem in iOS am nächsten kommt, ist NSUserDefaults . Und hier ist ein einfaches Beispiel zum Speichern und Abrufen.
Tarek Hallak

Antworten:

203

Verwenden Sie NSUserDefaults : - Beachten Sie, dass dies für kleine Datenbits gilt, z. B. für die von Ihnen erwähnte aktuelle Ebene. Missbrauche dies nicht und verwende es als große Datenbank, da es jedes Mal, wenn du deine App öffnest, in den Speicher geladen wird, unabhängig davon, ob du etwas davon benötigst oder nicht (andere Teile deiner App verwenden dies ebenfalls).

Ziel c:

Lesen:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

Schreiben:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

Schnell:

Lesen:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

Schreiben:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}
Irgendein Typ
quelle
Sie können auch die bedingte Bindung zum Lesen in swift if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
Raghu Teja
4
@chitti Nein, das wird nicht funktionieren, integerForKey gibt kein optionales zurück
SomeGuy
40

Hier ist ein Update für Swift 3

lesen

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

Schreiben

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

Aktualisieren

Aus der UserDefaults-Dokumentation

synchronize()wartet auf ausstehende asynchrone Aktualisierungen der Standarddatenbank und kehrt zurück; Diese Methode ist jetzt nicht mehr erforderlich und sollte nicht verwendet werden.

Ben
quelle
2
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

Beispiel

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")
Hasanaga
quelle
-1

Wie aus der vorherigen Antwort hervorgeht, wissen Sie bereits, dass dies UserDefaultsden gemeinsamen Einstellungen in ios entspricht. Sie können eine gemeinsame Schreibfunktion und für das Lesen eine Erstellungsfunktion basierend auf dem Datentyp erstellen. Und rufen Sie Ihre gewünschte Methode von überall aus auf.

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
Md Imran Choudhury
quelle