Contentstack

Contentstack Swift SDK

ContentstackUtils CI

Contentstack 是一个采用 API 优先方法的无头 CMS。开发者可以使用它来构建强大的跨平台应用程序,并使用他们喜欢的语言。构建你的应用程序前端,剩下的交给 Contentstack 处理。 阅读更多

Contentstack 提供 iOS SDK,用于在 iOS 平台上构建应用程序。以下是详细指南和有用的资源,可帮助你开始使用我们的 iOS SDK。

前提条件

最新的 Xcode 和 Mac OS X

设置和安装

要在 iOS 平台上使用此 SDK,你必须按照以下步骤安装 SDK。

CocoaPods

将以下内容添加到你的 Podfile 中

use_frameworks!
pod 'ContentstackUtils', '~> 1.3.1'

Swift Package Manager

  1. 在你的计算机上安装 libxml2

    // macOS: For xcode 11.3 and earlier, the following settings are required.
    $ brew install libxml2
    $ brew link --force libxml2
    
    // Linux(Ubuntu):
    $ sudo apt-get install libxml2-dev
  2. 将以下内容添加到你的 Package.swift

    // swift-tools-version:5.0
    import PackageDescription
    
    let package = Package(
        name: "YourProject",
        dependencies: [
            .package(url: "https://github.com/tid-kijyun/ContentstackUtils.git", from: "1.3.1"),
        ],
        targets: [
            .target(
                name: "YourTarget",
                dependencies: ["ContentstackUtils"]),
        ]
    )
    $ swift build

注意:当发生构建错误时,请尝试运行以下命令

// Linux(Ubuntu)
$ sudo apt-get install pkg-config

手动安装

  1. 将 Contentstack Utils 文件添加到你的项目: ContentstackUtils
  2. 将 Kanna 文件添加到你的项目
    Kanna
    模块
  3. 在目标设置中,将 $(SDKROOT)/usr/include/libxml2 添加到 Search Paths > Header Search Paths 字段
  4. 在目标设置中,将 $(SRCROOT)/Modules 添加到 Swift Compiler - Search Paths > Import Paths 字段

注意:如果你在项目中使用 Contentstack Swift SDK,则已导入 ContentstackUtils 文件。

用法

让我们学习如何使用 Utils SDK 来渲染嵌入式项目。

创建渲染选项

要在前端渲染嵌入式项目,请创建一个实现 Option 协议的类,并定义你想要在网站前端显示的 UI 元素,如下例所示

