Keyri iOS SDK 的最新源代码可在此处找到:https://github.com/Keyri-Co/keyri-ios-whitelabel-sdk/releases
系统需求
-
iOS 14+
-
Swift 5+
-
Apple A7 芯片或更高版本(iPhone 5s 中使用的 A7 芯片)
目录
- 集成
- 二维码登录
- 设备指纹识别
- 与 API 交互
- 会话对象
集成
****CocoaPods 是 Cocoa 项目的依赖关系管理器。有关用法和安装说明,请访问他们的网站。要使用 CocoaPods 将 Keyri iOS SDK 集成到您的 Xcode 项目中,在您的 Podfile 中指定它
pod 'keyri-pod'
然后可以将 SDK 以以下方式导入任何 Swift 文件
import keyri-pod
二维码登录 - 通用链接
要处理通用链接(例如,从用户的内置相机应用中直接进行二维码登录),您需要在您的 App.entitlements 中添加关联域名权限。要在您的应用程序中设置权限,请打开 Xcode 中目标的签名和功能选项卡并添加关联域名功能,或者如果您已有权限,您可以修改您的 App.entitlements 文件以匹配此示例。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:{domainName}</string>
</array>
</dict>
</plist>
这将为以下方案的链接进行处理:https://{您的公司}.onekey.to?sessionId={sessionId}
注意:Keyri 会在您在 控制台 中配置后自动创建您的 https://{您的子域名}.onekey.to
页面。
在声明链接处理的 AppDelegate 中,您需要在 application(_:continue:restorationHandler:)
方法中添加处理程序。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL
else {
return false
}
process(url: incomingURL)
return true
}
func process(url: URL) {
let sessionId = URLComponents(url: url, resolvingAgainstBaseURL: true)?.queryItems?.first(where: { $0.name == "sessionId" })?.value ?? ""
let payload = "Custom payload here"
let appKey = selectedAppKey // Get this value from the Keyri Developer Portal
let keyri = Keyri() // Be sure to import the SDK at the top of the file
let res = keyri.initializeQrSession(username: "lol", sessionId: sessionId, appKey: appKey) { result in
switch result {
case .success(let session):
DispatchQueue.main.async {
session.payload = payload
keyri.initializeDefaultScreen(sessionId: session.sessionId) { bool in
print(bool)
}
}
case .failure(let error):
print(error.localizedDescription)
}
}
注意:Keyri 将根据苹果的要求在您的 https://{您的子域名}.onekey.to
页面上设置所需的 /.well-known/apple-app-site-association
JSON,以处理通用链接处理。有关此机制的详细信息,请参见此处:https://developer.apple.com/documentation/Xcode/supporting-associated-domains
二维码登录 - 应用内扫描仪
这可以与通用链接一起使用或单独使用。
Keyri SDK 包括一个默认的扫描仪视图,可以像下面这样调用和显示。由于平台限制,我们目前必须将其保留在 UIKit 中,但随着时间的推移,我们会寻找将其转换为 SwiftUI 的选项。完成块这里是重要的部分:我们返回显示在二维码中的确切字符串。您只需要将其转换为 URL,然后您可以像上面一样处理响应(请注意,两个情况中的 process(url)
函数都是一样的)。
ptfunc handleDisplayingScanner() {
let scanner = Scanner()
scanner.completion = { str in
guard let url = URL(string: str) else { return nil }
process(url)
}
scanner.show()
}
func process(url: URL) {
let sessionId = URLComponents(url: url, resolvingAgainstBaseURL: true)?
.queryItems?.first(where: { $0.name == "sessionId" })?.value ?? ""
let payload = "Custom payload here"
let appKey = "App key here" // Get this value from the Keyri Developer Portal
let keyri = Keyri() // Be sure to import the SDK at the top of the file
let res = keyri.initializeQrSession(appKey: appKey, sessionId: sessionId, payload: payload)
switch res {
case .success(let session):
// You can optionally create a custom screen and pass the session ID there. We recommend this approach for large enterprises
initializeDefaultScreen(session)
// In a real world example you’d wait for user confirmation first
session.confirm() // or session.deny()
case .failure(let error):
print(error)
}
}
设备指纹识别
Keyri 允许进行设备指纹识别,即使在应用被删除并重新安装的情况下也能持续。下面是一个如何利用这一功能的简单示例,在这种情况下,限制每个设备只能有1个用户
Swift 代码
func registerUser(username: String) throws {
if let list = Keyri().listUniqueAccounts() {
if let existingUsername = list.keys.first {
// Alert user that there is an existing user, and encourage them to sign in here
}
} else {
let key = try Keyri().generateAssociationKey(username: username)
// Then run your regular registration process
// Optionally, do something else with the key that was just generated
// Keyri handles saving the key in the Secure Enclave for you
// For example, you can later use this key pair to passwordlessly authenticate the user
}
}
与API交互
以下方法可用于与Keyri SDK API交互,可以用来构建自定义流程并以不同方式利用SDK
-
func initiateQrSession(sessionId: String, appKey: String): Result<Session, Error>
- 在从二维码或深度链接获取sessionId后调用。返回包含风险属性(需要显示确认屏幕)的Session对象或异常。 -
func initializeDefaultConfirmationScreen(session: Session): Boolean
- 用于显示默认UI的确认对话框。您还可以实现自定义确认屏幕。默认屏幕使用SwiftUI构建,但会话对象也设计成能够与UIKit无缝工作,如果您希望这样做 -
func Session.confirm(publicUserId: String?, payload: String):Result<Bool, Error>
- 如果用户确认对话框,请调用此函数。返回身份验证结果。 -
func Session.deny(publicUserId: String?, payload: String): Result<Bool, Error>
- 如果用户拒绝对话框,请调用此函数。返回身份验证结果。 -
func generateAssociationKey(publicUserId: String): String
- 为给定的公开用户ID(例如电子邮件地址)创建持久化的ECDSA密钥对并返回公钥。 -
func getUserSignature(publicUserId: String?, customSignedData: String?): String
- 返回带有publicUserId的私有密钥(如果没有提供,则为匿名私有密钥)对时间戳和可选的customSignedData的ECDSA签名。 -
func getAssociationKey(publicUserId: String): String
- 返回指定publicUserId的Base64公钥。 -
func removeAssociationKey(publicUserId: String)
- 删除指定用户的密钥,删除其记录 -
func listAssociationKeys(): [String: String]
- 返回一个用户名到关联密钥的映射,设备上的每个这样的密钥
func listUniqueAccounts(): [String: String]
- 返回一个用户名到关联密钥的映射,设备上的每个这样的密钥,但与上面的匿名账户不同
payload
可以是任何内容(会话令牌或包含多个项的字符串化JSON。可以包含诸如publicUserId、时间戳、customSignedData和ECDSA签名等项)。
Session 对象
Session 对象在调用 initializeQrSession 成功时返回,用于向最终用户展示情况并获取其确认以完成认证。以下是可触发的一些关键属性和方法。如果您正在使用内置视图,则只需调用上述 confirm/deny 方法
-
IPAddressMobile/Widget - 移动设备和网页浏览器的 IP 地址
-
WidgetUserAgent - 浏览器用户代理(例如,macOS 上的 Chrome)
-
RiskAnalytics - 如果您的订阅计划支持
-
RiskStatus - 清除、警告或拒绝
-
RiskFlagString - 如果 RiskStatus 为警告或拒绝,此字符串将通知用户启动风险情况的原因
-
GeoData - 移动设备和组件的位置数据
-
Mobile
-
城市
-
国家代码
-
-
Browser
-
城市
-
国家代码
-
-
-
-
Session.confirm() 和 Session.deny() - 请参阅 与 API 交互 中的说明
许可
此库可在付费和免费许可下使用。请参阅 LICENSE 文件以获取完整的许可文本。
- 有关许可细节(价格等)可在 https://keyri.com/pricing 查找,或您可以通过 [email&protected] 联系我们。
详细信息
许可下允许的内容
- 在 Keyri 开发者计划下免费用于任何应用程序。
- 根据需要在工作应用程序中进行任何修改
许可下不允许的内容
- 在不同许可下重新分发
- 删除归属信息
- 修改徽标
- 赔偿:使用此免费软件“自担风险”,因此您不能因此库引起的问题起诉 Keyri, Inc.
免责声明
我们非常关心产品质量,并严格测试了我们提供的每一项功能。然而,每个集成都是不同的。App Store中的每个应用程序都有不同的构建设置、编译器标志、处理器要求、兼容性问题等变体,我们不可能涵盖所有这些方面,因此我们强烈建议在产品上线前对您的集成进行彻底测试。如果您在GitHub上发现任何似乎不正确或奇怪的问题,请随时提交错误或问题。