HCHotelsPriceFreezeSDK 0.1.34

HCHotelsPriceFreezeSDK 0.1.34

Vivek MahajanTony Morales维护。



  • hc 分布式金融科技

Hopper Hotel Price Freeze SDK for iOS

注意:此版本的 SDK 正在开发中。

此仓库包含 HCHotelsPriceFreeze 框架,可以通过 CocoaPods 或手动方式将其添加到您的 iOS 项目中。

CocoaPods 安装

  1. 在您的 Mac 上安装 CocoaPods
  2. 打开终端
  3. 在终端中导航到您的 Xcode 项目根目录(您的 .xcodeproj 文件所在位置),然后输入:pod init
  4. 打开新创建的 Podfile 文件
  5. 在 Podfile 中,在 use_frameworks! 之下添加:pod 'HCHotelsPriceFreezeSDK'
  6. 保存您的 Podfile
  7. 在 Xcode 项目根目录的终端中输入:pod install(对于 Intel 机器),或者 arch -x86_64 pod install(对于 Apple Silicon 机器)
  8. 关闭任何打开的 Xcode 窗口,并打开新创建的 .xcworkspace 文件
  9. 在 Xcode 项目中您想使用 SDK 的地方,在 Swift 文件的最顶端输入 import HCHotelsPriceFreeze

如果您在安装 CocoaPods 时遇到问题,或需要更详细地了解安装 CocoaPods 的步骤,请查看此 Stack Overflow 帖子

手动安装

  1. 下载此存储库
  2. 解压 zip 文件
  3. 将 HCHotelsPriceFreeze.xcframework 拖入您的 Xcode 项目

CocoaPods 更新流程

  1. 打开终端
  2. 在终端导航到您的 Xcode 项目根目录
  3. 在终端运行 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
    }
}

注意

  1. 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界面的原型