universalis-swift

一个简单的 Swift 客户端,可以轻松地使用 universalis.app API

提示

这个包与官方 API 文档紧密匹配,你可以在这里找到它:https://docs.universalis.app

安装

Swift 包管理器

  1. Xcode -> 文件 -> 添加包依赖项
  2. 粘贴此仓库 URL:https://github.com/Eisenhuth/universalis-swift.git
  3. 添加包

Swift 包

将此依赖项添加到你的 Package.swift 文件

.package(url: "https://github.com/Eisenhuth/universalis-swift", branch: "master")

用法

初始化

import Foundation
import universalis_swift

let universalis = UniversalisClient()

当前挂单

你可以同时请求单个物品或多个物品

let single = await universalis.getCurrentData(worldDcRegion: "Europe", itemId: 5)
print("average price: \(single.result?.averagePrice.rounded() ?? 0) gil")

let multi = await universalis.getCurrentData(worldDcRegion: "Europe", itemIds: [2, 3, 4, 5])
multi.result?.items?.values.forEach({
    print("ItemId: \($0.itemID) - listings: \($0.listingsCount)")
})

销售历史

工作方式与当前数据相同

let historySingle = await universalis.getHistory(worldDcRegion: "Europe", itemId: 5)
let historyMulti = await universalis.getHistory(worldDcRegion: "Europe", itemIds: [2, 3, 4, 5])

聚合数据

let aggregated = await universalis.getAggregatedData(worldDcRegion: "Europe", itemIds: [2, 3, 4, 5])
aggregated.result?.results?.forEach({
    if let cheapestWorld = $0.nq?.minListing?.region {
        let worldName = worlds.result?.first { $0.id == cheapestWorld.worldId }?.name ?? "no name"
        print("ItemId: \($0.itemId) - cheapest world: \(worldName) - \(cheapestWorld.price) gil")
    }
})

警告

请注意,返回的聚合数据中几乎所有内容都是可选的。

查询:两种方法

你可以使用内置查询或提供你自己的 [URLQueryItems],它们的功能相同

let monthInSeconds = 86400 * 30

let example1 = await universalis.getCurrentData(worldDcRegion: "Europe", itemId: 5, queries: [
    .listings(10),
    .entriesWithin(monthInSeconds)
])
let example2 = await universalis.getCurrentData(worldDcRegion: "Europe", itemId: 5, queryItems: [
    URLQueryItem(name: "listings", value: "\(10)"),
    URLQueryItem(name: "entriesWithin", value: "\(monthInSeconds)")
])

example1.result?.listings?.forEach({ listing in
    print("\(listing.pricePerUnit) - \(listing.quantity) - \(listing.retainerCityName) - \(listing.worldName ?? "")")
})

print("same: \(example1.result?.averagePrice == example2.result?.averagePrice)")
print(example1.result?.averagePrice.rounded() ?? 0)
print(example2.result?.averagePrice.rounded() ?? 0)

额外功能

let marketableItems = await universalis.getMarketableItems()
let dataCenters = await universalis.getDataCenters()
let worlds = await universalis.getWorlds()
let taxRates = await universalis.getTaxRates(world: "Phoenix")

let uploadsByWorld = await universalis.getUploadsByWorld()
let uploadsByApplication = await universalis.getUploadsByApplication()
let uploadsPerDay = await universalis.getUploadsPerDay()