Valet lets you securely store data in the iOS, tvOS, or macOS Keychain without knowing a thing about how the Keychain works. It’s easy. We promise.
Valet.sharedAccessGroupValet
and Valet.iCloudSharedAccessGroupValet
incorrectly returned a Valet.sharedAccessGroupValet
and Valet.iCloudSharedAccessGroupValet
, respectively.Note for apps that released an app with Valet v3.0-3.1.1
If you use Valet.sharedAccessGroupValet
, run the following before accessing data in your Valet.sharedAccessGroupValet
:
let desiredValet = Valet.sharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.valet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
If you use Valet.iCloudSharedAccessGroupValet
, run the following before accessing data in your Valet.iCloudSharedAccessGroupValet
:
let desiredValet = Valet.iCloudSharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.iCloudValet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
SinglePromptSecureEnclaveValet
from tvOS target to get tvOS compiling on deviceThis version is deprecated. Upgrade to 3.1.2+
Known issue: attempting to create a Shared Access Group Valet via Valet.sharedAccessGroupValet
or Valet.iCloudSharedAccessGroupValet
would create a standard / non-shared Valet.
Workaround
For those who released an app with Valet v3.0-3.1.1 and used a Valet.sharedAccessGroupValet
, run the following before accessing data in your Valet.sharedAccessGroupValet
:
let desiredValet = Valet.sharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.valet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
For those who released an app with Valet v3.0-3.1.1 and used a Valet.iCloudSharedAccessGroupValet
, run the following before accessing data in your Valet.iCloudSharedAccessGroupValet
:
let desiredValet = Valet.iCloudSharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.iCloudValet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
This version is deprecated. Upgrade to 3.1.2+
Known issue: This version does not build on tvOS devices due to the inclusion of LocalAuthentication
in the tvOS target code.
Workaround Update to 3.1.2+
Known issue: attempting to create a Shared Access Group Valet via Valet.sharedAccessGroupValet
or Valet.iCloudSharedAccessGroupValet
would create a standard / non-shared Valet.
Workaround
For those who released an app with Valet v3.0-3.1.1 and used a Valet.sharedAccessGroupValet
, run the following before accessing data in your Valet.sharedAccessGroupValet
:
let desiredValet = Valet.sharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.valet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
For those who released an app with Valet v3.0-3.1.1 and used a Valet.iCloudSharedAccessGroupValet
, run the following before accessing data in your Valet.iCloudSharedAccessGroupValet
:
let desiredValet = Valet.iCloudSharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.iCloudValet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
This version is deprecated. Upgrade to 3.1.2+
Known issue: attempting to create a Shared Access Group Valet via Valet.sharedAccessGroupValet
or Valet.iCloudSharedAccessGroupValet
would create a standard / non-shared Valet.
Workaround
For those who released an app with Valet v3.0-3.1.1 and used a Valet.sharedAccessGroupValet
, run the following before accessing data in your Valet.sharedAccessGroupValet
:
let desiredValet = Valet.sharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.valet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
For those who released an app with Valet v3.0-3.1.1 and used a Valet.iCloudSharedAccessGroupValet
, run the following before accessing data in your Valet.iCloudSharedAccessGroupValet
:
let desiredValet = Valet.iCloudSharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.iCloudValet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
This version is deprecated. Upgrade to 3.1.2+
Known issue: attempting to create a Shared Access Group Valet via Valet.sharedAccessGroupValet
or Valet.iCloudSharedAccessGroupValet
would create a standard / non-shared Valet.
Workaround
For those who released an app with Valet v3.0-3.1.1 and used a Valet.sharedAccessGroupValet
, run the following before accessing data in your Valet.sharedAccessGroupValet
:
let desiredValet = Valet.sharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.valet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
For those who released an app with Valet v3.0-3.1.1 and used a Valet.iCloudSharedAccessGroupValet
, run the following before accessing data in your Valet.iCloudSharedAccessGroupValet
:
let desiredValet = Valet.iCloudSharedAccessGroupValet(with: yourIdentifier, accessibility: yourAccessibility)
let mistakenlyCreatedValet = Valet.iCloudValet(with: yourIdentifier, accessibility: yourAccessibility)
desiredValet.migrateObjects(from: mistakenlyCreatedValet, removeOnCompletion: true)
- [VALSinglePromptSecureEnclaveValet containsObjectForKey]
from returning a false positive after the keychain has been modified by the system after a user authentication (passcode, Touch ID, Face ID) modification.-migrateObjectsMatchingQuery:removeOnCompletion:
VALSinglePromptSecureEnclaveValet
, which allows multiple accesses to the secure enclave with a single user prompt.• Allow Touch ID to be used on macOS
• Change nullability of init
and new
to nonnull
to match Xcode 8 SDK