SwiftでTwitterのタイムラインやプロフィール、バナー画像を取得したのでメモ
参考
こちらの記事をめちゃくちゃ参考にさせて頂きました
http://himaratsu.hatenablog.com/entry/twitter/api
やること
- iOSに登録されているアカウントを使用する
- タイムラインの取得
- ユーザの取得
- バナー画像の取得
- ツイートする
サンプルコード
GISTにあげておきました
iOSに登録されているアカウントを選択して、プロフィール画像とバナー画像を表示させるサンプルです
https://gist.github.com/SatoshiKawabata/c73542cb164d0abfe2a1
準備
使用するのはAccounts, Socialのフレームワークです
import Accounts
import Social
アカウントの取得
iOSに登録されているアカウントを取得するメソッドです
コールバックにアカウントの配列が返ってきます
var accountStore:ACAccountStore = ACAccountStore()
var twAccount: ACAccount?
func getAccounts(callback: [ACAccount] -> Void) {
let accountType:ACAccountType = accountStore.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)
accountStore.requestAccessToAccountsWithType(accountType, options: nil) { (granted: Bool, error: NSError?) -> Void in
if error != nil {
print("error! \(error)")
return
}
if !granted {
print("error! Twitterアカウントの利用が許可されていません")
return
}
let accounts = self.accountStore.accountsWithAccountType(accountType) as! [ACAccount]
if accounts.count == 0 {
print("error! 設定画面からアカウントを設定してください")
return
}
print("アカウント取得完了")
callback(accounts)
}
}
リクエストメソッド
リクエストを送るメソッドを汎用化します
コールバックにレスポンスデータが入ってきます
func sendRequest(url: NSURL, requestMethod: SLRequestMethod, params: AnyObject?, responseHandler: (responseData: NSData!, urlResponse: NSHTTPURLResponse!) -> Void) {
let request:SLRequest = SLRequest(
forServiceType: SLServiceTypeTwitter,
requestMethod: requestMethod,
URL: url,
parameters: params as? [NSObject : AnyObject]
)
request.account = twAccount
request.performRequestWithHandler { (responseData: NSData!, urlResponse: NSHTTPURLResponse!, error: NSError!) -> Void in
if error != nil {
print("error is \(error)")
} else {
responseHandler(responseData: responseData, urlResponse: urlResponse)
}
}
}
タイムラインの取得
先ほどのリクエストメソッドを使ってタイムラインの取得リクエストを送ります
コールバックにタイムラインのデータが返ってきます
Twitter APIのページ
https://dev.twitter.com/rest/reference/get/statuses/user_timeline
func getTimeline(callbabk: NSMutableArray -> Void) {
let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/statuses/user_timeline.json")!
sendRequest(url, requestMethod: .GET, params: nil) { (responseData, urlResponse) -> Void in
do {
let result:NSMutableArray = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as! NSMutableArray
callbabk(result)
} catch {
print("エラーが発生しました")
}
}
}
ユーザ情報の取得
ユーザ情報の取得リクエストを送ります
コールバックにユーザ情報が返ってきます
Twitter APIのページ
https://dev.twitter.com/rest/reference/get/users/show
// ユーザの情報を取得
func getUser(callback: NSMutableDictionary -> Void) {
let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/users/show.json")!
let params = ["screen_name" : (twAccount?.username)!]
sendRequest(url, requestMethod: .GET, params: params) { (responseData, urlResponse) -> Void in
do {
let result:NSMutableDictionary = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as! NSMutableDictionary
callback(result)
} catch {
print("エラーが発生しました")
}
}
}
バナー画像の取得
バナー画像の情報を取得します
コールバックにバナー画像の各種URLが返ってきます
Twitter APIのページ
https://dev.twitter.com/rest/reference/get/users/profile_banner
func getBanner(callback: NSMutableDictionary -> Void) {
let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/users/profile_banner.json")!
let params = ["screen_name" : (twAccount?.username)!]
sendRequest(url, requestMethod: .GET, params: params) { (responseData, urlResponse) -> Void in
do {
let result: NSMutableDictionary = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as! NSMutableDictionary
callback(result)
} catch {
print("エラーが発生しました")
}
}
}
ツイートする
引数にツイートしたい文字列を渡せばツイートします
Twitter APIのページ
https://dev.twitter.com/rest/reference/post/statuses/update
// 投稿
func postTweet(msg:String) {
let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/statuses/update.json")!
let params = ["status" : msg]
sendRequest(url, requestMethod: .POST, params: params) { (responseData, urlResponse) -> Void in
// 投稿完了ハンドラ
print(responseData)
}
}