Вы действительно можете хранить / извлекать / удалять значения в связке ключей, используя C API, предоставляемый Apple. Но сначала я хочу уточнить ответы, которые вы уже получили: хранить JWT в пользовательских настройках по умолчанию полностью не рекомендуется, поскольку все, что там хранится, рассматривается как простой текст и ставит под угрозу безопасность ваших данных / API.
Вы можете убедиться в этом сами, зайдя в комплект приложения через FileManager и найдя список предпочтений.plist, если я хорошо помню.
Теперь, возвращаясь к вашему вопросу, я могу предоставить некоторую помощь, но мне не хватает части для доступа к определенной группе доступа цепочки для ключей, хотя это не должно быть сложным ...
Итак, эти шаги суммируют общее использование цепочки для ключей:
- Поскольку цепочка для ключей является БД SQLite3, вам нужно начать с создания запроса.
- НЕТ проверки на наличие дубликатов, когда вы что-то храните там, поэтому вам нужно будет удалить текущий элемент перед добавлением нового, просто чтобы сохранить вещи на месте, если элемент, который вы пытаетесь удалить, не существует, он ничего не делает .
- Добавить элемент (запрос) в цепочку ключей.
Вот пример в Swift, поймите его, чтобы вы могли легко перевести его в ObjC:
// value is anything you want to store, let's say "Hello Jobs", and you need to
convert that value to data.
if let valueData = value.data(using: .utf8) {
return [kSecClass as String: kSecClassGenericPassword as String,
kSecAttrAccount as String: key,
kSecValueData as String: valueData] as [String:Any]
}
SecItemDelete(query as CFDictionary) // Delete the query if exists
SecItemAdd(query as CFDictionary, nil) // Store your value
Как видите, вам нужно привести запросы к CFDictionary, так как это ожидаемый тип, который C API получает в качестве параметра.
Теперь, чтобы извлечь сохраненное значение, вам нужно сделать следующее:
// You need a query again, but this time you add extra parameters to indicate you want to return the value as data using the boolean below and to limit the query to just 1 item.
let query = [kSecClass as String: kSecClassGenericPassword as String,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue,
kSecMatchLimit as String: kSecMatchLimitOne] as [String: Any]
// You define a var to use its reference (memory address) as its required by the SecItemCopyMatching API so it can store the outcome of the query there.
var dataTypeRef: AnyObject?
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == noErr {
return dataTypeRef as? Data // If the query was successful you retrieve the data by casting your previously defined var to a Data type
}
Единственное, что здесь осталось сделать, - это преобразовать извлеченное значение Data во все, что вам нужно, в этом случае это будет String как тип вашего JWT.
Надеюсь, вы можете использовать это как руководство, я уверен, что вам нужно добавить одно дополнительное значение в запрос, чтобы использовать конкретную группу цепочки для ключей, из которой вы хотите получить данные.
??