У меня есть приложение, которое пытается получить доступ к элементам цепочки для ключей, когда устройство вызывается в фоновом режиме и блокируется. (спасибо за помощь здесь ).
Я использую Слесарь для управления операциями, связанными с цепочкой для ключей, и теперь я хотел бы изменить уровень доступа с * От 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
}
}