SchibstedAccount 2.11.0

SchibstedAccount 2.11.0

由以下人员维护:Samuel GullikssonGabriel Minarik



  • Schibsted

SchibstedAccount iOS SDK

SchibstedAccount iOS SDK 通过 SPiD API 提供对 Schibsted 身份服务的访问。它提供了以下功能

  • 用户管理(资料、登录、注册)
  • 基于 UI 的登录
  • 认证请求和 oauth 管理

注意:SDK 提供的 API 并不完全覆盖 SPiD 提供的 API。如果缺少某个功能,请查看 SPiD API 参考文档 并提交一个增强请求 Issue。

Build Status license codecov

  • 文档:这是到 最新标记的版本 的文档(可能与 master 中的版本不同)。
  • 贡献:如果您想贡献力量,请查看详情

设置

CocoaPods

该 Pod 作为名为 SchibstedAccount 的公共 CocoaPod 提供使用

SDK 被分为不同的 subspec

  • pod 'SchibstedAccount':这是默认设置,包含创建 User 的 API
  • pod '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 提供以下本地化支持:

  1. 🇳🇴挪威语 Bokmål
  2. 🇸🇪瑞典语
  3. 🇫🇮芬兰语

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