当前位置: 首页 > 面试题库 >

通过KeyChain保存和检索值

周翼
2023-03-14
问题内容

我正在尝试存储一个Integer并使用KeyChain对其进行检索。

这是我如何保存它:

func SaveNumberOfImagesTaken()
    {
        let key = "IMAGE_TAKEN"
        var taken = 10
        let data = NSKeyedArchiver.archivedDataWithRootObject(taken)
        let query : [String:AnyObject] = [
            kSecClass as String : kSecClassGenericPassword,
            kSecAttrAccount as String : key,
            kSecValueData as String : data
        ]
        let status : OSStatus = SecItemAdd(query as CFDictionaryRef, nil)

    }

这是我尝试检索它的方式:

func CheckIfKeyChainValueExitss() -> AnyObject? {
    var key = "IMAGE_TAKEN"
    let query : [String:AnyObject] = [
        kSecClass as String       : kSecClassGenericPassword,
        kSecAttrAccount as String : key,
        kSecReturnData as String  : kCFBooleanTrue,
        kSecMatchLimit as String  : kSecMatchLimitOne ]

    var dataTypeRef :Unmanaged<AnyObject>?

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

    if let op = dataTypeRef?.toOpaque() {
        let data = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue()
        if let string: AnyObject? =  NSKeyedUnarchiver.unarchiveObjectWithData(data) as? AnyObject? {
            if key == "IMAGE_TAKEN"
            {
                return string as! String!

            }
            else if string == nil
            {
                return nil
            }
        }
    }
    return nil

}

我收到以下错误:

无法将类型’__NSCFNumber’的值强制转换为’NSString’

我尝试使用变量,但没有成功。


问题答案:

好吧,我只是用光了源代码等,并做了自己的好帮手:尽情享受吧!

 class func save(key: String, data: NSData) {
        let query = [
            kSecClass as String       : kSecClassGenericPassword as String,
            kSecAttrAccount as String : key,
            kSecValueData as String   : data ]

        SecItemDelete(query as CFDictionaryRef)

        let status: OSStatus = SecItemAdd(query as CFDictionaryRef, nil)

    }

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

        var dataTypeRef :Unmanaged<AnyObject>?

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

        if status == noErr {
            return (dataTypeRef!.takeRetainedValue() as! NSData)
        } else {
            return nil
        }


    }

    class func stringToNSDATA(string : String)->NSData
    {
        let _Data = (string as NSString).dataUsingEncoding(NSUTF8StringEncoding)
        return _Data!

    }


    class func NSDATAtoString(data: NSData)->String
    {
        var returned_string : String = NSString(data: data, encoding: NSUTF8StringEncoding)! as String
        return returned_string
    }

    class func intToNSDATA(r_Integer : Int)->NSData
    {

            var SavedInt: Int = r_Integer
            let _Data = NSData(bytes: &SavedInt, length: sizeof(Int))
        return _Data

    }
    class func NSDATAtoInteger(_Data : NSData) -> Int
    {
            var RecievedValue : Int = 0
            _Data.getBytes(&RecievedValue, length: sizeof(Int))
            return RecievedValue

    }
    class func CreateUniqueID() -> String
    {
        var uuid: CFUUIDRef = CFUUIDCreate(nil)
        var cfStr:CFString = CFUUIDCreateString(nil, uuid)

        var nsTypeString = cfStr as NSString
        var swiftString:String = nsTypeString as String
        return swiftString
    }

    //EXAMPLES
//    
//    //Save And Parse Int


//    var Int_Data = KeyChain.intToNSDATA(555)
//    KeyChain.save("MAMA", data: Int_Data)
//    var RecievedDataAfterSave = KeyChain.load("MAMA")
//    var NSDataTooInt = KeyChain.NSDATAtoInteger(RecievedDataAfterSave!)
//    println(NSDataTooInt)
//    
//    
//    //Save And Parse String


//    var string_Data = KeyChain.stringToNSDATA("MANIAK")
//    KeyChain.save("ZAHAL", data: string_Data)
//    var RecievedDataStringAfterSave = KeyChain.load("ZAHAL")
//    var NSDATAtoString = KeyChain.NSDATAtoString(RecievedDataStringAfterSave!)
//    println(NSDATAtoString)


 类似资料:
  • 问题内容: 如何简单地将字符串存储在钥匙串中并在需要时加载。有几种SO解决方案,主要涉及Git回购。但是我需要最新的Swift上最小,最简单的解决方案。当然,我不想添加git框架来仅在项目中存储密码。 有类似的解决方案,通过KeyChain保存和检索值对我不起作用。厌倦了编译器错误。 问题答案: 最简单的来源 通话范例 SWIFT 4:具有更新和删除密码的版本 您需要想象以下内容连接到文本输入字段

  • 问题内容: 我有一个具有以下结构的模型 保存时其他一切都很好。它将另存为Firebase Realtime数据库 但是当我尝试检索它时,日期给出了以下错误- 我知道Firebase不支持Java Date对象,但是由于它将它们保存在地图中,如何从该地图中获取日期?在Firebase Android中,是否有任何适当的保存和检索日期的方法? 问题答案: 您可以将日期存储为纪元日期。您可以花很长的时间

  • 问题内容: 我正在尝试将Redis会话集成到用Node.js编写的身份验证系统中。 我已经能够成功设置Redis服务器和Express服务器。 这是我的设置(只是重要的一点): 现在…我该如何实际创建,阅读和销毁会话?我已经阅读了很多关于如何设置的文章以及关于SO的许多问题,但是我发誓每个都只停留在配置上,并且不解释如何实际使用它… 我知道这可能非常简单,但是请不要投票,而只是解释一下:)。 问题

  • 问题内容: 这是我的表的一个例子: 这就是我需要的信息。基本上是它,但在每个“路线”的列中: 我以为我需要一个枢轴,这是我正在尝试学习的,但是我无法在我的一生中拼凑出一个行之有效的简洁查询。 我已经尝试过类似的事情: 但是,这为我提供了“全部”列,无论如何我都不相信它是适当的-它需要“分组”并将各列放在一起,这也是我所坚持的。 有什么我想念的吗?还是有更好的方法来解决这个问题? 谢谢! 问题答案:

  • 问题内容: 嗨,我正在尝试将EditText小部件值保存在手机/平板电脑的内部存储器中,以便应用程序关闭或活动停止时可以自动检索它们。所有这些都可以使用保存按钮来完成。(窗口小部件的值由用户输入)。 问题答案: 您应该使用共享首选项,共享首选项用于在需要访问数据时将其存储在本地应用程序中。使用此链接https://www.journaldev.com/9412/android- shared-pr

  • 我有以下2类与Hibernate和Hibernate搜索注释: 父类: 儿童班: 我为上述场景创建了一个索引。现在我试图通过搜索给定的父名称来获得所有的子名称。 我在现场使用的投影如下: 现在,当我尝试运行查询来检索搜索结果时,我只得到父模型的第一个孩子的名字。 当我看到使用Luke的索引时,我能够看到文档中的所有值。 如何获取索引中存储的所有子名称列表?