はじめに
前回は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データを表示させるだけにします。
ツイートするプログラム
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アカウントを選択して…
TextViewにつぶやきたいテキストを入力してTweetボタンを押すと…
Twitterにつぶやくことができました!お疲れ様でした!
まとめ
前回とあわせて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] クロージャを利用したコールバックの書き方メモ
参考書籍
詳細!Swift 2 iPhoneアプリ開発入門ノート [ 大重美幸 ] |
現場ですぐに使える!Swift逆引き大全555の極意 [ 増田智明 ] |