reddift 2.0.3

reddift 2.0.3

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2018年4月
SwiftSwift 版本4.0
SPM支持 SPM

sonson 维护。



 
依赖项
HTMLSpecialCharacters>= 0
MiniKeychain>= 0
 

reddift 2.0.3

Carthage compatible Version License Platform Build Status

reddift

reddift 是 Swift Reddit API 包装框架,并使用该框架开发了一个浏览器。

  • 支持 OAuth2(目前不在 tvOS 上支持)。
  • 支持多账号。
  • 包括一个示例应用(仅 iOS)。

浏览器

  • 它是典型的 Reddit.com 浏览器。
  • 此应用程序使用 "reddift 框架" 来访问 Reddit.com。
  • 包括几乎所有功能,如图像缩略图、浏览评论、搜索 subreddits 等。
  • 如果您需要更多功能,请向我发送 pull request。

reddift-comments reddift-images

文档

如何搭建

当前正在开发中。请务必注意使用这个库。

1. 检出一个源代码。

# check out reddift and its submodules.
> git clone --recursive https://github.com/sonsongithub/reddift.git

确保这些库在每个路径上正确检出。

/framework/vendor/HTMLSpecialCharacters
/framework/vendor/MiniKeychain

2. 在reddit.com创建应用(已安装应用)

通过reddit.com的偏好页创建新的已安装应用。然后,检查你的应用的client_id并填写OAuth2的redirect_uri。例如,redirect_uri设置为myapp://response。在下面的示例中,redirect_uri设置为reddift://response

installedapp

3. 设置reddift_config.json

这个JSON文件将保存应用信息以使用OAuth。将reddift_config.json.sample重命名为reddift_config.json。填写DeveloperNameredirect_uriclient_idredirect_uri必须与你在reddit.com注册的相同。你可以在应用程序选项卡中检查client_id。reddift使用此JSON和应用程序的info.plist生成http的user-agent属性。

{
  "DeveloperName": "<YOUR NAME>",
  "redirect_uri": "<YOUR REDIRECT URI>",
  "client_id": "<YOUR ID>"
}

4. 在Xcode中设置你的URI

在Xcode中设置URL Types以接受来自Safari的调用。将URL Schemes设置为你在reddit.com设置的redirect_uri。不需要包括://response到这个表单。这些URI必须相同。如果不相同,reddit.com将不会授权你的OAuth请求。在下面的示例中,URL Schemes设置为reddift

reddit2

如何构建测试

1. 注册用户脚本应用

测试使用应用仅OAuth以从测试过程中移除用户交互。如果您想运行reddift的测试,您必须在reddit.com创建另一个“脚本”类型的应用程序(个人用途脚本)。

userscript

2. 填写 test_config.json

首先,将 test_config.json.sample 重命名为 test_config.json。使用reddit.com上的以上偏好设置填写每个后续值。

{
  "username": "test user account",
  "password": "test user password",
  "client_id": "test app client ID(must be script type app)",
  "secret": "test app secret"
}

3. 启动测试

Cmd + U.

如何构建浏览器示例

在Xcode中使用之前,您必须使用 carthage 构建依赖框架。

# before open xcode project file.
> carthage update --platform iOS

carthage 运作正常,您可以从以下路径获得以下框架:

/Carthage/Build/iOS/FLAnimatedImage.framework
/Carthage/Build/iOS/YouTubeGetVideoInfoAPIParser.framework
/Carthage/Build/iOS/UZTextView.framework

并且,您可以像框架一样编辑URI类型和reddift_config.json。

创建您的应用。

获取某物 & 错误处理

reddift 返回 Result<T> 对象。从 Result<T> 对象中获取值或错误。具体来说,你可以通过以下代码像访问枚举状态一样访问值:

// do not use "!" in your code
switch(result) {
case .failure(let error):
    println(error)
case .success(let listing):
    // do something to listing
}

有关此编码风格的更多细节,请参阅 "Swift 中使用函数概念和泛型的有效 JSON"。

创建会话

首先,您必须实现代码以在 UIAppDelegate 中接收 OAuth2 的响应。reddift 允许您将令牌以指定的名称保存到 KeyChain 中。具体来说,以下示例代码将令牌保存为位于 reddit.com 的用户名。

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return OAuth2Authorizer.sharedInstance.receiveRedirect(url, completion:{(result) -> Void in
        switch result {
        case .failure(let error):
            print(error)
        case .success(let token):
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                OAuth2TokenRepository.saveIntoKeychainToken(token, name:token.name)
            })
        }
    })
}

要使用 OAuth2 通过通信与 reddit.com,您必须创建 Session 对象。有关获取响应或错误处理的详细信息,请参阅以下部分。

let result = OAuth2TokenRepository.restoreFromKeychainWithName(name)
switch result {
case .failure(let error):
    print(error.description)
case .success(let token):
    con.session = Session(token: token)
}

您可以像以下代码一样通过 Session 对象获取抖音内容。

session?.getList(paginator, subreddit:subreddit, sort:sortTypes[seg.selectedSegmentIndex], timeFilterWithin:.All, completion: { (result) in
    switch result {
    case .failure(let error):
        print(error)
    case .success(let listing):
        self.links.appendContentsOf(listing.children.flatMap{$0 as? Link})
    }
})

仅应用 OAuth

当您想编写测试或个人脚本工具(如 CLI)的代码时,可以使用 OAuth2AppOnlyTokenOAuth2AppOnlyToken 启用访问而不需要人类操作,以便在网页浏览器应用程序中授权。出于安全考虑,请不要在已安装的应用程序中使用 Oauth2AppOnlyToken

OAuth2AppOnlyToken.getOAuth2AppOnlyToken(
    username: username,
    password: password,
    clientID: clientID,
    secret: secret,
    completion:( { (result) -> Void in
    switch result {
    case .failure(let error):
        print(error)
    case .success(let token):
        self.session = Session(token: token)
    }
}))

更多...

更详细的说明,请参阅本存储库中包含的示例应用程序、测试代码或 Playgorund 代码。

Playgorund

您可以在Playground中使用reddift。更详细地,请查看reddift.playground包。在使用之前,您必须将test_config.json文件复制到./reddift.playground/Resources,以便指定用户账户和应用程序信息,因为Playground中的reddift使用“应用程序仅OAuth”。

playground

依赖

许可

MIT许可。