Equivalente iOS per le preferenze condivise di Android


105

Sto trasferendo un'app Android su iOS, una cosa che ho usato sono state le Preferenze condivise in Android per salvare ogni volta che un livello veniva completato.

In questo modo, quando l'utente torna nell'app, può vedere che è al livello 3 o altro.

Esiste un meccanismo simile in iOS? o devo scrivere manualmente su un file specifico dell'applicazione?

In tal caso, come scrivo su file visibili solo alla mia applicazione?

Grazie.


1
Immagino che la cosa più vicina a questo in iOS sia NSUserDefaults . Ed ecco un semplice esempio di come salvare e recuperare.
Tarek Hallak

Risposte:


203

Usa NSUserDefaults : - nota che questo è per piccoli bit di dati, come il livello corrente come hai menzionato. Non abusarne e usalo come un database di grandi dimensioni, perché viene caricato in memoria ogni volta che apri la tua app, che tu abbia bisogno di qualcosa da essa o meno (anche altre parti della tua app lo useranno).

Objective-C:

Lettura:

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];
}

scrittura:

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)
}

.

Swift:

Lettura:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

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

scrittura:

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)
}

Puoi anche utilizzare l'associazione condizionale per la lettura in swift if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
Raghu Teja

4
@chitti no che non funzionerà, integerForKey non restituisce un optional
SomeGuy

40

Ecco un aggiornamento per Swift 3

Lettura

let preferences = UserDefaults.standard

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

scrittura

let preferences = UserDefaults.standard

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

Aggiornare

Dalla documentazione di UserDefaults

synchronize()attende eventuali aggiornamenti asincroni in sospeso al database predefinito e restituisce; questo metodo ora non è più necessario e non dovrebbe essere utilizzato.


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)
    }

}

Esempio

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

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

-1

Come per la risposta precedente, sai già che UserDefaultsè l'equivalente delle preferenze condivise in ios. È possibile creare una funzione di scrittura comune e per la funzione di creazione di lettura in base al tipo di dati. E chiama il tuo metodo richiesto da qualsiasi luogo.

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)
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.