質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

【Swift】twitterへの画像投稿について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,013
退会済みユーザー

退会済みユーザー

こんにちわ。
質問内容はタイトルの通りです。

現在Social.frameworkを使いTwitterのクライアントを作成しています。
そこでAPIであるmedia/uploadを用いて画像をアップロードし、states/createで画像付ツイートを行えるよう機能追加を行っているのですが、media/uploadの部分でエラーが発生してしまいます。

以下、一部のソースとなります。
冗長なのは言うまでもありませんが、カメラのコレクションを選択後、メディアファイルに対しbase64エンコードを行ってmedia/uploadを呼び出しています。

エラーはunsupported URLの為、base64エンコードがうまくいっていないのかもしれません。
指摘、修正点があればお願いいたします(_ _)

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo: [String: AnyObject]) {

        if didFinishPickingMediaWithInfo[UIImagePickerControllerOriginalImage] != nil {

            self.mediaImage.image = didFinishPickingMediaWithInfo[UIImagePickerControllerOriginalImage] as? UIImage            
            self.imageData = UIImageJPEGRepresentation(self.mediaImage.image!, 1.0)!
        }

        picker.dismissViewControllerAnimated(true, completion: nil)
    }

    func mediaUpload(){
        let im: String = imageData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)

        let url = NSURL(string: "https://upload.twitter.com/1.1/media/upload.json?media_data=\(im)")

        let request = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, URL: url, parameters: nil)
        request.account = twAccount
        UIApplication.sharedApplication().networkActivityIndicatorVisible = true

        request.performRequestWithHandler { (responseData, urlResponse, error) -> Void in
            UIApplication.sharedApplication().networkActivityIndicatorVisible = false

            if error != nil {
                print("error is \(error)")
            }
            else {
                do {
                    if let dic = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as? NSDictionary {
                        if let err = dic["errors"] as? NSArray {

                            let msgs = err[0] as! Dictionary<String,AnyObject>
                            let msg = msgs["message"] as! String

                            self.showAlert("Error", message: msg, btnText: "OK")
                        } else {

                            self.mediaId = dic["media_id_string"] as? String

                        }
                    }
                } catch {
                    print("er")
                }
            }
        }

    }

追記

imの出力の一部を記載します。

.
.
.
gbR9s0JljtmUnB29OBn8+vtx+XFeRiHdSerbX3em1lb17eR6zqp6c3S+2/5P8LadLs5LXUDXBYAkFj/AC5
6dfbp7c8t89iUnJ36vtr8tuvnp5XN6MrySvt968mvw1d/XQwh8vG36ZyP6j+v05rhWr19N/6/r0Pdw8E7v
q/K/X/Gt7vp94u49BwPQD+tYVZ8rcX07P8A4DVvL3vVHrUYqNltp33f4etl+O5A7Nzxjg8dc/j/AJ/SsIx
cpXSdr3/H5ff07PRHVC1pX002Xo9tr/d9xQnaSVDFFHuc8f8A1/X/AMdGOvoG9LD0JSaVrp/Jfk1t5u610
tynLXt06231/K1tn306K9zk7/wX4ju8yx2pZWyRjJAz/wAAz+vtnvXt0KPsk7bPo1bVefu9+2nS1ve8jG0
lKMOmsnvv+Kflpf02Of8A+EB8UBz/AKEePZu3/AMj1xjr6Yr0KSaa9X+X4/h285fPYignrp+X3a+W3vdPU
T/hAfFG44smOM8YP6fIfyz+fFdcN36dv16fdr5WPInQjfpK2v6f0vd13bsnKvJ4D8TqQfsRGB1w3r1OFHP
b368YxXW3zRbV+nn0+V/W2nlYmOGSs9tL72/y69bvXS2jKk3hfWbVT9phK468c/y6jjkDt04y2Jt7FXvZX
uuqvqmra9tHrv2TXMf6Qv8AwQKiaH/gkt+yhGwwyn47ZH1/aW+Mh9+x/wD1dKxl8T/rofOY5JYqql/c/Gn
B+f5/efsPUnIFABQAUAFABQB//9k=
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/07/15 17:19

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • 退会済みユーザー

    退会済みユーザー

    2016/07/15 17:25

    失礼しました、以降は自身で解決したいと思います。
    fuzzballさん回答ありがとうございました!

    キャンセル

回答 2

checkベストアンサー

0

let im: String = imageData!.base64EncodedStringWithOptions([])

改行しているのが原因と思われますので、オプション指定をやめて改行しないようにして下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/15 16:31

    Cannot force unwrap value of non-optional type 'String' というエラーで!を消すように言われてしまいます。。。

    キャンセル

  • 2016/07/15 16:41

    勘違いしていたので削除しました。

    キャンセル

  • 2016/07/15 16:47

    回答を修正しました。

    キャンセル

  • 2016/07/15 17:01 編集

    改行されなくなり、無事リクエストが通りました!
    しかし、次はtry catchで捕まります。。。

    エラー表示の件は先ほど解決したのでコメントを編集しました!
    エラー内容はNo value.です。。。

    キャンセル

0

SLRequestもTwitterのREST APIも使ったことないんですが、少なくとも画像データをbase64でエンコードしたものをURLパラメータに載せるようなことはしないだろう(URLの長さは通常Webサーバーで数Kバイト程度に制限されるケースが多いので、大きなデータをURLパラメータに載せるようなことはしないだろう)と思って、正しい使い方を調べてみました。

swiftじゃなくてObjective-Cのコードですが、
http://dev.classmethod.jp/smartphone/iphone/twitter-post-with-slrequest/
の「SLRequest を使用して画像をアップロードする」のサンプルコードが参考になると思いますので、これをswiftに変換して使用することをお勧めします。

ここに書かれているように、URLは「https://upload.twitter.com/1.1/media/upload.json」であり、
media_dataというURLパラメータはここには付けません。
そして、SLRequestを使ってaddMultipartDataで、base64エンコードする前のNSDataの画像データを指定すればいいだけだと思います。自分でbase64エンコードする必要はありません。
SLRequestのaddMultipartDataを使えば、画像データをbase64に変換した上でPOSTメソッドのリクエストボディにマルチパートデータとして追加してくれるところまで、面倒な処理を全部やってくれるのだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る