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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

2601閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/15 06:31

編集2016/07/15 08:13

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

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

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

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

lang

1func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo: [String: AnyObject]) { 2 3 if didFinishPickingMediaWithInfo[UIImagePickerControllerOriginalImage] != nil { 4 5 self.mediaImage.image = didFinishPickingMediaWithInfo[UIImagePickerControllerOriginalImage] as? UIImage 6 self.imageData = UIImageJPEGRepresentation(self.mediaImage.image!, 1.0)! 7 } 8 9 picker.dismissViewControllerAnimated(true, completion: nil) 10 } 11 12 func mediaUpload(){ 13 let im: String = imageData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 14 15 let url = NSURL(string: "https://upload.twitter.com/1.1/media/upload.json?media_data=\(im)") 16 17 let request = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, URL: url, parameters: nil) 18 request.account = twAccount 19 UIApplication.sharedApplication().networkActivityIndicatorVisible = true 20 21 request.performRequestWithHandler { (responseData, urlResponse, error) -> Void in 22 UIApplication.sharedApplication().networkActivityIndicatorVisible = false 23 24 if error != nil { 25 print("error is \(error)") 26 } 27 else { 28 do { 29 if let dic = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as? NSDictionary { 30 if let err = dic["errors"] as? NSArray { 31 32 let msgs = err[0] as! Dictionary<String,AnyObject> 33 let msg = msgs["message"] as! String 34 35 self.showAlert("Error", message: msg, btnText: "OK") 36 } else { 37 38 self.mediaId = dic["media_id_string"] as? String 39 40 } 41 } 42 } catch { 43 print("er") 44 } 45 } 46 } 47 48 }

追記

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=

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/15 08:25

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

回答2

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メソッドのリクエストボディにマルチパートデータとして追加してくれるところまで、面倒な処理を全部やってくれるのだと思います。

投稿2016/07/15 08:32

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

swift

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

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

投稿2016/07/15 07:27

編集2016/07/15 07:47
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/15 07:31

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

2016/07/15 07:41

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

2016/07/15 07:47

回答を修正しました。
退会済みユーザー

退会済みユーザー

2016/07/15 08:06 編集

改行されなくなり、無事リクエストが通りました! しかし、次はtry catchで捕まります。。。 エラー表示の件は先ほど解決したのでコメントを編集しました! エラー内容はNo value.です。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問