Logo

KeyVine

一个 Swift 写的 Keychain 访问封装库,因为世界需要更多这样的库

目前使用于

详细文档可以在这里找到

概述

KeyVine 的目标是成为一个简单且可高度复用的 Keychain 访问封装库,用于 Apple 平台上的 Swift 应用。

市面上已经有很多功能完备且更成熟的同类库,但在我的项目中,我一直觉得需要一种超简单的方式来创建几个“Keychain 属性”,并以最少的麻烦和最常见的默认设置来访问它们。KeyVine 正是做这件事的。

用应用程序标识符和团队 ID 初始化它。

用法

有多种使用方式

读取和写入原始数据

读取和写入简单的 Data

let keyVine = KeyVine(appIdentifier: "com.myApp.identifier", teamId: "ABC1234567")

let storedData = try keyVine.read(fro,: "name_for_my_data")
let myText = String(data: storedData, encoding: .utf8)
print(myText)

let myData = try Data(contentsOf: ...)
try keyVine.write(myData, to: "name_for_my_data")

使用下标运算符

let keyVine = KeyVine(appIdentifier: "com.myApp.identifier", teamId: "ABC1234567")

let storedData = keyVine["name_for_my_data"]
let myText = String(data: storedData, encoding: .utf8)
print(myText)

let myData = try Data(contentsOf: ...)
keyVine["name_for_my_data"] = myData

使用属性包装器

@KeyVine.Property(key: "name_for_my_data", appIdentifier: "com.myApp.identifier", teamId: "ABC1234567")
var storedData: Data?

if let storedData {
    let myText = String(data: storedData, encoding: .utf8)
    print(myText)
}

读取和写入类型

KeyVine 已经支持 String, Date, Bool, Int, FloatDouble,但你也可以让任何类型遵循 KeyVineDataConvertible 协议。

如果类型已经遵循了 LosslessStringConvertible 协议,你可以直接添加 KeyVineStringConvertible 协议,而无需创建额外的序列化代码。

extension MyInfo: KeyVineDataConvertible {
    init?(keyVineData: Data?) {
        ... // initialise from data
    }
    
    var asKeyVineData: Data? {
        let data = ... // Serialise to data
        return data
    }
}

使用下标运算符

let keyVine = KeyVine(appIdentifier: "com.myApp.identifier", teamId: "ABC1234567")

let myInfo: MyInfo = keyVine["my_info_key"]

...

keyVine["my_info_key"] = myInfo

使用属性包装器

为非可选属性提供默认值

@KeyVine.Property(key: "my_info_key", appIdentifier: "com.myApp.identifier", teamId: "ABC1234567", defaultValue: "Hello world!")
var greeting: String

print(greeting) // 'Hello world!'

或者不提供

@KeyVine.OptionalProperty(key: "my_info_key", appIdentifier: "com.myApp.identifier", teamId: "ABC1234567")
var storedInfo: MyInfo?

if let storedInfo {
    doStuff(with: storedInfo)
}

...

storedInfo = MyInfo()

许可

版权所有 (c) 2023 Paul Tsochantaris。根据 MIT 许可证授权,详情请参见 LICENSE 文件。