Help us understand the problem. What is going on with this article?

SwiftでTwitterのタイムラインなどを取得する

More than 5 years have passed since last update.

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)
    }
}
kwst
Front Engineer
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away