yrnsdk 2.20

yrnsdk 2.20

Sam 维护。



yrnsdk 2.20

  • Yoti

Carthage compatible Cocoapods compatible Platform

ios-sdk-button

移动 SDK 的目的是为了使第三方应用能够在利用 Yoti 移动应用的同时,从 Yoti 用户那里请求属性。这是一个第三方应用与 Yoti 应用之间的交互,是通过一个非常轻量级的 SDK 实现的。此仓库包含工具和逐步说明,以便用户以安全、可信赖的方式与您的应用程序共享其身份详情。

要求

  • 您需要在您的手机上安装 Yoti 应用
  • 您需要确保部署目标的最小版本为 9.0 或更高。
  • 您需要 Xcode 10.2 或更高版本

安装 SDK

完成移动 SDK 安装有三个部分

  1. 首先,请按照我们的 Yoti 控制台流程操作。您需要在这里 创建一个组织。在组织创建后,您需要创建一个 Yoti 应用。如果您只是进行测试或个人用途 Yoti,请直接在这里 创建应用

    应用程序流程将为您生成密钥。请妥善保管您的 SDK id 和场景 id,以便进行移动集成。

    更多信息,请参阅我们开发者页面上的说明,具体可在这里找到 这里

  2. 安装 Web SDK。请浏览我们的 GitHub 页面并在您的 Web 后端初始化 Web SDK。

    更多信息,请参阅我们开发者页面上的说明,具体可在这里找到 这里

  3. 安装移动 SDK。可以使用以下三种方法中的一种

    • Carthage - preferred option
    • Cocoapods
    • 拖放

Carthage (推荐)

Carthage 是一个去中心化的依赖管理器,用于构建你的依赖并提供二进制框架。

您可以使用以下命令使用 Homebrew 安装 Carthage

$ brew update
$ brew install carthage

要使用 Carthage 将 Yoti 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它

github "getyoti/ios-sdk-button" ~> 2.4.0

这将允许您在终端中键入 carthage update ios-sdk-button 以获取并构建框架的最新版本。第一次集成 iOS SDK 时,动态框架将在 Carthage/Build/iOS/ 生成。

将构建的 YotiButtonSDK.framework 拖入您的 Xcode 项目而不复制它。不要提交 Carthage 文件夹,但请提交 Carthage.resolved 文件。

每次您想要获取依赖项时,都可以键入 carthage bootstrap

CocoaPods

CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖管理器。

使用默认的 Ruby 安装可能要求您在安装 gem 时使用 sudo。更详细的安装说明可以在 指南中找到

$ sudo gem install cocoapods

要使用 Cocoapods 将 Yoti 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它

pod 'yoti-sdk', '~> 2.4.0'

提示:CocoaPods 提供了一个 pod init 命令来创建具有智能默认值的 Podfile。您应该使用它。

现在您可以安装项目中的依赖项了

$ pod install

确保在构建项目时始终打开 Xcode 工作区而不是项目文件。

拖放(不推荐)

您还可以通过添加子模块并将 Yoti 的项目文件拖入其中将 Yoti SDK 添加到项目中。

配置

在开始配置之前,您必须将 Yoti SDK 添加为构建阶段:转到您的项目,然后转到 构建阶段 选项卡,单击左上角的 +,选择 新建复制文件阶段 并将 目标 更改为 框架

在新阶段上点击+,选择YotiButtonSDK.framework,然后点击add

导航到您想集成Yoti按钮的位置,添加一个按钮并将类更改为YotiButton。

: YotiButton

模块: YotiButtonSDK

添加一个自定义运行时属性:useCaseID,这是一种类型为String的值,它可以帮助您识别按钮。

Yoti Button

SDK提供了一个自定义按钮,您可以在布局中使用,别忘了设置useCaseID,它与Scenario相关联。请参见下面的定义。或者,您也可以在代码中这样定义按钮

Swift

import YotiButtonSDK

let button = YotiButton(frame: CGRect(x: 0, y: 0, width: 230, height: 48))
button.useCaseID = "YOUR_USE_CASE_ID"

如果您使用了Cocoapods,请使用以下命令

import yoti_sdk

let button = YotiButton(frame: CGRect(x: 0, y: 0, width: 230, height: 48))
button.useCaseID = "YOUR_USE_CASE_ID"

Objective-C

#import <YotiButtonSDK/YotiButtonSDK.h>                                                                                                           
YotiButton* button = [[YotiButton alloc] initWithFrame:CGRectMake(0, 0, 230, 48)]
button.useCaseID = "YOUR_USE_CASE_ID"

