ios-sdk-button
移动 SDK 的目的是为了使第三方应用能够在利用 Yoti 移动应用的同时,从 Yoti 用户那里请求属性。这是一个第三方应用与 Yoti 应用之间的交互,是通过一个非常轻量级的 SDK 实现的。此仓库包含工具和逐步说明,以便用户以安全、可信赖的方式与您的应用程序共享其身份详情。
要求
- 您需要在您的手机上安装 Yoti 应用
- 您需要确保部署目标的最小版本为 9.0 或更高。
- 您需要 Xcode 10.2 或更高版本
安装 SDK
完成移动 SDK 安装有三个部分
-
首先,请按照我们的 Yoti 控制台流程操作。您需要在这里 创建一个组织。在组织创建后,您需要创建一个 Yoti 应用。如果您只是进行测试或个人用途 Yoti,请直接在这里 创建应用。
应用程序流程将为您生成密钥。请妥善保管您的 SDK id 和场景 id,以便进行移动集成。
更多信息,请参阅我们开发者页面上的说明,具体可在这里找到 这里。
-
安装 Web SDK。请浏览我们的 GitHub 页面并在您的 Web 后端初始化 Web SDK。
更多信息,请参阅我们开发者页面上的说明,具体可在这里找到 这里。
-
安装移动 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
类的 willMakeNetworkRequest
和 didFinishNetworkRequest
通知
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 的产品和服务。如果您不希望我们这样做,请在电子邮件中告知。