Contentstack 是一个采用 API 优先方法的无头 CMS。开发者可以使用它来构建强大的跨平台应用程序,并使用他们喜欢的语言。构建你的应用程序前端,剩下的交给 Contentstack 处理。 阅读更多。
Contentstack 提供 iOS SDK,用于在 iOS 平台上构建应用程序。以下是详细指南和有用的资源,可帮助你开始使用我们的 iOS SDK。
最新的 Xcode 和 Mac OS X
要在 iOS 平台上使用此 SDK,你必须按照以下步骤安装 SDK。
将以下内容添加到你的 Podfile 中
use_frameworks!
pod 'ContentstackUtils', '~> 1.3.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
将以下内容添加到你的 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
$(SDKROOT)/usr/include/libxml2
添加到 Search Paths > Header Search Paths
字段$(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 字段中检索嵌入式项目。
要获取单个条目的嵌入式项目,你需要提供堆栈 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
}
}
要获取单个条目,你需要提供堆栈 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
函数。
要从多个条目中获取嵌入式项目,你需要提供堆栈 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
}
}
要获取多个条目,你需要提供堆栈 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
}
}
从内容类型中获取条目后,将 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)")
}
}