Я пытаюсь проверить свое приложение и посмотреть, существует ли значение в пользовательских настройках по умолчанию, и если оно существует, оно будет взято в приложение. Если его нет, им нужно ввести пин-код, а затем войти в приложение.
Любая идея, как проверить, присутствует ли значение в пользовательских настройках по умолчанию, а затем изменить isValidated на true
// главный
import SwiftUI
@main
struct ProjectHogtieApp: App {
@StateObject var authentication = Authentication()
var body: some Scene {
WindowGroup {
if authentication.isValidated {
ContentView()
.environmentObject(authentication)
} else {
LoginView()
.environmentObject(authentication)
}
}
}
}
// аутентификация.swift
class Authentication: ObservableObject {
@Published var isValidated = false
// this code is not working.
var getIsValidated: Void {
let deviceId = UserDefaults.standard.string(forKey: "deviceId")
if (deviceId != nil) {
self.isValidated = true
} else {
self.isValidated = false
}
}
Когда пользователь вводит пин-код, я сохраняю значение по умолчанию, как показано ниже.
let defaults = UserDefaults.standard
defaults.set(deviceId, forKey: "deviceId")
попробуйте это, чтобы проверить свой UserDefaults
при запуске приложения (т.е. когда Authentication
создается):
class Authentication: ObservableObject {
@Published var isValidated = false
// --- here
init() {
getIsValidated
}
//....
Обратите внимание, что для важных вещей, таких как аутентификация и т. д., вы должны использовать Keychain
для безопасного сохранения данных, а не UserDefaults
Это сработало идеально. Именно то, что я искал. Я сделал это отдельной функцией вместо вычисляемого свойства в инициализаторе. Спасибо. Также спасибо за упоминание userDefaults и сохранение аутентификации. В моем приложении нет личной информации, поэтому я использую значения по умолчанию. Ура, приятель
Вы можете продолжить путь, которым идете. Однако в SwiftUI
существует оболочка свойства, известная как AppStorage
. По сути, это удобная оболочка для получения и установки значений в UserDefaults
. В этом случае вы можете использовать его так...
import SwiftUI
@main
struct ProjectHogtieApp: App {
@AppStorage("isAuthenticated") private var isAuthenticated: Bool = false
var body: some Scene {
WindowGroup {
if isAuthenticated {
ContentView()
} else {
LoginView()
}
}
}
}
Параметр, принимаемый оболочкой свойства, является вашим ключом, а значение, которое вы предоставляете, является значением по умолчанию, но оно будет перезаписано любым существующим значением в UserDefaults
.
Не знал о appStorage. Это сработало, используя его таким образом, но инициализаторы лучше работают с тем, что у меня есть. Спасибо за совет
Загляните в @AppStorage.