reddift
reddift 是 Swift Reddit API 包装框架,并使用该框架开发了一个浏览器。
- 支持 OAuth2(目前不在 tvOS 上支持)。
- 支持多账号。
- 包括一个示例应用(仅 iOS)。
浏览器
- 它是典型的 Reddit.com 浏览器。
- 此应用程序使用 "reddift 框架" 来访问 Reddit.com。
- 包括几乎所有功能,如图像缩略图、浏览评论、搜索 subreddits 等。
- 如果您需要更多功能,请向我发送 pull request。
文档
如何搭建
当前正在开发中。请务必注意使用这个库。
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
。
reddift_config.json
3. 设置这个JSON文件将保存应用信息以使用OAuth。将reddift_config.json.sample
重命名为reddift_config.json
。填写DeveloperName
、redirect_uri
和client_id
。redirect_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
。
如何构建测试
1. 注册用户脚本应用
测试使用应用仅OAuth以从测试过程中移除用户交互。如果您想运行reddift的测试,您必须在reddit.com创建另一个“脚本”类型的应用程序(个人用途脚本)。
test_config.json
2. 填写 首先,将 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)的代码时,可以使用 OAuth2AppOnlyToken
。OAuth2AppOnlyToken
启用访问而不需要人类操作,以便在网页浏览器应用程序中授权。出于安全考虑,请不要在已安装的应用程序中使用 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”。
依赖
- reddift依赖MiniKeychain以保存访问令牌。
- 示例应用程序依赖于UZTextView。
许可
MIT许可。