キーホルダー導入と使用

キーホルダーは何ですか?

iOSのキーチェーンサービスは、個人情報(パスワード、シリアル番号、証明書など)の確実な保持を提供方法は、各プログラムが別々のキーチェーンのストレージを持っているIOS。
いくつかは、など、パスワード、証明書などの個人情報を格納するために使用される、Appのキーホルダーが情報を保存、削除、失われることはありません、それは再インストールのアプリケーションへのユーザーの後にまだ有効です。
同じことは、アプリケーション間のデータ共有に適用されます。私たちは、キーと値のストアのフォーム内のすべてのデータは、あなたが辞書にこれら四つの操作を追加、更新、取得、削除することができますし、辞書として理解キーホルダーことができます。

プレゼンテーションの4つの方法キーホルダー?

保管方法

OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result)
复制代码

属性:データを追加するには
、結果をデータを記憶し、データへの参照を返した後、ゼロにこのデータを使用していません

条件のクエリメソッド

OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)
复制代码

クエリ:データ照会する条件
の結果を:データを参照するための照会

データを更新する方法

OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
复制代码

クエリ:データクエリを更新するには
attributesToUpdateを:データが更新されます

データ・メソッドを削除します

OSStatus SecItemDelete(CFDictionaryRef query)
复制代码

クエリ:削除するデータを照会

使用キーホルダー

あなたは、セキュリティフレームワークsecutity.frameworkをインポートする必要がキーホルダーファーストを使用します

クエリを作成します。

class func createQuaryMutableDictionary(identifier: String)->NSMutableDictionary{
    // 创建一个条件字典
    let keychainQuaryMutableDictionary = NSMutableDictionary.init(capacity: 0)
    // 设置条件存储的类型
    keychainQuaryMutableDictionary.setValue(kSecClassGenericPassword, forKey: kSecClass as String)
    // 设置存储数据的标记
    keychainQuaryMutableDictionary.setValue(identifier, forKey: kSecAttrService as String)
    keychainQuaryMutableDictionary.setValue(identifier, forKey: kSecAttrAccount as String)
    // 设置数据访问属性
    keychainQuaryMutableDictionary.setValue(kSecAttrAccessibleAfterFirstUnlock, forKey: kSecAttrAccessible as String)
    // 返回创建条件字典
    return keychainQuaryMutableDictionary
}
复制代码

データストレージ

class func keyChainSaveData(data: Any ,withIdentifier identifier:String)-> Bool {
    // 获取存储数据的条件
    let keyChainSaveMutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)
    // 删除旧的存储数据
    SecItemDelete(keyChainSaveMutableDictionary)
    // 设置数据
    keyChainSaveMutableDictionary.setValue(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as String)
    // 进行存储数据
    let saveState = SecItemAdd(keyChainSaveMutableDictionary, nil)
    if saveState == noErr  {
        return true
    }
    return false
}
复制代码

データの更新

class func keyChainUpdata(data: Any ,withIdentifier identifier:String)->Bool {
    // 获取更新的条件
    let keyChainUpdataMutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)
    // 创建数据存储字典
    let updataMutableDictionary = NSMutableDictionary.init(capacity: 0)
    // 设置数据
    updataMutableDictionary.setValue(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as String)
    // 更新数据
    let updataStatus = SecItemUpdate(keyChainUpdataMutableDictionary, updataMutableDictionary)
    if updataStatus == noErr {
        return true
    }
    return false
}
复制代码

クエリデータ

class func keyChainReadData(identifier: String)-> Any {
    var idObject:Any?
    // 获取查询条件
    let keyChainReadmutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)
    // 提供查询数据的两个必要参数
    keyChainReadmutableDictionary.setValue(kCFBooleanTrue, forKey: kSecReturnData as String)
    keyChainReadmutableDictionary.setValue(kSecMatchLimitOne, forKey: kSecMatchLimit as String)
    // 创建获取数据的引用
    var queryResult: AnyObject?
    // 通过查询是否存储在数据
    let readStatus = withUnsafeMutablePointer(to: &queryResult) { SecItemCopyMatching(keyChainReadmutableDictionary, UnsafeMutablePointer($0))}
    if readStatus == errSecSuccess {
    if let data = queryResult as! NSData? {
        idObject = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as Any
    }
    }
    return idObject as Any
}
复制代码

データを削除します。

class func keyChianDelete(identifier: String)->Void{
    // 获取删除的条件
    let keyChainDeleteMutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)
    // 删除数据
    SecItemDelete(keyChainDeleteMutableDictionary)
}
复制代码

シンプルなアプリケーション

UUIDを取得します。

直接アクセスのUUIDアプリを再インストールしてアンロードした後、それぞれの時間は、私たちがUUIDを保存するためのkeychianを使用し、独自のUUIDを得るためには、UUIDの変化を引き起こす可能性があり

class func getUUID() -> String {
    if let uuid = QWUUIDTools.keyChainReadData(identifier: "key") as? String {
        return uuid
    }else {
        if let uuid = UIDevice.current.identifierForVendor?.uuidString {
            if QWUUIDTools.keyChainSaveData(data: uuid, withIdentifier: "key") {
                return uuid
            }
        }
    }
    return "simulator"
}
复制代码

おすすめ

転載: blog.csdn.net/weixin_33910137/article/details/91374812