集成的前端现在已经完成。

创建一个情景

现在您需要准备SDK ID、情景 ID和回调URL,这些都可以从您的应用程序仪表板上获得。

对于您希望处理的每个情景,都需要将其添加到YotiSDK中,如下所示

Swift: 请在AppDelegate.swift中添加以下情景方法

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

如以下所示。

import YotiButtonSDK

    do {
        guard let url = URL(string: "YOUR_CALLBACK_URL") else {
            return false
        }
        //Here we need to add as many scenarios as we want. each scenario is linked to a button in the Main.storyboard.
        let firstScenario = try ScenarioBuilder().setUseCaseID("YOUR_FIRST_USE_CASE_ID")
        .setClientSDKID("YOUR_FIRST_CLIENT_SDK_ID")
        .setScenarioID("YOUR_FIRST_SCENARIO_ID_1")
        .setCallbackBackendURL(url)
        .create()
        YotiSDK.add(scenario: firstScenario)
                 
        let secondScenario = try ScenarioBuilder().setUseCaseID("YOUR_SECOND_USE_CASE_ID")
        .setClientSDKID("YOUR_SECOND_CLIENT_SDK_ID")
        .setScenarioID("YOUR_SECOND_SCENARIO_ID_2")
        .setCallbackBackendURL(url)
        .create()
        YotiSDK.add(scenario: secondScenario)
    } catch {
        // handle error code here
    }
}

Objective-C: 请在appdelegate.m中添加以下情景方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

如以下所示

#import <YotiButtonSDK/YotiButtonSDK.h>

    NSError* error = nil;
    YTBScenarioBuilder *firstScenarioBuilder = [[YTBScenarioBuilder alloc] init];
    firstScenarioBuilder.useCaseID = @"YOUR_FIRST_USE_CASE_ID";
    firstScenarioBuilder.clientSDKID = @"YOUR_FIRST_CLIENT_SDK_ID";
    firstScenarioBuilder.scenarioID = @"YOUR_FIRST_SCENARIO_ID";
    firstScenarioBuilder.callbackBackendURL = [NSURL URLWithString:@"YOUR_CALLBACK_URL"];
    YTBScenario *firstScenario = [firstScenarioBuilder create:&error];
    [YotiSDK addScenario: firstScenario];

    error = nil;
    YTBScenarioBuilder *secondScenarioBuilder = [[YTBScenarioBuilder alloc] init];
    secondScenarioBuilder.useCaseID = @"YOUR_SECOND_USE_CASE_ID";
    secondScenarioBuilder.clientSDKID = @"YOUR_SECOND_CLIENT_SDK_ID";
    secondScenarioBuilder.scenarioID = @"YOUR_SECOND_SCENARIO_ID";
    secondScenarioBuilder.callbackBackendURL = [NSURL URLWithString:@"YOUR_CALLBACK_URL"];
    YTBScenario *secondScenario = [secondScenarioBuilder create:&error];
    [YotiSDK addScenario: secondScenario];

    return YES;

然后在您的viewController类中,在按钮的IBAction函数中调用该函数

public static func startScenario(for useCaseID: String, with delegate: YotiSDKDelegate) throws 

接下来,转到包含YotiButton出口的视图控制器。在其IBAction中,调用swift中的sdk方法签名或objective-c中的签名。

Swift

@IBAction func yotiButtonDidTouchUpInside(_ sender: YotiButton) {
    guard let useCaseID = sender.useCaseID else {
        return
    }
    do {
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
        try YotiSDK.startScenario(for: useCaseID, with: self)
    } catch {
        // Handle error here
    }
}

Objective-C

- (IBAction)buttonDidTouchUpInside:(YotiButton*)sender {
    NSString* useCaseID = sender.useCaseID;
    NSError* error = nil;

    if (![useCaseID isEqual:@""]) {
        [YotiSDK startScenarioForUseCaseID:useCaseID withDelegate:self error:&error];

        if (error != nil) {
            NSLog(@"error : %@", error.description);
        }
    }
}

在Swift中,您的viewController类应遵守YotiSDKDelegate和BackendDelegate才能获取回调。

extension ViewController: YotiSDKDelegate {
    func yotiSDKDidFail(for useCaseID: String, with error: Error) {
    	// handle here the error related to the failing of retrieving a usecaseID and a token
    }

