最初: GraphRequest を使用して Facebook に動画をアップロードするには 2 つの方法があるようです。「file_url」パラメーターを使用するもの。URL を指定すると、facebook が外部サーバーからビデオ ファイルをダウンロードします。それは次のようにうまく機能します:
let params = [
"title": "...",
"description": "...",
"file_url": "http://example.com/videofile.mp4"
]
let rq = FBSDKGraphRequest(graphPath: "me/videos", parameters: params, HTTPMethod: "POST")
rq.startWithCompletionHandler { (conn, result, error) -> Void in
// handle error etc..
}
Facebook がサーバーからファイルを読み込み、動画がタイムラインに表示されます。
もう 1 つの方法は、「source」パラメーターを使用して、リクエストでビデオを直接アップロードすることです。次のようになります。
let videoURL = NSURL.fileURLWithPath(NSBundle.mainBundle().pathForResource("testvideo", ofType: "mp4")!)
let rawData = NSData(contentsOfURL: videoURL)!
let params = [
"title": "...",
"description": "...",
"source": rawData
]
ただし、これは次のエラー メッセージで失敗します。
The video you're trying to upload is in a format that isn't supported. Please try again with a video in a supported format.
ドキュメントを見ると、ビデオ データを「multipart/form-data」でエンコードする必要があるようです。ドキュメントにはw3へのリンクも含まれています。
しかし、これをどのように行うかは、私にとってまだ謎です。次のように、バイナリビデオデータを含むフォームデータ文字列を作成する多くの組み合わせを試しました。
var s = ""
s += "Content-Type: multipart/form-data; boundary=XXXXXXXXXXXXXXXXXXXX\r\n\r\n"
s += "--XXXXXXXXXXXXXXXXXXXX\r\n"
s += "Content-Type: application/octet-stream\r\n\r\n"
let p = "--XXXXXXXXXXXXXXXXXXXX--"
let data = NSMutableData()
data.appendData(s.asUTF8Data())
data.appendData(rawData)
data.appendData(p.asUTF8Data())
let params = [
"title": "...",
"description": "...",
"source": data
]
との他の組み合わせ
s += "Content-Transfer-Encoding: binary\r\n"
s += "Content-Disposition: file; filename=\"video.mp4\"\r\n"
しかし、成功せずに。いつも同じエラー メッセージが表示されます。
The video you're trying to upload is in a format that isn't supported. Please try again with a video in a supported format.
では、ビデオ ファイルをフォーム データでラップするにはどうすればよいでしょうか。
念のため: いいえ、残念ながら、FBSDK v4 で既に提供されているビデオ共有機能は使用できません。