Hopper Hotel Price Freeze SDK for iOS
注意:此版本的 SDK 正在开发中。
此仓库包含 HCHotelsPriceFreeze 框架,可以通过 CocoaPods 或手动方式将其添加到您的 iOS 项目中。
CocoaPods 安装
- 在您的 Mac 上安装 CocoaPods
- 打开终端
- 在终端中导航到您的 Xcode 项目根目录(您的
.xcodeproj
文件所在位置),然后输入:pod init
- 打开新创建的 Podfile 文件
- 在 Podfile 中,在
use_frameworks!
之下添加:pod 'HCHotelsPriceFreezeSDK'
- 保存您的 Podfile
- 在 Xcode 项目根目录的终端中输入:
pod install
(对于 Intel 机器),或者arch -x86_64 pod install
(对于 Apple Silicon 机器) - 关闭任何打开的 Xcode 窗口,并打开新创建的
.xcworkspace
文件 - 在 Xcode 项目中您想使用 SDK 的地方,在 Swift 文件的最顶端输入
import HCHotelsPriceFreeze
如果您在安装 CocoaPods 时遇到问题,或需要更详细地了解安装 CocoaPods 的步骤,请查看此 Stack Overflow 帖子。
手动安装
- 下载此存储库
- 解压 zip 文件
- 将 HCHotelsPriceFreeze.xcframework 拖入您的 Xcode 项目
CocoaPods 更新流程
- 打开终端
- 在终端导航到您的 Xcode 项目根目录
- 在终端运行
pod update HCHotelsPriceFreezeSDK
用法
注意:此版本的 SDK 正在开发中。
以下是对用法的概述,有关每个类和方法的其他文档请参阅。
设置
使用 ObservedObject
访问 SDK 并在发送请求之前调用 configure()
。
import HCHotelsPriceFreeze
import SwiftUI
struct ContentView: View {
@ObservedObject var sdk = HCHotelsPriceFreezeSDK.shared
init() {
sdk.configure(with: "your_hopper_token",
environmentType: .staging)
}
var body: some View {
HCPriceFreezeButtonWrapper(roomDetails: roomDetails,
purchaseCallback: { } )
{ offer, onClick in
Button("Freeze Price") { } // This is your SwiftUI Button
}
}
}
显示价格冻结按钮
假设您有一个表示价格冻结按钮的 SwiftUI 按钮
// Within your SwiftUI View
Button("Price Freeze") { } // This is your SwiftUI Button
您可以使用 HCPriceFreezeButtonWrapper
包装您的按钮
// Within your SwiftUI View
HCPriceFreezeButtonWrapper(roomDetails: roomDetails,
purchaseCallback: {})
{ offer, onClick in
Button("Price Freeze") { } // This is your SwiftUI Button
}
PriceFreezeButtonWrapper
将处理获取、缓存、过期、管理优惠状态,并提供当前 HCPriceFreezeOffer
以便您按需渲染。
HCPriceFreezeOffer
可能处于以下几种可能状态之一
- 加载中
- 可用
- 不可用
- 错误
您可以使用此状态来决定如何/是否渲染您的按钮,例如,如果您只想在有可用优惠时渲染它。
// Within your SwiftUI View
HCPriceFreezeButtonWrapper(roomDetails: roomDetails,
purchaseCallback: {})
{ offer, onClick in
if offer.state == .available {
Button("Price Freeze") { } // This is your SwiftUI Button
}
}
包装器将始终首先提供当前已知的 HCPriceFreezeOffer
状态,然后在优惠状态更改时再次提供。
如果尚未计算此房间的优惠,则 HCPriceFreezeOffer
将具有 加载中 的 HCPriceFreezeOfferState
。一旦计算了 HCPriceFreezeOffer
,包装器将提供更新后的 HCPriceFreezeOffer
,例如 可用 的 HCPriceFreezeOfferState
。
如果已确定优惠,则可以访问计算后的 HCPriceFreezeOffer
。
预加载优惠
要提前计算房间的优惠,请使用以下方法
sdk.cacheOffers(for: rooms) // Where `rooms` is an array of `HCRoomDetails` to preload
这将开始后台计算优惠,以便 PriceFreezeButtonWrapper
可以立即或更快地获得结果。
观察优惠状态
要提前观察给定房间优惠状态,请使用以下方法
sdk.subscribeTo(roomDetails: roomDetails) { // Where `roomroomDetails` is of `HCRoomDetails` which you would like to observe
newState in
switch newState {
case .loading:
print("Offer for room is being calculated")
case .available:
print("Offer for room is now available")
case .unavailable:
print("No offer is available for room")
case .error(let error):
print("Error encountered for room Error: \(error)")
}
}
要使用上述方法取消所有已订阅房间的订阅,请使用以下方法
sdk.cancelAllSubscriptions()
采购价格冻结
要开始采购流程,调用提供的onClick
函数
// Within your SwiftUI View
HCPriceFreezeButtonWrapper(roomDetails: roomDetails,
purchaseCallback: {})
{ offer, onClick in
if offer.state == .available {
Button("Price Freeze") { onClick() } // This is your SwiftUI Button
}
}
这将触发为用户启动采购流程。
观察价格冻结采购结果
HCPriceFreezeButtonWrapper
接受一个purchaseCallback
,允许您根据采购流程的结果执行操作。
HCPriceFreezeButtonWrapper(roomDetails: roomDetails,
purchaseCallback: { purchaseResult in
switch purchaseResult {
case .purchased(let offer): // The user purchased the PF
print("Price Freeze Purchased!")
print("Offer ID: \(offer.id)")
print("Offer Conditions: \(offer.conditions)")
print("Offer frozenPrice: \(offer.conditions.frozenPrice)")
print("Offer cap: \(offer.conditions.cap)")
case .cancelled(let offer, let whileLoading): // The user exited the purchase flow without purchasing
print("Price Freeze purchase flow cancelled")
print("while it was loading: \(whileLoading)")
print("Offer ID: \(offer.id)")
default: // Other purchaseResult outcomes
print("Error/Invalid purchaseResult: \(purchaseResult)")
}
}
)
{ offer, onClick in
if offer.state == .available {
Button("Price Freeze") { } // This is your SwiftUI Button
}
}
注意
- Xcode 14在运行使用
WKWebView
的代码时存在已知问题。当与价格冻结采购网站交互时,您可能会注意到显示为紫色感叹号的Xcode警告,警告内容为安全:此方法不应该在主线程上调用,因为它可能导致UI无响应
。(苹果开发者技术支持已解决这个问题)[https://developer.apple.com/forums/thread/714467?answerId=734799022#734799022]并概述了可以忽略警告的步骤,正如我们在这里所做的。
变更日志
版本 0.1.11 (04-27-23)
- 设置会话生命周期为4小时
版本 0.1.10 (04-26-23)
- 打开所有微站链接以在应用程序内进行
版本 0.1.9 (04-20-23)
- 更改内管价格冻结报价以处理获取错误和加载错误
版本 0.1.7 (04-19-23)
- 将
isRefundable
字段在HCRoom
中设为必需
版本 0.1.6 (04-18-23)
- 添加版本号到内部日志记录
版本 0.1.5(04-17-23)
- 添加了端到端测试
- 修复了一个阻止微网站上显示酒店图片的错误
- 修复了提前触发内部分析事件的错误
版本 0.1.3(04-07-23)
- 初始功能草案
- 添加会话管理
- 更改了报价存储逻辑
- 添加日志记录
- 添加防抖功能
版本 0.0.6(03-08-23)
- 初始实现占位符,SDK界面的原型