Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Keychain如何仅删除特定项目_Ios_Iphone_Keychain - Fatal编程技术网

Ios Keychain如何仅删除特定项目

Ios Keychain如何仅删除特定项目,ios,iphone,keychain,Ios,Iphone,Keychain,我是iOS新手。我需要在本地保存数据。和android一样,我们可以在SharedReferences中保存数据。开发人员可以清除整个共享首选项,还可以删除/删除特定密钥 我使用钥匙链就是为了这个目的。但现在我只想删除/删除一个密钥。但我在如何做到这一点上遇到了问题。这是我从SO那里得到的钥匙链密码 public class KeychainService: NSObject { static let USER_PIN : String = "USER_PIN" sta

我是iOS新手。我需要在本地保存数据。和android一样,我们可以在SharedReferences中保存数据。开发人员可以清除整个共享首选项,还可以删除/删除特定密钥

我使用钥匙链就是为了这个目的。但现在我只想删除/删除一个密钥。但我在如何做到这一点上遇到了问题。这是我从SO那里得到的钥匙链密码

    public class KeychainService: NSObject {

    static let USER_PIN : String = "USER_PIN"
    static let LOGGEDIN_ID : String = "LOGGEDIN_ID"
    static let USER_NAME : String = "USER_NAME"
    static let IS_USER_LOGGEDIN : String = "IS_USER_LOGGEDIN"


    static let IS_APP_SETTINGS_DOWNLOADED : String = "IS_APP_SETTINGS_DOWNLOADED"
    static let APP_SETTINGS_DOWNLOADED : String = "APP_SETTINGS_DOWNLOADED"
    static let APP_NAME : String = "APP_NAME"

    class func iterateKeychainItems(log: Bool, delete: Bool) {
        let secItemClasses = [
            kSecClassGenericPassword,
            kSecClassInternetPassword,
            kSecClassCertificate,
            kSecClassKey,
            kSecClassIdentity
        ]

        if (log) {
            for secItemClass in secItemClasses {
                let query: [String: Any] = [
                    kSecReturnAttributes as String: kCFBooleanTrue,
                    kSecMatchLimit as String: kSecMatchLimitAll,
                    kSecClass as String: secItemClass
                ]

                var result: AnyObject?
                let status = SecItemCopyMatching(query as CFDictionary, &result)
                if status == noErr {
                    print(result as Any)
                }
            }
            print("AppUsageMetadata.iterateKeychainItems ended.")
        }

        if (delete) {
            for secItemClass in secItemClasses {
                let dictionary = [kSecClass as String:secItemClass]
                SecItemDelete(dictionary as CFDictionary)
            }
        }
    }

        class func save(key: String, data: Data) -> OSStatus {
            let query = [
                kSecClass as String       : kSecClassGenericPassword as String,
                kSecAttrAccount as String : key,
                kSecValueData as String   : data ] as [String : Any]

            SecItemDelete(query as CFDictionary)

            return SecItemAdd(query as CFDictionary, nil)
        }

        class func load(key: String) -> Data? {
            let query = [
                kSecClass as String       : kSecClassGenericPassword,
                kSecAttrAccount as String : key,
                kSecReturnData as String  : kCFBooleanTrue,
                kSecMatchLimit as String  : kSecMatchLimitOne ] as [String : Any]

            var dataTypeRef: AnyObject? = nil

            let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)

            if status == noErr {
                return dataTypeRef as! Data?
            } else {
                return nil
            }
        }

        class func createUniqueID() -> String {
            let uuid: CFUUID = CFUUIDCreate(nil)
            let cfStr: CFString = CFUUIDCreateString(nil, uuid)

            let swiftString: String = cfStr as String
            return swiftString
        }
    }

    extension Data {

        init<T>(from value: T) {
            var value = value
            self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
        }

        func to<T>(type: T.Type) -> T {
            return self.withUnsafeBytes { $0.pointee }
        }




}
公共类密钥链服务:NSObject{
静态let USER\u PIN:String=“USER\u PIN”
静态let LOGGEDIN\u ID:String=“LOGGEDIN\u ID”
静态let USER\u NAME:String=“USER\u NAME”
静态let IS\u USER\u LOGGEDIN:String=“IS\u USER\u LOGGEDIN”
静态let是否已下载应用程序设置:String=“是否已下载应用程序设置”
静态让应用程序设置下载:String=“应用程序设置下载”
静态let APP\u NAME:String=“APP\u NAME”
类func iterateKeychainItems(日志:Bool,删除:Bool){
设secItemClasses=[
kSecClassGenericPassword,
kSecClassInternetPassword,
kSecClassCertificate,
kSecClassKey,
kSecClassIdentity
]
如果(日志){
对于secItemClass中的secItemClass{
let query:[字符串:任意]=[
kSecReturnAttributes作为字符串:kCFBooleanTrue,
kSecMatchLimit作为字符串:kSecMatchLimitAll,
kSecClass作为字符串:secItemClass
]
var结果:AnyObject?
let status=SecItemCopyMatching(查询为CFDictionary,&结果)
如果状态==noErr{
打印(结果如有)
}
}
打印(“AppUsageMetadata.iterateKeychainItems结束”)
}
如果(删除){
对于secItemClass中的secItemClass{
let dictionary=[kSecClass as String:secItemClass]
SecItemDelete(字典作为CFDictionary)
}
}
}
类func save(键:String,数据:data)->OSStatus{
让查询=[
kSecClass作为字符串:kSecClassGenericPassword作为字符串,
kSecAttrAccount作为字符串:键,
kSecValueData作为字符串:数据]作为[字符串:任意]
SecItemDelete(作为CFDictionary查询)
返回SecItemAdd(查询为CFDictionary,nil)
}
类func加载(键:字符串)->数据{
让查询=[
kSecClass as字符串:kSecClassGenericPassword,
kSecAttrAccount作为字符串:键,
kSecReturnData作为字符串:kCFBooleanTrue,
kSecMatchLimit as String:kSecMatchLimitOne]as[String:Any]
var dataTypeRef:AnyObject?=nil
let状态:OSStatus=SecItemCopyMatching(作为CFDictionary和dataTypeRef查询)
如果状态==noErr{
是否将dataTypeRef返回为!数据?
}否则{
归零
}
}
类func createUniqueID()->字符串{
让uuid:CFUUID=CFUUIDCreate(nil)
让cfStr:CFString=CFUUIDCreateString(nil,uuid)
让swifftString:String=cfStr作为字符串
返回快捷键
}
}
扩展数据{
初始值(起始值:T){
var值=价值
init(缓冲区:UnsafeBufferPointer(开始:&值,计数:1))
}
func to(类型:T.type)->T{
返回self.withUnsafeBytes{$0.pointee}
}
}
现在告诉我如何删除一个键/项。例如,我想 remove IS_USER_LOGGEDIN键。需要如何做??请帮帮我


您可以像使用共享首选项一样使用用户默认值 对于Swift 3: 用于使用键设置字符串值 UserDefaults.standard.set(“2”,forKey:“LOGINID”)

用于使用键获取字符串值 让LoginID=UserDefaults.standard.string(forKey:“LoginID”)

用于通过键移除 UserDefaults.standard.removeObject(forKey:“LOGINID”)

适用于Swift2.2 让defaults=NSUserDefaults.standardUserDefaults()
defaults.setObject(“2”,forKey:“LOGINID”)

在GitHub上有一个很好的用于访问系统密钥链的包装器:


只需根据您的需要使用“setPassword”和“deletePassword”功能。

您能在您的delete方法中添加这段代码吗?如果(status!=errSecSuccess){if let err=seccopyrormessagestring(status,nil){print(“Remove failed:(err)”,我们至少可以跟踪密钥是否被删除}我知道用户默认设置。所以问题是关于钥匙链的