Contentstack Swift SDK
Contentstack 是一个 API 为首的无头 CMS。它是一个 CMS,开发者可以使用它以其喜爱的语言构建强大的跨平台应用。构建应用的前端,Contentstack 将负责其余工作。 了解更多。
Contentstack 提供了 iOS SDK,用于在 iOS 上构建应用。以下是如何使用我们的 iOS SDK 的详细指南和有帮助的资源。
先决条件
最新版的 Xcode 和 Mac OS X
设置和安装
要在此 iOS 平台使用此 SDK,您需要按以下步骤安装 SDK。
CocoaPods
- 将以下行添加到您的Podfile中
- pod 'ContentstackSwift'
- 运行pod install,现在您应该拥有最新的Contentstack版本。
导入Header/Module
import ContentstackSwift
使用Contentstack的关键概念
Stack
A stack是类似于容器的内容,用于存放您的应用程序的内容。了解更多关于Stacks的信息。
内容类型
内容类型能让您定义页面或数字属性部分的结构的蓝图。它是一个类似于表单的页面,为内容管理员提供一个输入和上传内容的界面。《a href="https://www.contentstack.com/docs/guide/content-types" rel="nofollow">更多信息。
条目
条目是使用所定义的内容类型之一创建的实际内容。了解更多关于条目的信息。
资产
资产是指上传到Contentstack的所有媒体文件(图像、视频、PDF、音频文件等)。这些文件可以用于多个条目。了解更多关于资产的信息。
环境
发布环境对应于一个或多个部署服务器或内容交付位置,其中需要发布条目。了解如何使用环境。
Contentstack iOS SDK:5分钟快速入门
初始化您的SDK
要在您的应用程序中使用SDK,您需要通过提供相应的密钥和值来初始化堆栈
let stack:Stack = Contentstack.stack(apiKey: API_KEY, deliveryToken: DELIVERY_TOKEN, environment: ENVIRONMENT)
要获取上述API凭证,您需要登录您的Contentstack账户,然后在您的顶部导航栏中,转到设置 -> 程序堆栈以查看您的API密钥和您的配送令牌
返回的堆栈对象是一个Contentstack客户端对象,可用于初始化不同的模块并对我们内容交付API执行查询。每个模块的初始化过程将在下一节中解释。
从您的堆栈查询内容
要获取特定内容类型的所有条目,请使用以下查询:
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
stack.contentType(uid: contentTypeUID).entry().query()
.find { (result: Result<ContentstackResponse<EntryModel>, Error>, response: ResponseType) in
switch result {
case .success(let contentstackResponse):
// Contentstack response with AssetModel array in items.
case .failure(let error):
//Error Message
}
}
要获取特定内容类型的特定条目,请使用以下查询:
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
stack.contentType(uid: contentTypeUID).entry(uid: UID)
.fetch { (result: Result<EntryModel, Error>, response: ResponseType) in
switch result {
case .success(let model):
//Model retrive from API
case .failure(let error):
//Error Message
}
}
高级查询
您可以使用我们的iOS API参考来查询内容类型、条目、资产等。
与图像协同工作
我们引入了图像交付API,让您能够检索图像,然后再对它们进行操作和优化,以符合您的数字资产。它允许您执行一系列其他操作,如裁剪、修剪、调整大小、旋转、叠加等。
例如,如果您想裁剪一张宽度为300像素、高度为400像素的图像,只需将查询参数附加到图像URL的末尾即可,如下所示:https://images.contentstack.io/v3/assets/uid_136download?crop=300,400。您还可以为图像使用更多参数。
您还可以使用此SDK中的图像交付API函数。以下是在SDK中使用的一些示例。
/* set the image quality to 100 */
let quality: UInt = 100
let imageTransform = ImageTransform().qualiy(quality)
let url = try imageURL.url(with: imageTransform)
/* resize the image by specifying width and height */
let width: UInt = 100
let height: UInt = 100
let urlboth = try imageURL
.url(with: makeImageTransformSUT()
.resize(
Resize(size:
Size(width: width, height: height)
)
)
)
使用iOS SDK与同步API
同步API负责将您的Contentstack数据与您的应用程序同步,并通过提供增量更新来确保数据始终保持最新。Contentstack的iOS SDK支持同步API,您可以使用它来构建强大的应用程序。阅读以下内容以了解如何使用Contentstack iOS SDK中的同步API。
初始同步
初始同步过程会对您的应用程序数据进行完整的同步。它会返回指定堆栈中所有已发布的条目和资源。
要开始初始同步过程,请使用syncStack方法。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
stack.sync(then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
响应还包含一个同步令牌,您需要将其存储,因为稍后在使用以下部分中显示的后续同步时,该令牌用于获取增量更新。
您还可以使用高级同步查询在初始同步中获取自定义结果。
同步分页
如果初始同步(或后续同步)的结果包含超过100条记录,则响应将分页。它提供了分页令牌。但是,您不必手动使用分页令牌来获取下一批数据;SDK会自动完成此操作,直到同步完成。
分页令牌可以在您只想获取所选批次的情况下使用。如果同步过程中途中断(由于网络问题等),它非常有用。在这种情况下,可以使用此令牌从上次中断的地方重新启动同步过程。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(paginationToken: paginationToken)
stack.sync(syncStack, then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
后续同步
您可以使用同步令牌(在初始同步后获得)来获取下一次更新的内容。同步令牌仅获取自上次同步后添加的内容以及已删除或更新的内容的详细信息。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(syncToken: syncToken)
stack.sync(syncStack, then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
高级同步查询
您可以使用高级同步查询来获取筛选后的结果。让我们详细看看。
从特定日期初始化同步
要从一个特定日期初始化同步,您可以使用sync
参数指定日期。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(syncToken: syncToken)
stack.sync(syncTypes: [.startFrom(date)], then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
初始化特定内容类型的同步
您还可以仅使用特定内容类型的条目初始化同步。为此,请使用syncOnly并指定内容类型UID作为其值。
然而,如果您这样做,随后的同步将只包括指定内容类型的条目。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(syncToken: syncToken)
stack.sync(syncTypes: [.contentType("contentTypeUID")], then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
使用特定语言的初始同步
您还可以使用只包含特定地区条目的同步来初始化。为此,请使用同步并指定地区代码作为其值。
但是,如果您这样做,随后的同步将只包括指定地区的条目。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(syncToken: syncToken)
stack.sync(syncTypes: [.locale("en-gb")], then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
使用发布类型的初始同步
您还可以使用基于特定发布类型的条目和资产初始化同步。可接受的值是PublishType枚举entryPublished、entryUnpublished、entryDeleted、assetPublished、assetUnpublished、assetDeleted和contentTypeDeleted。为此,请使用syncPublishType并指定参数。
但是,如果您这样做,随后的同步将只包括指定发布类型的条目
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(syncToken: syncToken)
stack.sync(syncTypes: [.publishType(.assetPublished)], then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})
使用多个参数的初始同步
要从特定日期开始初始化同步特定内容类型的条目,请使用以下代码片段。
请注意,随后的同步将只包括指定内容类型的条目。
let stack = Contentstack.stack(apiKey: apiKey,
deliveryToken: deliveryToken,
environment: environment)
let syncStack = SyncStack(syncToken: syncToken)
stack.sync(syncTypes: [.locale("en-gb"), .contentType("contentTypeUID")], then: { (result: Result<SyncStack, Error>) in
switch result {
case .success(let syncStack):
let items = syncStack.items
//error for any error description
//syncStack for SyncStack
//syncStack.syncToken: contains token for next sync Store this token For next sync
//syncStack.paginationToken: contains token for next sync page this token for next sync
//syncStack.items: contains sync data
If let token = syncStack.paginationToken {
UserDefault.standard.setValue(token, forKey:"PaginationToken")
}else if let token = syncStack.syncToken {
UserDefault.standard.setValue(token, forKey:"SyncToken")
}
case .failure(let error):
print(error)
}
})