Обновление @Published var, если присутствует значение userdefault swift

Я пытаюсь проверить свое приложение и посмотреть, существует ли значение в пользовательских настройках по умолчанию, и если оно существует, оно будет взято в приложение. Если его нет, им нужно ввести пин-код, а затем войти в приложение.

Любая идея, как проверить, присутствует ли значение в пользовательских настройках по умолчанию, а затем изменить 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")

Загляните в @AppStorage.

xTwisteDx 14.05.2022 01:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

попробуйте это, чтобы проверить свой UserDefaults при запуске приложения (т.е. когда Authentication создается):

class Authentication: ObservableObject {
    
    @Published var isValidated = false
    
    // --- here
    init() {
        getIsValidated
    }
  //....

Обратите внимание, что для важных вещей, таких как аутентификация и т. д., вы должны использовать Keychain для безопасного сохранения данных, а не UserDefaults

Это сработало идеально. Именно то, что я искал. Я сделал это отдельной функцией вместо вычисляемого свойства в инициализаторе. Спасибо. Также спасибо за упоминание userDefaults и сохранение аутентификации. В моем приложении нет личной информации, поэтому я использую значения по умолчанию. Ура, приятель

Trey6 14.05.2022 07:23

Вы можете продолжить путь, которым идете. Однако в 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. Это сработало, используя его таким образом, но инициализаторы лучше работают с тем, что у меня есть. Спасибо за совет

Trey6 14.05.2022 07:24

Другие вопросы по теме