Comments (5)
Additional context: Apple documentation explicitly says:
SecItemUpdate blocks the calling thread, so it can cause your app’s UI to hang if called from the main thread. Instead, call SecItemUpdate from a background dispatch queue or async function.
and now that we have async/await functionality, it feels like a great time/opportunity to make this properly asynchronous.
from valet.
We should absolutely mark Valet
objects as @unchecked Sendable
since they are already thread-safe.
We could also make a breaking change to make Valet
objects actor
s rather than final class
es: that would be the correct model for a type that is both thread-safe and shouldn't operate on the main queue. However, enabling values to be read synchronously is valuable to consumers: even though doing keychain operations on main
queue is not a good practice, I wouldn't want to prevent a consumer from being able to read keychain values from main
if they so desire. My 2c is that the most flexible way forward is to conform to @unchecked Sendable
and let consumers write their own actor
wrapper around Valet
to ensure that they don't synchronously read from keychain on the main
queue.
Longer-term, in our next breaking API change (which we're overdue for – we're still supporting Xcode 11), it may make sense to:
- Remove the locks within
Valet
types and remove@unchecked Sendable
, effectively makingValet
types unsafe for use across multiple threads. - Expose
Valet
initializers to consumers and remove the static methods that always return the same instance of aValet
object. - Create
ValetActor
(would love a better name here) types that are of typeactor
and wrap thefinal class Valet
types.
This approach would create consumer flexibility, remove our use of locks (which I'm honestly not sure we need today – I never read the open-source Security framework's SecItem
calls to determine if they were already thread-safe), and create async
APIs for folk who are optimizing for main queue performance.
Open to suggestions here. I'm also open to re-assigning ownership of this task – I haven't worked for Square since 2016 and am trying to focus my open source time on projects hosted on my own page.
from valet.
Related Issues (20)
- Feature Request, Unlock with Apple Watch HOT 6
- Add convenience access methods for `Codable` types HOT 6
- .whenUnlocked vs .afterFirstUnlock HOT 3
- Create new KeyChain Option HOT 5
- SecKeychainAddCallback(_:_:_:) along with Valet HOT 4
- Enable customization of biometrics prompt with application-specific fallback HOT 26
- Unit tests fail on tvOS 14 HOT 4
- Tips on building and running the sample app? HOT 1
- Keychain Sharing between iOS App and Apple Watch Extension HOT 6
- Documentation for `afterFirstUnlockThisDeviceOnly` wrong? HOT 1
- iOS 15 crash on `specialized static SecItem.copy<A>(matching:)` HOT 18
- [Feature Request] Unlock with Apple Watch with no passcode fallback HOT 7
- iOS 16 build error HOT 6
- tvOS target doesn't compile with Xcode 14.0 beta HOT 8
- Deprecation warnings when targeting iOS 14+ HOT 4
- error: non-void function does not return a value [-Werror,-Wreturn-type] HOT 2
- No way to invalidate() HOT 1
- Support for cryptographic key item (kSecClassKey) HOT 2
- Could not find module 'Valet' for target 'x86_64-apple-ios-simulator' HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from valet.