Twilio Verify iOS
目录
- 关于
- 依赖项
- 要求
- 文档
- 安装
- 使用
- 运行示例应用
- 运行示例后端
- 使用示例应用
- 日志记录
- 错误
- 更新factor的推送令牌
- 删除一个factor
- 清除本地存储
- 重新安装并持久化factors
- 通知扩展
- 贡献
- 许可证
关于
Twilio Verify推送SDK通过将低摩擦、安全、成本效益的“推送验证”因素添加到您自己的移动应用程序中,帮助您通过验证用户。这项全托管API服务允许您通过安全渠道无缝地在应用程序内验证用户,无需承担一次性密码(OTPs)的风险、繁琐或成本。此项目提供了一个SDK,以在iOS应用程序中实现Twilio Verify推送。
依赖项
无
需求
- iOS 10+
- Swift 5.2
- Xcode 13.x
文档
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问他们的网站。要使用 CocoaPods 将 TwilioVerify 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它。
pod 'TwilioVerify', '~> 2.2.2'
Carthage
Carthage 是一个去中心化的依赖管理器,它会为您构建依赖并提供二进制框架。要使用 Carthage 将 TwilioVerify 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它。
github "twilio/twilio-verify-ios" -> 2.2.2
自 TwilioVerifySDK
的 2.2.2
版本以来,预构建的 fat 版本 .framework
已被弃用,以腾出空间用于通用框架 .xcframework
。请确保使用 newly released Carthage 的新版本 0.38.0,以支持 xcframework
资产。通过使用此版本或更高版本,Carthage 将下载并解压缩视频版中附带的 TwilioVerifySDK.framework.zip
,生成一个可找到在 Carthage 构建文件夹中的 TwilioVerifySDK.xcframework
。
Swift 包管理器
Swift 包管理器 是一种用于自动分发 Swift 代码的工具,并集成于 swift
编译器中。它目前处于早期开发阶段,但 TwilioVerify 支持在 iOS 上使用。
一旦您设置了 Swift 包,添加 TwilioVerify 作为依赖项就像将它添加到您的 Package.swift
文件中的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/twilio/twilio-verify-ios.git", .upToNextMajor(from: "2.2.2"))
]
将您的应用程序注册到 APNs
如果您希望接收推送通知作为挑战,则应将您的应用程序注册到 APNs。更多信息请点击此处
用法
注意
应从 Swift 类中使用 SDK。请参阅 TwilioVerifyAdapter 类 中的示例
从版本 2.2.2
开始,目标已从 TwilioVerify
更改为 TwilioVerifySDK
。迁移到旧版本意味着要更新文件中的所有导入,请参照 TwilioVerifyAdapter 类 中的示例
有关在基本 Verify Push 实现中使用此 SDK 的逐步指南,请参阅 Verify Push 快速入门
运行示例应用程序
运行示例应用
- 克隆仓库
- 更改Bundle标识符以使其独一无二,以便苹果推送通知服务器可以定向推送此应用
- 启用推送通知
- 从您的后端获取访问令牌生成URL(见运行示例后端)。您将使用它生成因子
- 使用
release
作为构建配置运行项目
静默批准挑战
当您的应用已知道用户正在尝试在注册设备相同的设备上完成操作(如积极登录、进行交易等)时,您可以静默批准挑战。
您可以为因子启用“静默批准挑战”选项。启用后,当该因子在应用前景中接收推送通知时,接收到的每个挑战将自动批准,因此无需用户交互。此选项将保存会话,因此选择将不会持久保存。
运行示例后端
- 为示例应用配置一个推送凭据,使用相同的APNs配置
- 使用示例应用的推送凭据配置一个Verify服务
- 转到:https://www.twilio.com/code-exchange/verify-push-backend
- 使用
Quick Deploy to Twilio
选项- 您需要登录到您的Twilio帐户
- 输入您在上面创建的Verify Service Sid,您可以在这里找到它
- 部署应用程序
- 按
转到应用程序
- 您将看到起始页面。复制url,将
index.html
替换为access-token
。(例如,https://verify-push-backend-xxxxx.twil.io/access-token)。这将 IhreAccess Token生成URL
使用示例应用程序
添加一个因素
- 在因素列表中按创建因素(右上角点击+号)
- 输入要使用的身份。此值应为一个UUID,用于标识用户以防止使用PII信息
- 输入访问令牌URL(访问令牌生成URL,包括路径,例如https://verify-push-backend-xxxxx.twil.io/access-token)
- 按创建因素
- 复制因素Sid
发送挑战
- 转到创建推送挑战页面(你的示例后端的/challenge路径)
- 输入你在因素创建中使用的
identity
- 输入你添加的
Factor Sid
- 输入一条
消息
。您将在推送通知和挑战视图中看到该消息 - 输入挑战的详细信息。您将在挑战视图中看到它们。您可以使用
添加更多详细信息
按钮添加更多详细信息 - 按
创建挑战
按钮 - 您将在您的设备上收到显示挑战消息的推送通知。
- 应用程序将在因素信息下方显示挑战信息,在
Challenge
部分 - 批准或拒绝挑战
- 挑战更新后,您将在后端的
创建推送挑战
视图中看到挑战状态
记录日志
默认情况下,日志记录是禁用的。要启用它,您可以通过实现LoggerService 和调用addLoggingService
(注意您可以根据需要添加任意数量的日志服务)或通过调用enableDefaultLoggingService
启用默认日志记录服务。您的多个实现和默认实现可以同时工作,但您可能只想在开发过程中启用它,在发布应用程序时开启它是有风险的。
设置日志级别
您可能只想记录SDK中发生的某些进程,或者您只想记录所有内容,为此,SDK允许您设置日志级别。
- 错误:报告不应该发生的行为。
- 信息:警告特定操作的具体信息。
- 调试:详细信息。
- 网络:网络工作特定的数据,例如请求数据、响应头、响应代码和响应体。
- 全部:错误、信息、调试和网络都被启用。
使用方法
要开始记录日志,启用默认的日志服务或/和传入您自己的自定义实现。
var builder = TwilioVerifyBuilder()
#if DEBUG
builder = builder.enableDefaultLoggingService(withLevel: .all)
.addLoggingService(MyOwnLoggerService1())
.addLoggingService(MyOwnLoggerService2())
#endif
twilioVerify = try builder.build()
错误
类型 | 代码 | 描述 |
---|---|---|
网络 | 60401 | 调用API时发生异常 |
映射 | 60402 | 映射实体时发生异常 |
存储 | 60403 | 存储/加载实体时发生异常 |
输入 | 60404 | 加载输入时发生异常 |
密钥存储 | 60405 | 存储/加载密钥对时发生异常 |
初始化 | 60406 | 初始化对象时发生异常 |
身份验证令牌 | 60407 | 生成令牌时发生异常 |
获取验证API错误
您可以通过以下示例控制列出的验证API错误代码:
twilioVerify.createFactor(withPayload: payload, success: { factor in
// Success
}) { error in
let apiError = error.originalError as? NetworkError
if case let .failureStatusCode(response) = apiError {
// Gets Verify API error response
var errorResponse = response
if let code = errorResponse.apiError?.code,
let message = errorResponse.apiError?.message {
print("Code: \(code) - \(message)")
}
}
}
请查看示例:这里
获取错误原因
您可以通过访问相关的错误来获取错误原因。
twilioVerify.updateChallenge(withPayload: payload, success: {
// Success
},failure: { error in
if case .inputError(let detail) = error, let inputError = detail as? InputError {
switch inputError {
// Handle other cases here, in this example expired challenge case
case .expiredChallenge: return
default: return
}
}
})
您可以在此处找到验证的错误。
若需更多详细信息,请查看特定的内部操作错误此处
更新因素的推送令牌
如果令牌已更改,可以调用TwilioVerify.updateFactor
方法来更新因素的推送令牌
let updateFactorPayload = UpdatePushFactorPayload(sid: factorSid, pushToken: newPushToken)
twilioVerify.updateFactor(withPayload: payload, success: { factor in
// Success
}) { error in
// Error
}
在示例应用中查看FactorListPresenter。您应该更新所有因素的推送令牌。
删除一个因素
可以调用TwilioVerify.deleteFactor
方法来删除一个因素
twilioVerify.deleteFactor(withSid: factorSid, success: {
// Success
}) { error in
// Error
}
清除本地存储
通过调用TwilioVerify.clearLocalStorage
方法可以清除本地存储
do {
try twilioVerify.clearLocalStorage()
} catch {
// Handle error
}
重要备注
- 调用此方法不会删除Verify Push API中的因素,因此您需要从您的后端删除它们,以防止在获取身份因素时出现无效/已删除的因素。
- 由于使用了Keychain进行存储,如果在执行Keychain操作时出错,则此方法可能会失败。
重新安装并保留因素
默认情况下,出于安全原因,创建的因素和密钥对在应用程序卸载和重新安装后不会在设备上持久保存。但是,可以更改此默认行为,并在重新安装后保留因素和密钥对,因为它们都保存在密钥链中。
注意 这可能在未来的iOS版本中发生变化,但将保持与iOS 15及以下版本的兼容。在应用卸载时保留密钥链项目可能存在安全风险。您不应依赖于这种行为,如果该行为发生变化,请提供一种替代方法以再次注册因素。
要重新安装后持久化因素,请在创建TwilioVerify
实例时使用TwilioVerifyBuilder.setClearStorageOnReinstall
方法。默认值为true
,因此在重新安装时将删除因素。将其更改为false
以持久化因素。
let builder = TwilioVerifyBuilder().setClearStorageOnReinstall(false)
let twilioVerify = try builder.build()
重新安装后,推送令牌将发生变化。更新推送令牌以接收挑战的推送通知,详情请见更新因素推送令牌
SDK正在使用kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly来保存因素和密钥对。根据苹果公司的说明
具有此属性的项不会迁移到新设备。因此,从不同设备备份中恢复后,这些项将不会出现。
设置通知扩展
通知扩展是一种应用扩展,允许开发者在通知传递给用户之前修改或处理其内容。
请遵循苹果公司的《在新的交付通知中修改内容》指南创建通知扩展。
要能够在通知扩展中使用Verify SDK,必须使用App Groups,这将允许应用扩展从应用程序读取KeyChain存储。否则,SDK将无法从通知扩展中读取存储的任何因素或挑战。
let builder = TwilioVerifyBuilder()
let twilioVerify = try builder.setAccessGroup("group.com.example.AppSuite").build()
使用
setAccessGroup
方法设置用于密钥链访问的应用分组。
请注意,通知扩展的存活时间约为30秒,因此如果应用扩展未能在此期间进行处理,它将显示原始内容。
请查阅通知扩展分支,以查看VerifyDemoApp中使用通知扩展及SDK的示例实现。
使用App Groups共享因素
在首次设置setAccessGroup
配置时,因素数据将迁移到使用密钥链的kSecAttrAccessGroup
属性。如果迁移失败,则错误日志将在初始化时发送,而不会抛出错误,数据将仍然可用于主应用程序,但可能无法用于App扩展。
停止通过App Groups共享因素
通过从setAccessGroup
配置中移除App Group
,新因素将通过Keychain
应用组停止共享。
let builder = TwilioVerifyBuilder()
let twilioVerify = try builder.build()
要停止使用App Groups
共享现有因素,请取消选中Xcode中的App/App Extension
配置中的App Group
,操作如下
应用/应用扩展 -> 应用组 -> 取消勾选 应用组
这将会限制对因素的访问,将不会影响最初创建数据的主应用程序。
贡献
该项目欢迎贡献。请查阅我们的贡献指南以了解如何开始。