SchibstedAccount iOS SDK
SchibstedAccount iOS SDK 通过 SPiD API 提供对 Schibsted 身份服务的访问。它提供了以下功能
- 用户管理(资料、登录、注册)
- 基于 UI 的登录
- 认证请求和 oauth 管理
注意:SDK 提供的 API 并不完全覆盖 SPiD 提供的 API。如果缺少某个功能,请查看 SPiD API 参考文档 并提交一个增强请求 Issue。
设置
CocoaPods
该 Pod 作为名为 SchibstedAccount 的公共 CocoaPod 提供使用
SDK 被分为不同的 subspec
pod 'SchibstedAccount'
:这是默认设置,包含创建User
的 APIpod 'SchibstedAccount/Manager'
:默认安装整个 SDK。如果您只想使用无界面登录(即不包含 UI 库),则只需使用此设置。
您还可能想包含一个跟踪子规范
UI 进行一些内部跟踪,并允许在 UI 的配置中设置 TrackingEventsHandler
。要满足此要求,您可以自己实现,或使用已经实现的版本。
内部:身份 SDK 有一个内部的 Schibsted 跟踪实现,可在以下位置找到:此处,并通过 source "[email protected]:CocoaPods/Specs.git
可用,因此,在您的 pod 文件中,您可以
pod 'SchibstedIDTracking'
:添加对新脉冲 SDK 的依赖
Carthage
将其添加到您的 Cartfile
git "[email protected]:schibsted/account-sdk-ios.git"
然后运行
$ carthage bootstrap --platform ios
或者
$ carthage update --platform ios
内部:如果您还希望在新的脉冲 SDK 中包含对跟踪事件的支持(见此处),请添加以下内容
git "[email protected]:spt-identity/identity-sdk-ios-tracking"
Carthage 会构建您项目链接所需的所有框架,因此请确保您遵循这些步骤以将其全部包含在项目中,并且您应该能够运行起来。如果缺少某些内容 -> 给我们发邮件。
获取一些客户端凭证
SDK 通过为您提供 Schibsted 用户访问权限来实现。允许的访问类型由一组客户端凭证决定。您必须首先获取一些凭证,这可以通过 自助服务 完成。了解环境和商家。
注意:SDK 不能跨环境和商家工作。
使用方式
最常见的情况是获取一个《User》对象。您可以通过视觉或无头登录流程来获取用户对象。推荐使用视觉登录方式,但如果需要,也有记录无头登录的方法,但并不“官方”支持。
设置客户端配置
请参阅上述内容以获取凭据。但获取凭据后,您必须设置一个《ClientConfiguration》对象
extension SchibstedAccount.ClientConfiguration {
static let `default` = ClientConfiguration(
environment: .preproduction,
clientID: "<your-client-code>",
clientSecret: "<your-client-secret>",
appURLScheme: nil
)
}
所有这些字段都必须从自助门户中获取。如果您将《appURLScheme》设置为nil,则SDK会假定默认模式,即《spid-您的客户端代码》。请务必核对这是否与自助服务中的“重定向URI”标签中列出的默认方案相同。
检查是否已有用户
获取最后通过SDK登录的用户
let user = User.loadLast(clientConfiguration: .default);
user.delegate = //...
switch user.state {
case .loggedIn:
// Yay, carry on with app
case .loggedOut:
// Ok, fire up the IdentityUI
}
即使没有将用户持久化到密钥链中,此函数也将返回一个初始化的用户对象。检查用户的《state》可以告诉您密钥链数据是否“看起来”有效。
注意:即使数据在密钥链中,也可能已过期,在此情况下,如果使用提供的扩展在《URLSession》上进行请求,SDK会自动尝试为您刷新。
使用IdentityUI进行视觉登录
要开始登录过程,您可以启动一个带有《IdentityUIConfiguration》(《IdentityUIConfiguration》与《ClientConfiguration》不同)的《IdentityUI》对象,如果一切顺利,它将为您创建一个《User》对象。推荐使用IdentityUI创建用户对象,因为它确保遵循Schibsted身份后端支持的正确登录流程(例如,必填字段已填写,并接受条款和条件等)。
使用IdentityUI登录
import UIKit
import SchibstedAccount
extension IdentityUIConfiguration {
// See docs for more options
static let `default` = IdentityUIConfiguration(
clientConfiguration: .default,
isCancelable: true,
isSkippable: true
)
}
class ViewController: UIViewController {
var identityUI: IdentityUI?
var user: User?
@IBAction func didTapLoginButton(_ sender: UIButton) {
let identifierType: IdentifierType = (sender.tag == 0) ? .phone : .email
self.identityUI = IdentityUI(configuration: .default, identifierType: identifierType)
self.identityUI?.delegate = //...
self.identityUI?.presentIdentityProcess(from: self)
}
@IBAction func didTapLogoutButton(_: Any) {
self.user?.logout()
print("User logout done!")
}
}
要处理登录/注册/错误或其他受支持的事件,您可以为《IDentityUIDelegate》设置。
IdentityUIDelegate 和 UserDelegate
extension ViewController: IdentityUIDelegate {
func didFinish(result: IdentityUIResult) {
switch result {
case .canceled:
print("The user canceled the login process")
case let .completed(user):
self.user = user
self.user.delegate = //...
print("User with id \(String(describing: user.id)) is logged in")
// ... see docs for more cases
}
}
}
extension ViewController: UserDelegate {
func user(_: User, didChangeStateTo newState: UserState) {
switch newState {
case .loggedIn:
print("The user logged in")
case .loggedOut:
print("The user logged out")
}
}
}
UI 自定义
SDK 包含了一个 IdentityUITheme
对象,允许您自定义身份 UI 的外观和感觉。详情请查看文档。
本地化
SDK 提供以下本地化支持:
🇳🇴 挪威语 Bokmål🇸🇪 瑞典语🇫🇮 芬兰语
Touch ID
从 SDK 的 2.1.0 版本开始,在首次成功密码认证后,用户可以将他们的 Touch ID 注册用于后续的操作,而不是输入密码。强烈建议允许用户随时启用/禁用通过 Touch ID 进行认证,为此需要在您的应用设置中添加一个 UI 组件(通常是 UISwitch
),并调用 IdentityUIConfiguration.useBiometrics
。
使用 IdentityManager 进行无头登录
注意:建议使用 UI 方法。
IdentityManager
更简单,不保证任何 Schibsted 身份流程。它可以创建用户对象,并通知您用户对象发生的任何变化。您可以为它分配一个 IdentityManagerDelegate
来处理发生的各种事件。
import SchibstedAccount
class ViewController: UIViewController, IdentityManagerDelegate {
let identityManagaer = SchibstedAccount.IdentityManager(clientConfiguration: clientConfiguration)
override func viewDidLoad() {
super.viewDidLoad()
self.identityManager.delegate = self
if self.identityManager.currentUser.state == .loggedIn {
// User is already logged in
return
}
// User not logged in
self.login()
}
func userStateChanged(_ state: UserState) {
// User has just logged in or just logged out
if state == .LoggedIn {
print("User with id \(String(describing: self.identityManager.currentUser.id)) is logged in")
}
}
func login() {
self.identityManager.sendCode(to: PhoneNumber(...) ...) { result in
if case .failure(let error) = result {
print("failed to send code", error)
}
}
}
@IBAction func validateCode(_ sender: UIButton) {
let code = self.codeTextField.text
identityManager.validate(oneTimeCode: code, for: PhoneNumber(...) ...) {
}
}
}
构建、测试、文档
参见 contributing.md。