import PackageDescription
let package = Package(
name: "MyAwesomeApp",
dependencies: [
.package(url: "https://github.com/nerdishbynature/octokit.swift", from: "0.9.0"),
]
)
Octokit 同时支持 GitHub 和 GitHub Enterprise。认证通过配置 (Configurations) 处理。
有两种类型的配置:TokenConfiguration
和 OAuthConfiguration
。
如果您使用基于 Access Token 的认证(例如,用户向您提供了他在网站上生成的访问令牌),或者您通过 OAuth 流程获得了 Access Token,则使用 TokenConfiguration
。
您可以为 github.com
初始化一个新的配置,如下所示:
let config = TokenConfiguration("YOUR_PRIVATE_GITHUB_TOKEN_HERE")
或为 GitHub Enterprise 初始化:
let config = TokenConfiguration("YOUR_PRIVATE_GITHUB_TOKEN_HERE", url: "https://github.example.com/api/v3/")
获取令牌后,您可以将其与 Octokit
一起使用:
Octokit(config).me() { response in
switch response {
case .success(let user):
print(user.login as Any)
case .failure(let error):
print(error)
}
}
如果您还没有访问令牌,并且用户必须登录您的应用程序,则应该使用 OAuthConfiguration
。 它也处理 OAuth 流程。
您可以按如下方式为 github.com
验证用户:
let config = OAuthConfiguration(token: "<Your Client ID>", secret: "<Your Client secret>", scopes: ["repo", "read:org"])
let url = config.authenticate()
或为 GitHub Enterprise 初始化:
let config = OAuthConfiguration("https://github.example.com/api/v3/", webURL: "https://github.example.com/", token: "<Your Client ID>", secret: "<Your Client secret>", scopes: ["repo", "read:org"])
获取配置后,您可以验证用户:
// AppDelegate.swift
config.authenticate()
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
config.handleOpenURL(url) { config in
self.loadCurrentUser(config) // purely optional of course
}
return false
}
func loadCurrentUser(config: TokenConfiguration) {
Octokit(config).me() { response in
switch response {
case .success(let user):
print(user.login)
case .failure(let error):
print(error)
}
}
}
请注意,您将从 OAuth 流程获得一个 TokenConfiguration
。 您必须自己存储 accessToken
。 如果您想进行进一步的请求,则不必再次执行 OAuth 流程。 您只需使用 TokenConfiguration
即可。
let token = // get your token from your keychain, user defaults (not recommended) etc.
let config = TokenConfiguration(token)
Octokit(config).user(name: "octocat") { response in
switch response {
case .success(let user):
print("User login: \(user.login!)")
case .failure(let error):
print("Error: \(error)")
}
}
let username = ... // set the username
Octokit().user(name: username) { response in
switch response {
case .success(let user):
// do something with the user
case .failure(let error):
// handle any errors
}
}
Octokit().me() { response in
switch response {
case .success(let user):
// do something with the user
case .failure(let error):
// handle any errors
}
let (owner, name) = ("owner", "name") // replace with actual owner and name
Octokit().repository(owner, name) { response in
switch response {
case .success(let repository):
// do something with the repository
case .failure(let error):
// handle any errors
}
}
Octokit().repositories() { response in
switch response {
case .success(let repository):
// do something
case .failure(let error):
// handle any errors
}
}
let username = "username"
Octokit().stars(username) { response in
switch response {
case .success(let repositories):
// do something with the repositories
case .failure(let error):
// handle any errors
}
}
Octokit().myStars() { response in
switch response {
case .success(let repositories):
// do something with the repositories
case .failure(let error):
// handle any errors
}
}
let username = "username"
Octokit().followers(username) { response in
switch response {
case .success(let users):
// do something with the users
case .failure(let error):
// handle any errors
}
}
Octokit().myFollowers() { response in
switch response {
case .success(let users):
// do something with the users
case .failure(let error):
// handle any errors
}
}
let username = "username"
Octokit().following(username) { response in
switch response {
case .success(let users):
// do something with the users
case .failure(let error):
// handle any errors
}
}
Octokit().myFollowing() { response in
switch response {
case .success(let users):
// do something with the users
case .failure(let error):
// handle any errors
}
}
获取所有已认证用户的可见仓库(包括拥有的仓库、成员仓库和组织仓库)的所有议题。
Octokit(config).myIssues() { response in
switch response {
case .success(let issues):
// do something with the issues
case .failure:
// handle any errors
}
}
let (owner, repo, number) = ("owner", "repo", 1347) // replace with actual owner, repo name, and issue number
Octokit(config).issue(owner, repository: repo, number: number) { response in
switch response {
case .success(let issue):
// do something with the issue
case .failure:
// handle any errors
}
}
Octokit(config).postIssue("owner", repository: "repo", title: "Found a bug", body: "I'm having a problem with this.", assignee: "octocat", labels: ["bug", "duplicate"]) { response in
switch response {
case .success(let issue):
// do something with the issue
case .failure:
// handle any errors
}
}
Octokit(config).patchIssue("owner", repository: "repo", number: 1347, title: "Found a bug", body: "I'm having a problem with this.", assignee: "octocat", state: .Closed) { response in
switch response {
case .success(let issue):
// do something with the issue
case .failure:
// handle any errors
}
}
Octokit().commentIssue(owner: "octocat", repository: "Hello-World", number: 1, body: "Testing a comment") { response in
switch response {
case .success(let comment):
// do something with the comment
case .failure:
// handle any errors
}
}
Octokit().patchIssueComment(owner: "octocat", repository: "Hello-World", number: 1, body: "Testing a comment") { response in
switch response {
case .success(let comment):
// do something with the comment
case .failure:
// handle any errors
}
}
Octokit().pullRequest(owner: "octocat", repository: "Hello-World", number: 1) { response in
switch response {
case .success(let pullRequests):
// do something with a pull request
case .failure:
// handle any errors
}
}
Octokit().pullRequests(owner: "octocat", repository: "Hello-World", base: "develop", state: Openness.Open) { response in
switch response {
case .success(let pullRequests):
// do something with a pull request list
case .failure:
// handle any errors
}
}
Octokit().postRelease(owner: "octocat", repository: "Hello-World", tagName: "v1.0.0", targetCommitish: "master", name: "v1.0.0 Release", body: "The changelog of this release", prerelease: false, draft: false) { response in
switch response {
case .success(let release):
// do something with the release
case .failure:
// handle any errors
}
}