import Foundation  
import ContentstackUtils  
class  CustomRenderOption: Option {  

override func renderMark(markType: MarkType, text: String) -> String {
    switch markType {
    case .bold:
        return "<b>\(text)</b>"
    default:
        return super.renderMark(markType: markType, text: text)
    }
}

override func renderNode(nodeType: String, node: Node, next: (([Node]) -> String)) -> String {
    switch nodeType {
    case "p":
        return "<p class='class-id'>\(next(node.children))</p>"
    case "h1":
        return "<h1 class='class-id'>\(next(node.children))</h1>"
    default:
        return super.renderNode(nodeType: nodeType, node: node, next: next)
    }
}
  
func renderOptions(embeddedObject: EmbeddedObject, metadata: Metadata) -> String? {
      switch metadata.styleType {
      case .block:
          if metadata.contentTypeUid == "product" {
              if let product = embeddedObject as? Product {
                  return """
                      <div>
                      <h2 >\(product.title)</h2>
                      <img src=\(product.product_image.url) alt=\(product.product_image.title)/>
                      <p>\(product.price)</p>
                      </div>
                  """
              }
          }else {
              if let entry = embeddedObject as? Entry {
                  return """
                      <div>
                      <h2>\(entry.title)</h2>
                      <p>\(entry.description)</p>
                      </div>
                      """
              }
          }
      default:
          return super.renderOptions(embeddedObject: embeddedObject, metadata: metadata)
      }
}

基本查询

Contentstack Utils SDK 允许你与 Content Delivery API 交互,并从条目的 RTE 字段中检索嵌入式项目。

从单个条目中获取嵌入式项目

渲染 HTML RTE 嵌入式对象

要获取单个条目的嵌入式项目,你需要提供堆栈 API 密钥、环境名称、交付令牌、内容类型和条目 UID。然后,使用如下所示的 ContentstackUtils.render 函数

import ContentstackUtils  

let stack:Stack = Contentstack.stack(apiKey: API_KEY, deliveryToken: DELIVERY_TOKEN, environment: ENVIRONMENT)  

stack.contentType(uid: contentTypeUID)
     .entry(uid: entryUID)
     .include(.embeddedItems)  
     .fetch { (result: Result<EntryModel, Error>, response: ResponseType) in  
        switch result {  
            case .success(let model):
                ContentstackUtils.render(content: model.richTextContent, Option(entry: model))  
            case .failure(let error):  
                //Error Message  
        }  
    }

渲染增强型 RTE 内容

要获取单个条目,你需要提供堆栈 API 密钥、环境名称、交付令牌、内容类型和条目 UID。然后,使用如下所示的 ContentstackUtils.jsonToHtml 函数

import ContentstackUtils  

let stack:Stack = Contentstack.stack(apiKey: API_KEY, deliveryToken: DELIVERY_TOKEN, environment: ENVIRONMENT)  

stack.contentType(uid: contentTypeUID)
     .entry(uid: entryUID)
     .include(.embeddedItems)  
     .fetch { (result: Result<EntryModel, Error>, response: ResponseType) in  
        switch result {  
            case .success(let model):
                ContentstackUtils.jsonToHtml(content: model.richTextContent, Option(entry: model))  
            case .failure(let error):  
                //Error Message  
        }  
    }

注意:增强型 RTE 还支持嵌入式项目。要在获取条目时获取所有嵌入式项目,请使用 includeEmbeddedItems 函数。

从多个条目中获取嵌入式项目

渲染 HTML RTE 嵌入式对象

要从多个条目中获取嵌入式项目,你需要提供堆栈 API 密钥、环境名称、交付令牌和内容类型 UID。然后,使用如下所示的 ContentstackUtils.render 函数

import ContentstackUtils  

let stack = Contentstack.stack(apiKey: apiKey,  
deliveryToken: deliveryToken,  
environment: environment)  
  
stack.contentType(uid: contentTypeUID)
     .entry()
     .query()
     .include(.embeddedItems)
     .find { (result: Result<ContentstackResponse<EntryModel>, Error>, response: ResponseType) in  
        switch result {  
            case .success(let contentstackResponse):  
                for item in contentstackResponse.items {  
                    ContentstackUtils.render(content: item.richTextContent, CustomRenderOption(entry: item))  
                }  
            case .failure(let error):  
                //Error Message  
        }  
    }

渲染增强型 RTE 内容

要获取多个条目,你需要提供堆栈 API 密钥、环境名称、交付令牌和内容类型 UID。然后,使用如下所示的 Contentstack.Utils.jsonToHtml 函数

import ContentstackUtils  

let stack:Stack = Contentstack.stack(apiKey: API_KEY, deliveryToken: DELIVERY_TOKEN, environment: ENVIRONMENT)  

stack.contentType(uid: contentTypeUID)
     .entry()
     .query()
     .include(.embeddedItems)
     .find { (result: Result<EntryModel, Error>, response: ResponseType) in  
        switch result {  
            case .success(let model):
                for item in contentstackResponse.items {  
                    ContentstackUtils.jsonToHtml(content: item.richTextContent, CustomRenderOption(entry: item))  
                }
            case .failure(let error):  
                //Error Message  
        }  
    }

GraphQL 实现

从内容类型中获取条目后,将 JSON RTE 传递给如下所示的 ContentstackUtils.GQL.jsonToHtml 函数

import ContentstackUtils  
import Apollo
...
let graphQLClient: ApolloClient
...

graphQLClient.fetch (query: ProductsQuery(), cachePolicy: CachePolicy.fetchIgnoringCacheData, queue: DispatchQueue.main) {[weak self] (result: Result<GraphQLResult<ProductsQuery.Data>, Error>) in
    guard let slf = self else {
                   return
               }
    switch result {
    case .success(let graphQLResult):
        guard let data = graphQLResult.data, let products = data.allAbcd?.items else {
           return
        }

        for product in products {
            if let rte = product.superchargedRte {
               let result = try? ContentstackUtils.GQL.jsonToHtml(rte: rte.resultMap)
            }
        }
    case .failure(let error):
      print("Failure! Error: \(error)")
    }
}