🚀
Spot.IM SDK for iOS此库提供了一个简单的方法,将 Spot.IM 集成到原生 iOS 应用程序中。
要求
- iOS 10.3 或更高版本。
- 拥有 Spot.IM 账户
入门
将 SDK 添加到您的项目中
CocoaPods
- 如以下设置依赖项:
pod 'SpotImNoAds', '1.0.16'
- 在终端中执行
pod install
- 打开工作区文件并运行
初始化SDK
将SpotIm初始化代码添加到您的AppDelegate中。首先从AppDelegate导入我们的SDK import SpotImNoAds
要使用SDK,您需要在初始化SDK时设置唯一的Spot ID。在application(application:didFinishLaunchingWithOptions)
调用中调以下方法
示例
SpotIm.initialize(spotId: YOUR_UNIQUE_SPOT_ID)
流程
我们的SDK公开了一个主要的流程用于设置。会话前视图是一个显示会话中2-16条评论的预览视图,一个创建新评论的文本框和一个查看所有评论的按钮。
会话前视图应该在文章视图控制器中的文章下方显示。
当用户想要查看更多评论时,我们推送一个新的ViewController,该ViewController显示会话中的所有评论。
当点击文本框以创建新评论时,我们将用户带到创建屏幕。用户需要登录才能发表新评论,这是托管应用需要集成其认证系统的地方。
使用
支持深色模式主题
SpotIm屏幕支持深色模式主题,默认背景颜色为灰色。要将背景颜色设置为与父应用匹配,您可以使用以下API
SpotIm.darkModeBackgroundColor = UIColor.PARENT_APP_DARK_THEME_BACKGROUND_COLOR
默认情况下,SpotIm SDK将系统主题设置到SDK中。如果您的应用支持手动覆盖系统设置,您可以使用以下overrideUserInterfaceStyle API手动将其设置到SDK中。
SpotIm.overrideUserInterfaceStyle = SPUserInterfaceStyle.dark
获取会话计数器
获取会话的评论和回复数量
示例
SpotIm.getConversationCounters(conversationIds: [CONVERSATION_ID]) { result in
switch result {
case .success(let counters):
let counter = counter["SPECIFIC_CONVERSATION_ID"]
print(counter.comments)
print(counter.replies)
case .failure(let error):
print(error)
@unknown default:
print("Got unknown response")
}
}
获取SpotImSDKFlowCoordinator
最终用户应首先与预会话视图控制器(PCVC)进行交互。要获取其实例,您需要一个SpotImSDKFlowCoordinator
实例。
SpotIm.createSpotImFlowCoordinator(loginDelegate: self) { result in
switch result {
case .success(let coordinator):
self.spotIMCoordinator = coordinator
case .failure(let error):
print(error)
@unknown default:
print("Got unknown response")
}
}
请确保有强引用,否则将被释放。
获取PreConversationViewController
然后您可以针对特定的帖子(文章)ID实例化PCVC。PCVC将被传递到完成块。
spotIMCoordinator?.preConversationController(
withPostId: "POST ID",
articleMetadata: SpotImArticleMetadata(url: URL_TO_THE_ARTICLE_PAGE_ON_THE_WEB, title: ARTICLE_TITLE, subtitle: ARTICLE_SUBTITLE, thumbnailUrl: URL_TO_ARTICLE_THUMBNAIL_IMAGE),
numberOfPreLoadedMessages: 2, // This is optional, Default = 2, Maximum = 15
navigationController: navigationController,
completion: { [weak self] preConversationVC in
// add preConversationVC to your view controller
}
)
PCVC的视图应该添加到其他视图控制器视图的子视图中。
⚠️ 重要
请确保使用与您的网络应用中相同的帖子ID,以便SDK能够显示与网络应用相同的评论。
添加PreConversationViewController
- 将PCVC作为其他VC的子项添加
- 将PCVC视图添加到其他VC或容器视图的视图中
- 布局PCVC视图
- 调用PCVC实例的
open func didMove(toParent parent: UIViewController?)
方法
示例
preConversationVC.view.translatesAutoresizingMaskIntoConstraints = false
self.addChild(preConversationVC)
self.containerView.addSubview(preConversationVC.view)
preConversationVC.view.topAnchor.constraint(equalTo: self.containerView.topAnchor).isActive = true
preConversationVC.view.leadingAnchor.constraint(equalTo: self.containerView.leadingAnchor).isActive = true
preConversationVC.view.bottomAnchor.constraint(equalTo: self.containerView.bottomAnchor).isActive = true
preConversationVC.view.trailingAnchor.constraint(equalTo: self.containerView.trailingAnchor).isActive = true
preConversationVC.didMove(toParent: self)
监听PreConversationView大小变化
确保容器视图可以在PreConversationViewController填充评论时进行缩放。要了解视图何时进行缩放,您可以实现SpotImLayoutDelegate
协议并通过viewHeightDidChange(to newValue: CGFloat)
方法获取回调。要获取回调,请确保在尝试加载视图之前将您的布局代理设置到SpotImSDKFlowCoordinator中。
spotIMCoordinator.setLayoutDelegate(delegate: YOUR_DELEGATE_IMPLEMENTATION)
认证
为了利用SSO认证,提供一个实现来展示登录UI并进行SSO认证的代码。
extension ArticleViewController: SpotImLoginDelegate {
func startLoginFlow() {
// Show your login flow here, dismiss the UI once the flow is done and SSO is completed
}
}
使用SSO进行认证
有两种类型的SSO可用:通用SSO和带有JWT secret的SSO。请联系您的Spot.IM顾问以选择最适合您的选项。
通用SSO
- 使用您的后端进行用户认证
- 调用
startSSO
函数并获取codeA
- 将
codeA
和所有需要的信息发送到您的后端系统以获取codeB
- 使用
codeB
调用completeSSO
- 检查回调中的
success
和error
属性以确认一切正常
示例
// 1
func login(username: String, password: String) {
MyAuthenticationProvider.login(
with: username,
password: password) { success, error in
if let error = error {
handleLoginError()
} else {
self.authenticateWithSpotIm()
}
}
}
func authenticateWithSpotIm() {
// 2
SpotIm.startSSO { [weak self] response, error in
if let error = error {
print(error)
} else {
self?.getCodeB(codeA: response?.codeA)
}
}
}
private func getCodeB(codeA: String?, jwtToken: String?) {
// 3
MyAuthenticationProvider.getCodeB(
with: codeA,
// Some identification that this user is authenticated to your backend system
accessTokenNetwork: myUserToken) { [weak self] codeB, error in
if let error = error {
print(error)
} else {
self.completeSSOWithSpotIm(genericToken: genericToken)
}
}
}
private func completeSSOWithSpotIm(codeB: String?, jwtToken: String?) {
// 4
SpotIm.completeSSO(with: codeB) { [weak self] success, error in
// 5
if let error = error {
print(error)
} else if success {
print(“Authenticated successfully!”)
}
}
}
使用JWT密钥的SSO
- 使用您的后端进行用户认证
- 调用带有用户JWT密钥的
sso(withJWTSecret
函数 - 如果回调中没有错误且
response?.success
为true,则认证过程成功地完成
示例
func authenticate(withJWTSecret: secret) {
SpotIm.sso(withJwtSecret: secret, completion: { (response, error) in
if let error = error {
print(error)
} else if let success = response?.success, success {
print(“Authenticated successfully!”)
}
})
}
注销
当用户从您的系统中注销时,调用SpotIm注销API
示例
func logout(withJWTSecret: secret) {
SpotIm.logout(completion: { result in
switch result {
case .success():
print("Logout from SpotIm was successful")
case .failure(let error):
print(error)
@unknown default:
print("Got unknown response")
}
})
}
登录状态
这是一个API,用于了解当前SpotIm用户的状况。访客 - 意味着这是一个未注册的访客用户。如果您自己的登录状态是“用户已登录”,则应调用startSSO/sooWithJWT。已登录 - 意味着这是一个注册的SpotIm用户。在这种情况下,您应避免调用startSSO/sooWithJWT。如果有您自己的状态是“用户已注销”,您应调用SpotIm注销方法
示例
func authenticate(withJWTSecret: secret) {
SpotIm.getUserLoginStatus(completion: { result in
switch result {
case .success(let loginStatus):
print("User is \(loginStatus)")
case .failure(let error):
print(error)
@unknown default:
print("Got unknown response")
}
})
}
故障排除
Cocoapods 安装失败报错
[!] Unable to find a specification for `SpotIMCore...
解决方案
在终端运行 pod repo update
,在安装前刷新您的本地spec仓库。
Pod搜索失败报错
[!] Unable to find a pod with name, author, summary, or description matching `SpotIMCore`
解决方法
CocoaPods搜索索引存在一些已知的错误。请按照常规安装继续操作。