Swift - слесарь изменяет уровень доступа с whenUnlocked на afterFirstUnlock - PullRequest
1 голос
/ 14 января 2020

У меня есть приложение, которое пытается получить доступ к элементам цепочки для ключей, когда устройство вызывается в фоновом режиме и блокируется. (спасибо за помощь здесь ).

Я использую Слесарь для управления операциями, связанными с цепочкой для ключей, и теперь я хотел бы изменить уровень доступа с * От 1007 * до afterFirstUnlock. Для класса, в котором у меня есть операции update, load и delete на связке ключей, я унаследовал от SecureStorable и установил доступное, как показано ниже

public var accessible: LocksmithAccessibleOption? = {return .afterFirstUnlock}()

Но проблема не в решить, и я посмотрел на ответ на этот вопрос SO с NOTE , в котором написано

изменение «опции доступности» может привести к потере вашего доступа к данным ранее сохраненный с «опцией доступности» по умолчанию. Если вам нужны эти данные, вам, возможно, придется обрабатывать их отдельно.

Каким образом я должен следовать для реализации миграции / обновления плавно без влияет на пользователей, которые уже используют приложение? Добавление кода моего класса, где я пытаюсь update и load данные из цепочки для ключей, используя Locksmith.

public final class MyAppSession: SecureStorable {

    public var accessible: LocksmithAccessibleOption? = {return .afterFirstUnlock}()

    public fileprivate(set) var isValid: Bool = false

    /**
     Attempts to restore a locally stored session.
     */
    public static func savedSession() -> MyAppSession? {

        do {

            let keychainData = Locksmith.loadDataForUserAccount(userAccount: MyAppSession.MyAppKeychainAccount)
            if let accessToken = keychainData?[MyAppSession.accessTokenKeychainKey] as? String,
                let refreshToken = keychainData?[MyAppSession.refreshTokenKeychainKey] as? String {

                return MyAppSession(accessToken: accessToken, refreshToken: refreshToken)

            }

            else if !UIApplication.shared.isProtectedDataAvailable {                    
                return nil
            }

            else {                    
                return nil
            }
        }
    }

    init?(accessToken: String, refreshToken: String) {

        // Save credentials to the keychain.
        do {

            try Locksmith.updateData(
                data: [MyAppSession.accessTokenKeychainKey: accessToken as AnyObject, MyAppSession.refreshTokenKeychainKey: refreshToken as AnyObject],
                forUserAccount: MyAppSession.MyAppKeychainAccount)

            isValid = true

        }
        catch {
            return nil
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...