IGDB SWIFT-API
IGDB.com免费视频游戏数据库API的Swift包装器。
重要
此包装器仅与最新的V4版本兼容。
关于 IGDB
IGDB.com背后的一个原则是数据的可访问性。我们希望与任何想要构建面向视频游戏的网站、应用程序和服务的人共享数据。这意味着你贡献给IGDB.com的信息也可以由其他项目使用。
因此,你不仅在为这个网站增值,还为成千上万的其他项目增值。我们期待看到你提出的令人兴奋的游戏相关项目。祝你编码愉快!
更多信息请在此处查看
关于查询语言 APICalypse 的信息
关于包装器
此包装器是用 Swift 4 编写和测试的。
包装器可以处理由 IGDB 生成的类和 JSON(字符串),我选择使生成的类成为标准方式,因为这会使使用起来更加容易,您不需要创建自己的类来存储信息。
安装和设置
Swift 包
您可以通过将此存储库链接粘贴到 Xcode 中来导入此库。
Xcode -> Swift 包 -> 添加包依赖项
或者如果您有一个 Package.swift
文件,您可以在其中添加
dependencies: [
.package(url: "https://github.com/husnjak/IGDB-SWIFT-API.git", from: "0.4.2"),
],
targets: [
.target(name: "MyTarget", dependencies: ["IGDB-SWIFT-API"]),
]
CocoaPods
CocoaPods 是 Cocoa 项目的依赖关系管理器。您可以使用以下命令安装它
$ gem install cocoapods
要使用 CocoaPods 将 IGDBWrapper 集成到您的 Xcode 项目中,在您的 Podfile
中指定它
$ pod 'IGDB-SWIFT-API', git: "https://github.com/husnjak/IGDB-API-SWIFT.git"
然后,运行以下命令
$ pod install
使用您的 Twitch 开发者凭据
- 通过传递创建一个新的 IGDBWrapper 对象,然后传递您的 API 密钥。
let wrapper: IGDBWrapper = IGDBWrapper(clientID: "CLIENT_ID", accessToken: "ACCESS_TOKEN")
在iOS上的认证
不建议在用户设备上创建新的访问令牌,因为您不希望每个设备都创建多个`access_tokens`。建议在服务器上创建令牌,然后使用代理API调用IGDB API,其中每个请求都附加Bearer令牌。
IGDB提供了一份免费的AWS CloudFormation模板,可以部署用于此目的,并且包含了如何使用它的说明。
- 创建一个新的IGDBWrapper对象,连接到AWS代理服务器。
let wrapper: IGDBWrapper = IGDBWrapper(proxyURL: "PROXY_URL/v4", proxyHeaders: ["x-api-key": "PROXY_API_KEY"])
如何使用包装器
包装器有两个“包装”函数和许多辅助函数(每个端点一个)。
两个主要函数名为apiRequest
和apiJsonRequest
,它们处理所有对API的请求。
类APICalypse
处理新的查询语言,因此你无需过多关注结构和语法。
-
apiProtoRequest
此方法处理IGDB生成的proto类,并返回用于填充适当类的数据。wrapper.apiProtoRequest(endpoint: .GAMES, apicalypseQuery: "fields *;", dataResponse: { bytes in let games: [Proto_Game] = try! Proto_GameResult(serializedData: bytes) // This converts Binary to a struct }, errorResponse: { error in // Do Something })
返回一系列游戏对象的列表。
-
apiJsonRequest
此方法从API返回原始JSON(字符串)。wrapper.apiJsonRequest(endpoint: .GAMES, apicalypseQuery: "fields *;", dataResponse: { json in print(json) }, errorResponse: { error in // Do Something })
返回一个字符串。
-
APICalypse
let apicalypse = APICalypse() .fields(fields: "*") .exclude(fields: "*") .limit(value: 10) .offset(value: 0) .search(searchQuery: "Halo") .sort(field: "release_dates.date", order: .ASCENDING) .where(query: "platforms = 48")
以下列出了所有选项,这为您创建了一个查询。要从APICalypse获取字符串查询,只需添加
.buildQuery()
。
注意
上述示例仅用于展示如何使用包装器的“手动”部分。此包装器提供了API中每个端点的完整函数,因此您无需处理手动部分...
对于每个端点,有两个函数,一个用于类,一个用于JSON,以便快速访问。两者之间的区别在于名称,请看下面的示例
wrapper.games(apiCalypse: APICalypse(), result: ([Proto_Game]) -> (Void), errorResponse: (RequestException) -> (Void))
wrapper.platforms(apiCalypse: APICalypse(), result: ([Proto_Platforms]) -> (Void), errorResponse: (RequestException) -> (Void))
wrapper.genres(apiCalypse: APICalypse(), result: ([Proto_Genres]) -> (Void), errorResponse: (RequestException) -> (Void))
...
wrapper.jsonGames(apiCalypse: APICalypse(), result: (String) -> (Void), errorResponse: (RequestException) -> (Void))
wrapper.jsonPlatforms(apiCalypse: APICalypse(), result: (String) -> (Void), errorResponse: (RequestException) -> (Void))
wrapper.jsonGenres(apiCalypse: APICalypse(), result: (String) -> (Void), errorResponse: (RequestException) -> (Void))
...
ImageBuilder
为了简化构建IGDB图像的URL的过程,新增了一个名为imageBuilder
的函数,它可以作为请求项目所需完美尺寸图像的辅助工具。此功能需要您获取image_id
,然后设置您所需的大小(分辨率),设置您所需的图像格式(默认设置为PNG)。
let image_id = "mnljdjtrh44x4snmierh"
let imageURL = imageBuilder(imageID: image_id, size: .SCREENSHOT_HUGE, imageType: .PNG)
/*
* Result:
* imageURL = https://images.igdb.com/igdb/image/upload/t_screenshot_huge/mnljdjtrh44x4snmierh.png
*/
有关图像的更多信息,请参阅此处
异常
包装器在API的每个异常上都会返回一个RequestException
。此异常包含以下三个信息
- HTTP状态码
- URL
- MSG,API的消息
代码示例
- 从API请求游戏
let wrapper = IGDBWrapper(clientID: "CLIENT_ID", accessToken: "ACCESS_TOKEN")
let apicalypse = APICalypse()
.fields(fields: "*")
.sort(field: "release_dates.date", order: .DESCENDING)
wrapper.games(apiCalypse: apicalypse, result: { games in
// Do something..
}) { error in
// Do something..
}
- API中搜索:请注意
搜索对象包含搜索中的对象,例如:角色、收藏集、游戏、平台和主题。
搜索不与排序一起工作!
let wrapper = IGDBWrapper(clientID: "CLIENT_ID", accessToken: "ACCESS_TOKEN")
let apicalypse = APICalypse()
.search(searchQuery: "Halo")
.fields(fields: "*")
.sort(field: "release_dates.date", order: .ASCENDING)
wrapper.search(apiCalypse: apicalypse, result: { searchResults in
// Do something..
}) { error in
// Do something..
}
- 请求过滤后的结果
let wrapper = IGDBWrapper(clientID: "CLIENT_ID", accessToken: "ACCESS_TOKEN")
let apicalypse = APICalypse()
.fields(fields: "*")
.sort(field: "release_dates.date", order: .DESCENDING)
.where(query: "themes != 42")
wrapper.games(apiCalypse: apicalypse, result: { games in
// Do something..
}) { error in
// Do something..
}
许可协议
IGDB-SWIFT-API在MIT许可下可用。有关更多信息,请参阅LICENSE文件。