# Helper functions for storing text in Keychain for iOS, macOS, tvOS and WatchOS [](https://github.com/Carthage/Carthage) [](http://cocoadocs.org/docsets/KeychainSwift) [](https://github.com/apple/swift-package-manager) [](http://cocoadocs.org/docsets/KeychainSwift) [](http://cocoadocs.org/docsets/KeychainSwift) This is a collection of helper functions for saving text and data in the Keychain. As you probably noticed Apple's keychain API is a bit verbose. This library was designed to provide shorter syntax for accomplishing a simple task: reading/writing text values for specified keys: ```Swift let keychain = KeychainSwift() keychain.set("hello world", forKey: "my key") keychain.get("my key") ``` The Keychain library includes the following features: * Get, set and delete string, boolean and Data Keychain items * Specify item access security level * Synchronize items through iCloud * Share Keychain items with other apps ## What's Keychain? Keychain is a secure storage. You can store all kind of sensitive data in it: user passwords, credit card numbers, secret tokens etc. Once stored in Keychain this information is only available to your app, other apps can't see it. Besides that, operating system makes sure this information is kept and processed securely. For example, text stored in Keychain can not be extracted from iPhone backup or from its file system. Apple recommends storing only small amount of data in the Keychain. If you need to secure something big you can encrypt it manually, save to a file and store the key in the Keychain. ## Setup There are four ways you can add KeychainSwift to your project. #### Add source (iOS 7+) Simply add [KeychainSwiftDistrib.swift](https://github.com/evgenyneu/keychain-swift/blob/master/Distrib/KeychainSwiftDistrib.swift) file into your Xcode project. #### Setup with Carthage (iOS 8+) Alternatively, add `github "evgenyneu/keychain-swift" ~> 24.0` to your Cartfile and run `carthage update`. #### Setup with CocoaPods (iOS 8+) If you are using CocoaPods add this text to your Podfile and run `pod install`. ``` use_frameworks! target 'Your target name' pod 'KeychainSwift', '~> 24.0' ``` #### Setup with Swift Package Manager (in project) * In Xcode select *File > Add Packages*. * Enter this project's URL: https://github.com/evgenyneu/keychain-swift.git #### Setup with Swift Package Manager (in Swift Package) If you're using KeychainSwift in a Swift package, make sure to specify a `name`. This is because SPM cannot automatically resolve a name for a package that has a different Target name in its `Package.swift` (namely `KeychainSwift`) that differs from the repo link (`keychain-swift`). ``` .package(name: "KeychainSwift", url: "https://github.com/evgenyneu/keychain-swift.git", from: "24.0.0") ``` ## Legacy Swift versions Setup a [previous version](https://github.com/evgenyneu/keychain-swift/wiki/Legacy-Swift-versions) of the library if you use an older version of Swift. ## Usage Add `import KeychainSwift` to your source code unless you used the file setup method. #### String values ```Swift let keychain = KeychainSwift() keychain.set("hello world", forKey: "my key") keychain.get("my key") ``` #### Boolean values ```Swift let keychain = KeychainSwift() keychain.set(true, forKey: "my key") keychain.getBool("my key") ``` #### Data values ```Swift let keychain = KeychainSwift() keychain.set(dataObject, forKey: "my key") keychain.getData("my key") ``` #### Removing keys from Keychain ```Swift keychain.delete("my key") // Remove single key keychain.clear() // Delete everything from app's Keychain. Does not work on macOS. ``` #### Return all keys ```Swift let keychain = KeychainSwift() keychain.allKeys // Returns the names of all keys ``` ## Advanced options
## Demo app
## Alternative solutions
Here are some other Keychain libraries.
* [DanielTomlinson/Latch](https://github.com/DanielTomlinson/Latch)
* [jrendel/SwiftKeychainWrapper](https://github.com/jrendel/SwiftKeychainWrapper)
* [kishikawakatsumi/KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess)
* [matthewpalmer/Locksmith](https://github.com/matthewpalmer/Locksmith)
* [s-aska/KeyClip](https://github.com/s-aska/KeyClip)
* [yankodimitrov/SwiftKeychain](https://github.com/yankodimitrov/SwiftKeychain)
## Thanks 👍
* The code is based on this example: [https://gist.github.com/s-aska/e7ad24175fb7b04f78e7](https://gist.github.com/s-aska/e7ad24175fb7b04f78e7)
* Thanks to [diogoguimaraes](https://github.com/diogoguimaraes) for adding Swift Package Manager setup option.
* Thanks to [glyuck](https://github.com/glyuck) for taming booleans.
* Thanks to [pepibumur](https://github.com/pepibumur) for adding macOS, watchOS and tvOS support.
* Thanks to [ezura](https://github.com/ezura) for iOS 7 support.
* Thanks to [mikaoj](https://github.com/mikaoj) for adding keychain synchronization.
* Thanks to [tcirwin](https://github.com/tcirwin) for adding Swift 3.0 support.
* Thanks to [Tulleb](https://github.com/Tulleb) for adding Xcode 8 beta 6 support.
* Thanks to [CraigSiemens](https://github.com/CraigSiemens) for adding Swift 3.1 support.
* Thanks to [maxkramerbcgdv](https://github.com/maxkramerbcgdv) for fixing Package Manager setup in Xcode 8.2.
* Thanks to [elikohen](https://github.com/elikohen) for fixing concurrency issues.
* Thanks to [beny](https://github.com/beny) for adding Swift 4.2 support.
* Thanks to [xuaninbox](https://github.com/xuaninbox) for fixing watchOS deployment target for Xcode 10.
* Thanks to [schayes04](https://github.com/schayes04) for adding Swift 5.0 support.
* Thanks to [mediym41](https://github.com/mediym41) for adding ability to return data as reference.
* Thanks to [AnthonyOliveri](https://github.com/AnthonyOliveri) for adding ability to run unit tests from Swift Package Manager.
* Thanks to [philippec](https://github.com/philippec) for removing deprecated access options.
* Thanks to [lucasmpaim](https://github.com/lucasmpaim) for adding ability to return the names of all keys.
## Feedback is welcome
If you notice any issue, got stuck or just want to chat feel free to create an issue. We will be happy to help you.
## License
Keychain Swift is released under the [MIT License](LICENSE).