Equivalente a iOS para preferências compartilhadas do Android

105

Estou portando um aplicativo Android para iOS, uma coisa que usei foram as Preferências compartilhadas no Android para salvar cada vez que um nível fosse concluído.

Dessa forma, quando o usuário volta ao aplicativo, ele pode ver que está no nível 3 ou qualquer outro.

Existe um mecanismo semelhante no iOS? ou tenho que escrever manualmente em um arquivo específico do aplicativo?

Em caso afirmativo, como faço para gravar em arquivos visíveis apenas para meu aplicativo?

Obrigado.

FaddishWorm
fonte
1
Acho que a coisa mais próxima disso no iOS é NSUserDefaults . E aqui está um exemplo simples de como salvar e recuperar.
Tarek Hallak

Respostas:

203

Use NSUserDefaults : - note que isso é para pequenos bits de dados, como o nível atual como você mencionou. Não abuse disso e use-o como um grande banco de dados, porque ele é carregado na memória toda vez que você abre seu aplicativo, quer você precise de algo dele ou não (outras partes do seu aplicativo também o usarão).

Objective-C:

Lendo:

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

Escrevendo:

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

.

Rápido:

Lendo:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

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

Escrevendo:

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)
}
SomeGuy
fonte
Você também pode usar a vinculação condicional para ler em swift if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
Raghu Teja
4
@chitti não funcionará, integerForKey não retorna um opcional
SomeGuy
40

Aqui está uma atualização para Swift 3

Lendo

let preferences = UserDefaults.standard

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

Escrevendo

let preferences = UserDefaults.standard

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

Atualizar

Da documentação UserDefaults

synchronize()aguarda qualquer atualização assíncrona pendente no banco de dados de padrões e retorna; este método agora é desnecessário e não deve ser usado.

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

}

Exemplo

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

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

De acordo com a resposta anterior, você já sabe que UserDefaultsé o equivalente a preferências compartilhadas no ios. Você pode criar uma função de gravação comum e uma função de criação de leitura com base no tipo de dados. E chame seu método necessário de qualquer lugar.

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
fonte