SpotImNoAds 1.0.16

SpotImNoAds 1.0.16

由以下人员维护: Rotem Itzhak, Yohay Barsky, Oded Regev, Alon Shprung, Yohay, Nimrod Vardi.



 
依赖关系
Alamofire~> 5.2
PromiseKit~> 6.8
 


  • 作者
  • Itay Dressler

Spot.IM SDK for iOS🚀

此库提供了一个简单的方法,将 Spot.IM 集成到原生 iOS 应用程序中。

要求

  • iOS 10.3 或更高版本。
  • 拥有 Spot.IM 账户

入门

将 SDK 添加到您的项目中

CocoaPods

  1. 如以下设置依赖项:pod 'SpotImNoAds', '1.0.16'
  2. 在终端中执行 pod install
  3. 打开工作区文件并运行

初始化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

  1. 将PCVC作为其他VC的子项添加
  2. 将PCVC视图添加到其他VC或容器视图的视图中
  3. 布局PCVC视图
  4. 调用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
  1. 使用您的后端进行用户认证
  2. 调用startSSO函数并获取codeA
  3. codeA和所有需要的信息发送到您的后端系统以获取codeB
  4. 使用codeB调用completeSSO
  5. 检查回调中的successerror属性以确认一切正常
示例
// 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
  1. 使用您的后端进行用户认证
  2. 调用带有用户JWT密钥的sso(withJWTSecret函数
  3. 如果回调中没有错误且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搜索索引存在一些已知的错误。请按照常规安装继续操作。