0

グラフに投稿しているだけなので、動画のアップロードに固有のものではないと思いますが、次のコードを使用すると、アップロードが停止することがあります。小さいビデオ(<20MB)はある程度確実に通過しますが、大きいビデオ(50〜200 MB)は失敗することが保証されています。

    NSData *videoData = [NSData dataWithContentsOfFile:video.localURL options:NSDataReadingMappedAlways error:&error];

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               videoData, video.localURL,
                               @"video/quicktime", @"contentType",
                               video.name, @"title",
                               NSLocalizedString(@"Test http://www.apple.com", @"Facebook upload description"), @"description",
                               nil];


FBRequest *request = [FBRequest requestWithGraphPath:@"me/videos" parameters:params HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSLog(@"result: %@, error: %@", result, error);
    [[NSNotificationCenter defaultCenter] postNotificationName:FacbookUploadFinishedNotification object:nil];

}];

アップロードの進行状況に関する通知を受け取るために、FBURLConnectionにパッチを適用しました。

    - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite {

    NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:
                            [NSArray arrayWithObjects:
                              [NSNumber numberWithInt:totalBytesWritten],
                              [NSNumber numberWithInt:totalBytesExpectedToWrite],
                             nil]
                            forKeys:
                            [NSArray arrayWithObjects:
                             @"bytes",
                              @"totalBytes",
                              nil]
    ];


    [[NSNotificationCenter defaultCenter] postNotificationName:FacebookUploadProgressNotification
                                                        object:self
                                                      userInfo:userInfo];



}

私には、Facebookサーバーが応答を停止しているように見えます…didSendBodyDataが呼び出されなくなり、しばらくするとリクエストがタイムアウトします。

FBアプリで同じ動画をアップロードすると機能します…</p>

編集:ああ、このアプリで使用しているFacebookアプリIDがまだ送信されていないことを追加するのを忘れました。リクエストはおそらくいくつかの(信頼性の低い)テストサーバーに送られますか?アップロードされた動画は私のタイムラインに表示されますが…</p>

4

1 に答える 1

6

問題は、Facebookがhttps://graph-video.facebook.comでより長いビデオしか受け入れないことです。SDKはこれを考慮しません。

私のアプリは、3.xSDKに含まれているすべての凝ったものを使用していません。友達の情報とその画像(必要なのはそれだけです)を自分のコードでロードします。3.x SDKのすべての機能を利用する場合、おそらく私のソリューションは機能しません。

これが私がしたことです:

検索パスやフレームワークを含め、以前にインストールしたSDKへのすべての参照をプロジェクトから削除します。まだ追加していない場合は、Accounts.framework、AdSupport.framework、Social.framework、およびlibsqlite3.0.dylibを追加します。

SDKのソースをGitHubからダウンロードします。.zipファイル内に「src」フォルダがあります。プロジェクトディレクトリにフォルダを作成します。「facebook-ios-sdk」などの名前を付けます。サブフォルダ「JSON」を含む「src」フォルダの内容を、新しく作成したフォルダにコピーします。

フォルダをXcodeプロジェクトにドラッグします。含まれているXcodeプロジェクトとプリコンパイル済みヘッダーを削除します。その後、プロジェクトは再び正常にコンパイルされます。動画はアップロードされません。

開けるFBRequestConnection.m

すべての#importsが追加した後の最初の行BOOL bGraphIsVideo = NO;

以下のいくつかの行には、次の行が表示さ れます。次の行を追加します
NSString *const kGraphBaseURL

NSString *const kGraphBaseURLVideo = @"https://graph-video." FB_BASE_URL @"/";

次に、方法を見つけますurlStringForSingleRequest

行の読みを変更する

baseURL = [kGraphBaseURL stringByAppendingString:request.graphPath];

if (bGraphIsVideo)
    baseURL = [kGraphBaseURLVideo stringByAppendingString:request.graphPath];
else
    baseURL = [kGraphBaseURL stringByAppendingString:request.graphPath];

.mファイルに次の静的メソッドを追加します

+ (void)setVideoMode:(BOOL)videoMode {
    bGraphIsVideo = videoMode;
}

…そして.hファイル

+ (void)setVideoMode:(BOOL)videoMode;

次に、コードを更新してビデオファイルを投稿します。

    [FBRequestConnection setVideoMode:YES];
    [FBRequestConnection startWithGraphPath:<Your path>
                                 parameters:<Your params>
                                 HTTPMethod:@"POST"
                          completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                              [FBRequestConnection setVideoMode:NO];

                              if(!error) {
                                  NSLog(@"OK: %@", result);
                              } else
                                  NSLog(@"Error: %@", error.localizedDescription);

                          }];

これは私にとって魅力のように機能します。このテキストの恐ろしいフォーマットはご容赦ください。それは私の最初のものです。

これは間違いなくハックです。私はそれをより良くする方法について議論したくありません。Facebookにビデオファイルをアップロードしたいだけです。それ以上でもそれ以下でもありません。そして、人々がそれに悩んでいるのを見るので、私はそれをする私の方法を共有したいと思います。お役に立てれば。

于 2013-03-31T23:27:44.763 に答える