    func yotiSDKDidSucceed(for useCaseID: String, baseURL: URL?, token: String?, url: URL?) {
        // Handle here the success of the opening of Yoti app for example by requesting a profile from the backend like below
        // Get the specific scenario by calling  
        let scenario = YotiSDK.scenario(for: useCaseID)
        // request the backend to get the profile linked to a specific scenario by passing the token returned and self as delegate for a call back
        YotiSDK.callbackBackend(scenario: scenario!, token: token!, with: self)
    }

    func yotiSDKDidOpenYotiApp() {
        // Handle specific behaviour if needed when the Yoti App didOpen
    }
}

在Objective-C中,您的viewController应遵守YTBSDKDelegate和YTBBackendDelegate,如下所示

@interface ViewController () <YTBSDKDelegate, YTBBackendDelegate>

在 Swift 中,BackendDelegate 是其名称,YTBBackendDelegate 命名空间用于 Objective-C。请注意,遵守 YTBBackendDelegate 是可选的,因为您可能不依赖于后端来实现自己的场景。我们当前的实施依赖于后端来实现我们的场景。

我们以这种方式实现了我们的 ViewController 遵守的协议的代理函数

- (void)yotiSDKDidFailFor:(NSString * _Nonnull)useCaseID with:(NSError * _Nonnull)error {
    // handle failure here
}

- (void)yotiSDKDidSucceedFor:(NSString * _Nonnull)useCaseID baseURL:(NSURL * _Nullable)baseURL token:(NSString * _Nullable)token url:(NSURL * _Nullable)url {
	YTBScenario *scenario = [YotiSDK scenarioforUseCaseID:useCaseID];
	[YotiSDK callbackBackendScenario:scenario token:token withDelegate:self];
}

- (void)yotiSDKDidOpenYotiApp {
	// behaviour when SDK opens yoti app (if needed)
}

当回调从后端返回时,我们获取与配置文件相关的数据或错误

Swift

func backendDidFinish(with data: Data?, error: Error?)

Objective-C

- (void)backendDidFinishWith:(NSData * _Nullable)data error:(NSError * _Nullable)error

通知

如果您在我们执行网络请求之前需要更改您的界面,您可以订阅来自 YotiSDK 类的 willMakeNetworkRequestdidFinishNetworkRequest 通知

Swift

NotificationCenter.default.addObserver(forName: YotiSDK.willMakeNetworkRequest, object: nil, queue: nil) { (notification) in
    // Disable interface
}
NotificationCenter.default.addObserver(forName: YotiSDK.didFinishNetworkRequest, object: nil, queue: nil) { (notification) in
    // Re-enable interface
}

Objective-C

[NSNotificationCenter.defaultCenter addObserverForName:YotiSDK.willMakeNetworkRequest object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    // Disable interface
}];
[NSNotificationCenter.defaultCenter addObserverForName:YotiSDK.didFinishNetworkRequest object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    // Re-enable interface
}];

应用间通信

Yoti SDK 将执行应用切换到 Yoti 应用并返回到您的应用以完成共享过程,您的应用的 .plist 也需要处理这一点。

添加您的 URL Scheme

<key>CFBundleURLTypes</key>
<array>
  <dict>
  <key>CFBundleURLSchemes</key>
  <array>
    <string>YOUR_URL_SCHEME</string>
  </array>
  </dict>
</array>

将 Yoti 添加为查询方案

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>yoti</string>
</array>

将应用程序生命周期通知给 Yoti SDK

Swift

import YotiButtonSDK

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        return YotiSDK.application(app, open:url, options:options)
    }
}

Objective-C

#import <YotiButtonSDK/YotiButtonSDK.h>

@implementation AppDelegate
  - (BOOL)application:(UIApplication *)app
              openURL:(NSURL *)url
              options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
      return [YotiSDK application:app open:url options:options];
  }
@end

处理用户

Web SDK 将处理用户存储。当您检索用户配置文件时,您将收到一个由 Yoti 为您的应用程序独家生成的用户 ID。这意味着如果同一人登录另一个应用程序,Yoti 将为其分配不同的 ID。您可以使用此 ID 验证是否(对于您的应用程序)检索到的配置文件标识了新用户或现有用户。有关更多信息,请参阅相关的 GitHub 页面。

支持

如有任何问题或需要支持,请发送邮件至 [email protected]。为了尽快为您解决问题,请提供以下信息:

  • 手机上的软件版本
  • Web SDK 语言
  • 错误截图

我们回答您的疑问后可能会再次联系您,讨论 Yoti 的产品和服务。如果您不希望我们这样做,请在电子邮件中告知。