はじめに

前回はTwitter APIを利用してアカウント取得を行いました。今回はTwitter APIを利用してつぶやくプログラムを作成します。

まずはTwitter APIでつぶやく前に以下の記事を参考にして画面レイアウトの設定、Twitterアカウント取得を行うプログラムを作成してください。

Twitter APIを利用してつぶやく(その1) – 実践!Swiftプログラミング3

Twitterアカウント取得を行わないとつぶやくことはできないので注意してください。

ツイートする

Twitter APIのツイートするAPIの仕様について

Twitter APIのツイートするAPIの仕様は下記のようになっています。Twitterでツイートするためには下記の仕様にしたがってHTTPリクエストを行うプログラムを記述する必要があります。

POST statuses/update – ツイートを投稿する

 

ツイートするには最低限以下を設定してHTTPリクエストを行います。

  • HTTPリクエストURL: https://api.twitter.com/1.1/statuses/update.json
  • POSTメソッドを使用する
  • パラメータ「status」は必須。パラメータ「status」:ツイートする内容を設定する
  • 取得したTwitterアカウントのデータを渡す

また、ツイート成功時にJSONデータで結果が返って来ますが、このデータは使用しないので今回はデバッグエリアにJSONデータを表示させるだけにします。

JSONってなにもの?

 

ツイートするプログラム

Twitterアカウント取得処理ができたら次は上記の仕様にしたがって、Buttonをタップした時にTextViewの内容をツイートするようにプログラミングしましょう!

Buttonをタップした時につぶやくプログラムは以下のようになります。関数「postTweet」をButtonをタップした時に呼び出して処理しています。

//Button押下時にTwitterに投稿する
@IBAction func TouchTweet(sender: AnyObject) {
    postTweet()
}
// ツイートを投稿
private func postTweet() {

    let URL = NSURL(string: "https://api.twitter.com/1.1/statuses/update.json")
        
    // ツイートしたい文章をセット
    let params = ["status" : myTextView.text]
        
    // リクエストを生成
    let request = SLRequest(forServiceType: SLServiceTypeTwitter,
        requestMethod: .POST,
        URL: URL,
        parameters: params)
        
    // 取得したアカウントをセット
    request.account = twitterAccount
        
    // APIコールを実行
    request.performRequestWithHandler { (responseData, urlResponse, error) -> Void in
            
        if error != nil {
            print("error is \(error)")
        }
        else {
            // 結果の表示
            do {
                let result = try NSJSONSerialization.JSONObjectWithData(responseData,
                options: .AllowFragments) as! NSDictionary
                    
                print("result is \(result)")

            } catch {
                return
            }
        }
    }
}

 

上記のプログラムについて解説します。まずは以下の仕様にしたがって、HTTPリクエストURLを設定します。

  • HTTPリクエストURL: https://api.twitter.com/1.1/statuses/update.json
    let URL = NSURL(string: "https://api.twitter.com/1.1/statuses/update.json")

 

次につぶやきたい文章をTextViewから取得します。ディクショナリの定数を使用してパラメータを設定します。

  • パラメータ「status」は必須。パラメータ「status」:ツイートする内容を設定する
    // ツイートしたい文章をセット
    let params = ["status" : myTextView.text]

 

「SLRequest」クラスを使ってつぶやきます。第1引数にTwitterでつぶやくので定数「SLServiceTyepTwitter」を指定、第2引数にPOSTメソッドを指定します。

  • POSTメソッドを使用する

第3引数、第4引数に上記で設定したURLとパラメータを指定します。

    // リクエストを生成
    let request = SLRequest(forServiceType: SLServiceTypeTwitter,
        requestMethod: .POST,
        URL: URL,
        parameters: params)

 

前回で取得したTwitterアカウントを設定します。

  • 取得したTwitterアカウントのデータを渡す
    // 取得したアカウントをセット
    request.account = twitterAccount

 

上記までのプログラムで最低限の設定はできたので、performRequestWithHandlerメソッドでTwitterでつぶやきます。

処理が完了すると変数responsData、urlResponse、errorが返ってきて正常につぶやけたのか?何らかの理由で失敗したのか?これらの変数でわかりますのでチェックを行っています。

エラーが発生した場合はエラーメッセージを、正常につぶやけた場合は返ってきたJSONデータをデバッグエリアに表示させています。

        // APIコールを実行
        request.performRequestWithHandler { (responseData, urlResponse, error) -> Void in
            
            if error != nil {
                print("error is \(error)")
            }
            else {
                // 結果の表示
                do {
                    let result = try NSJSONSerialization.JSONObjectWithData(responseData,
                    options: .AllowFragments) as! NSDictionary
                    
                    print("result is \(result)")

                } catch {
                    return
                }
            }
        }

 

