Valet Versions Save

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.

3.1.2

6 years ago
  • Fixes an issue introduced in 3.0.0 where Valets created with 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)

3.1.1

6 years ago
  • Remove SinglePromptSecureEnclaveValet from tvOS target to get tvOS compiling on device

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)

3.1.0

6 years ago
  • Added support for tvOS

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)

3.0.1

6 years ago
  • Assert when initializing a shared access group Valet with the Bundle Seed ID in the identifier. Addressed #130.

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)

3.0.0

6 years ago
  • Valet is rewritten in Swift!
  • A guide for upgrading from Valet 2.* can be found in our README. Note that you do not need to migrate your keychain data. Only the API surface has changed.

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)

2.4.2

6 years ago
  • Prevent - [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.

2.4.1

6 years ago
  • Prevents malformed manual keychain entries from causing a crash during -migrateObjectsMatchingQuery:removeOnCompletion:

2.4.0

7 years ago
  • Introduces VALSinglePromptSecureEnclaveValet, which allows multiple accesses to the secure enclave with a single user prompt.

2.3.0

7 years ago

• Allow Touch ID to be used on macOS

2.2.3

7 years ago

• Change nullability of init and new to nonnull to match Xcode 8 SDK