How to call SecItemCopyMatching in Xcode 7 beta 4?
This works on Xcode 7 beta 4
var dataTypeRef: AnyObject?
let status: OSStatus = withUnsafeMutablePointer(&dataTypeRef) { SecItemCopyMatching(keychainQuery as CFDictionaryRef, UnsafeMutablePointer($0)) }
if status == noErr {
return dataTypeRef as? NSData
}
else {
return nil
}
swift 2.0 keychain type errors for SecItemCopyMatching
It seems, we don't need Unmanaged<>
work anymore.
Try:
var retrievedData: NSData?
var extractedData: AnyObject?
let status = SecItemCopyMatching(keyChainQuery, &extractedData)
if (status == errSecSuccess) {
retrievedData = extractedData as? NSData
}
SecItemAdd always returns error -34018 in Xcode 8 in iOS 10 simulator
I was able to work around this in my app by adding Keychain Access Groups to the Entitlements file. I turned on the Keychain Sharing switch in the Capabilities section in your test app, and it is working for me as well.
Item to add to entitlements:
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>
I have only tried this on macOS Sierra (10.12), so I'm not sure if it will work for you on 10.11.5.
Keychain Query Always Returns errSecItemNotFound After Upgrading to iOS 13
I've had a similar issue where I was getting errSecItemNotFound
with any Keychain-related action but only on a simulator. On real device it was perfect, I've tested with latest Xcodes (beta, GM, stable) on different simulators and the ones that were giving me a hard time were iOS 13 ones.
The problem was that I was using kSecClassKey
in query attribute kSecClass
, but without the 'required' values (see what classes go with which values here) for generating a primary key:
kSecAttrApplicationLabel
kSecAttrApplicationTag
kSecAttrKeyType
kSecAttrKeySizeInBits
kSecAttrEffectiveKeySize
And what helped was to pick kSecClassGenericPassword
for kSecClass
and provide the 'required' values for generating a primary key:
kSecAttrAccount
kSecAttrService
See here on more about kSecClass types and what other attributes should go with them.
I came to this conclusion by starting a new iOS 13 project and copying over the Keychain wrapper that was used in our app, as expected that did not work so I've found this lovely guide on using keychain here and tried out their wrapper which no surprise worked, and then went line by line comparing my implementation with theirs.
This issue already reported in radar: http://openradar.appspot.com/7251207
Hope this helps.
Adding item to keychain using Swift
In the xcode 6.0.1 you must do this!!
let kSecClassValue = NSString(format: kSecClass)
let kSecAttrAccountValue = NSString(format: kSecAttrAccount)
let kSecValueDataValue = NSString(format: kSecValueData)
let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)
let kSecAttrServiceValue = NSString(format: kSecAttrService)
let kSecMatchLimitValue = NSString(format: kSecMatchLimit)
let kSecReturnDataValue = NSString(format: kSecReturnData)
let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne)
Adding Items to and Querying the iOS Keychain with Swift
In order to get this to work, you will need to retrieve the retained values of the keychain constants and store then first like so:
let kSecClassValue = kSecClass.takeRetainedValue() as NSString
let kSecAttrAccountValue = kSecAttrAccount.takeRetainedValue() as NSString
let kSecValueDataValue = kSecValueData.takeRetainedValue() as NSString
let kSecClassGenericPasswordValue = kSecClassGenericPassword.takeRetainedValue() as NSString
let kSecAttrServiceValue = kSecAttrService.takeRetainedValue() as NSString
let kSecMatchLimitValue = kSecMatchLimit.takeRetainedValue() as NSString
let kSecReturnDataValue = kSecReturnData.takeRetainedValue() as NSString
let kSecMatchLimitOneValue = kSecMatchLimitOne.takeRetainedValue() as NSString
You can then reference the values in the NSMutableDictionary like so:
var keychainQuery: NSMutableDictionary = NSMutableDictionary(
objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue],
forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue]
)
I wrote a blog post about it at:
http://rshelby.com/2014/08/using-swift-to-save-and-query-ios-keychain-in-xcode-beta-4/
Hope this helps!
rshelby
iOS Swift 5 Keychain Status -50 with error SecItemAdd
It's likely due to a faulty create query. For a generic password, the item should look like this:
let query = [
kSecClass: kSecClassGenericPasswor,
kSecAttrAccount: "_passwordForFacebook",
kSecAttrValueData: Data("myPassword12345.12345".utf8)
] as CFDictionary
Currently, you're setting the kSecClass
to the value of the password.
queryDictionary[kSecClass] = entry.data(using: .utf8) // <-- this is invalid
This should solve that problem for you:
queryDictionary[kSecValueData] = entry.data(using: .utf8)
Related Topics
Most Efficient/Realtime Way to Get Pixel Values from iOS Camera Feed in Swift
Swift Check If 3D Touch Is Possible
Avcapturestillimageoutput VS Avcapturephotooutput in Swift 3
Transition Delegate for Uitabbarcontroller Animation
How to Get All Keys and Values into Separate String Arrays from Nsdictionary in Swift
Uidocumentinteractioncontroller() Swift
Get All Urls for Resources in Sub-Directory in Swift
App Crashes When User Starts Typing in Uisearchbar
How to Insert Items at 0 Index to the Realm Container
Daily Local Notifications Are Not Working
How to Set Kerning (Spacing Between Characters) on Uinavigationbar Title - Swift or Objective-C
Masked Uivisualeffectview Does Not Work on iOS 10
Swiftui Transition from Modal Sheet to Regular View with Navigation Link
Setting Uiimageview Image Affects Layout Constraints
Playing an Audio File Repeatedly with Avaudioengine
Spritekit/Swift - How to Check Contact of Two Nodes When They Are Already in Contact
Issue with Observing Wkwebview Url Changes via JavaScript Events