プログラムを実行してみる

上記のプログラムを実行すると、以下のようになります。つぶやきたいTwitterアカウントを選択して…

Simulator Screen Shot 2015.12.30 15.34.34

 

TextViewにつぶやきたいテキストを入力してTweetボタンを押すと…

Simulator Screen Shot 2015.12.30 15.34.57

 

Twitterにつぶやくことができました!お疲れ様でした!

スクリーンショット 2015-12-30 15.35.31

 

まとめ

前回とあわせてTwitterのプログラムを解説しました。次回はタイムライン取得のプログラムを解説します!

参考にTwitterアカウント取得とツイートする全プログラムを以下に記述します。

「ViewController.swift」

import UIKit
import Accounts     //Twitterアカウント認証する場合にインポートします
import Social       //Twitterの各機能を利用する場合にインポートします

class ViewController: UIViewController {
    
    @IBOutlet weak var myTextView: UITextView!

    var accountStore = ACAccountStore() //Twitter、Facebookなどの認証を行うクラス
    var twitterAccount: ACAccount?      //Twitterのアカウントデータを格納する
    
    override func viewDidLoad() {
        super.viewDidLoad()

        //アプリ実行時にTwitter認証を行うアカウントデータを取得する
        getTwitterAccount()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //Button押下時にTwitterに投稿する
    @IBAction func TouchTweet(sender: AnyObject) {
        postTweet()
    }

    
    //Twitterのアカウント認証を行う
    private func getTwitterAccount() {

        //アカウントを取得するタイプをTwitterに設定する
        let accountType =
            accountStore.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)

        //Twitterのアカウントを取得する
        accountStore.requestAccessToAccountsWithType(accountType, options: nil)
        { (granted:Bool, error:NSError?) -> Void in
                
            if error != nil {
                // エラー処理
                print("error! \(error)")
                return
            }
                
            if !granted {
                print("error! Twitterアカウントの利用が許可されていません")
                return
            }
            
            // Twitterアカウント情報を取得
            let accounts = self.accountStore.accountsWithAccountType(accountType)
                as! [ACAccount]

            if accounts.count == 0 {
                print("error! 設定画面からアカウントを設定してください")
                return
            }
            
            // ActionSheetを表示
            self.selectTwitterAccount(accounts)
        }
    }
    
    private func selectTwitterAccount(accounts: [ACAccount]) {
        
        // ActionSheetのタイトルとメッセージを設定する
        let alert = UIAlertController(title: "Twitter",
            message: "アカウントを選択してください",
            preferredStyle: .ActionSheet)
        
        // アカウント選択のActionSheetを表示するボタン
        for account in accounts {
            alert.addAction(UIAlertAction(title: account.username, style: .Default,
                handler: { (action) -> Void in

                    // 選択したTwitterアカウントのデータを変数に格納する
                    print("your select account is \(account)")
                    self.twitterAccount = account
            }))
        }
        
        // 表示する
        self.presentViewController(alert, animated: true, completion: nil)
    }

    // ツイートを投稿
    private func postTweet() {

        let URL = NSURL(string: "https://api.twitter.com/1.1/statuses/update.json")
        
        // ツイートしたい文章をセット
        let params = ["status" : myTextView.text]
        
        // リクエストを生成
        let request = SLRequest(forServiceType: SLServiceTypeTwitter,
            requestMethod: .POST,
            URL: URL,
            parameters: params)
        
        // 取得したアカウントをセット
        request.account = twitterAccount
        
        // APIコールを実行
        request.performRequestWithHandler { (responseData, urlResponse, error) -> Void in
            
            if error != nil {
                print("error is \(error)")
            }
            else {
                // 結果の表示
                do {
                    let result = try NSJSONSerialization.JSONObjectWithData(responseData,
                    options: .AllowFragments) as! NSDictionary
                    
                    print("result is \(result)")

                } catch {
                    return
                }
            }
        }
    }
}

 

参考サイト

iOSアプリでTwitterのタイムライン取得・ツイート投稿を行う(Accounts.frameworkとSocial.rameworkを使って)

Swift 2を使うとNSJSONSerialization.JSONObjectWithData()でコンパイルエラー ‘Extra argument ‘error’ in call’ が発生する

[Swift] クロージャを利用したコールバックの書き方メモ

 

参考書籍