2011-03-18 155 views
9

我一直在這個工作了幾天,現在似乎無法在任何地方找到直接的答案或例子。我正嘗試從iPhone應用程序中將視頻上傳到Facebook。我可以連接到Facebook(並上傳了圖片),而無需使用一個問題:iPhone Facebook的視頻上傳

_facebook = [[Facebook alloc] initWithAppId:kAppID]; 
_permissions = [[NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil] retain]; 
[_facebook authorize:_permissions delegate:self]; 

但是我似乎無法讓我的視頻上傳工作。我當前的代碼是:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"TestMovie" ofType:@"mp4"]; 
NSData *data = [NSData dataWithContentsOfFile:filePath]; 

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           data, @"video", 
           nil, @"callback", 
           @"test", @"title", 
           @"upload testing", @"description", 
           @"EVERYONE", @"privacy", 
           nil]; 

[_facebook requestWithMethodName:@"video.upload" 
         andParams:params 
        andHttpMethod:@"POST" 
        andDelegate:self]; 

而且由於視頻上傳呼叫具有不同的服務器來進行,我改變了restserver網址facebook.m文件內:

static NSString* kRestserverBaseURL = @"https://api-video.facebook.com/method/"; 

當我運行這個上傳崩潰的錯誤:

facebookErrDomain err 353. 

任何幫助,將不勝感激。

編輯:

隨着Zoul的幫助下,我現在已經實現了下面的代碼(我沒有做什麼改變了他上傳類也不附帶的SDK版本)。該請求不會再出現錯誤,但不會上傳任何內容。

我初始化Facebook的對象和上傳對象:

- (void)fbDidLogin{ 
    _upload.accessToken = _facebook.accessToken; 
    _upload.apiKey = kApiKey; 
    _upload.appSecret = kApiSecret; 

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"mp4"]; 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 
    NSData *data = [NSData dataWithContentsOfFile:filePath]; 

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           data, @"", 
           @"test", @"title", 
           @"upload testing", @"description", 
           @"EVERYONE", @"privacy", 
           nil]; 

    [_upload startUploadWithURL:fileURL params:params delegate:self]; 
} 
+0

我不能添加該代碼,在我的Facebook-IOS-SDK FBVideoUpload類是不存在的..你能幫幫我 – 2011-04-05 06:23:12

+0

現在我得到錯誤'無法從訪問令牌檢索會話密鑰.' – 2011-04-05 07:35:07

+0

但我的更新提取好了在這種情況下沒有會話錯誤 – 2011-04-05 07:43:58

回答

10

我在GitHub的Facebook SDK中有一個video upload branch。我幾個星期沒有碰它,但它曾經工作得很好(只需要舊式認證,見this branch)。 FBVideoUpload class header中有一些評論,但界面幾乎不言自明。在我的pull request下面還有一些有用的討論 - 特別是關於api-video羣集上的SSL證書的事情,這可能會使整個問題更容易些,但我沒有審查代碼。

[Rant:可惜Facebook的iOS SDK並沒有在GitHub上茁壯成長。有很多拉請求,但官方開發人員似乎從來沒有合併任何東西,甚至沒有在文檔中錯誤的拼寫錯誤。大多數時候拉請求只是坐在那裏,直到被拒絕。]

是的,我提到視頻上傳代碼是一個混亂的黑客?視頻上傳代碼是一個混亂的黑客。它解析了一些認證令牌,並且很快就會中斷,但這是我當時唯一可以做到的唯一方法。


更新:視頻上傳分支也沒有了,你現在可以輕鬆地使用官方的SDK上傳視頻:

NSData *videoData = [NSData dataWithContentsOfURL:movieURL]; 
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    …, @"title", 
    …, @"description", 
    …, @"file", 
    videoData, @"clip.mov", 
    nil]; 
[facebook requestWithGraphPath:@"me/videos" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

這是「正確的方式去做」™,以前的解決方案只是一個臨時攻擊。

+0

謝謝你的迴應zoul。我現在就給這個鏡頭看看它是怎麼回事。 – 2011-03-22 13:19:42

+0

@zoul - 我已經使用您的Facebook IOS SDK版本實現了您的FBVideoUpload類。雖然我不再有任何錯誤(通過NSLog我知道請求確實達到了didLoad方法),但我在facebook上沒有收到任何信息。任何想法?我會將我目前的代碼添加到我的問題中。 – 2011-03-22 17:57:56

+0

我剛剛嘗試使用視頻上傳代碼的應用程序,它可以正常工作。嘗試擺脫'data'參數,這裏不需要。你確定請求成功嗎?服務器的迴應是什麼? – zoul 2011-03-22 18:56:10

0

你嘗試把它發送到電子郵件如Facebook sugested:

_facebook = [[Facebook alloc] initWithAppId:kAppID]; 
_permissions = [NSArray arrayWithObjects:@"publish_stream", @"offline_access",nil]; 
[_facebook authorize:_permissions delegate:self]; 
_upload = [[FBVideoUpload alloc] init]; 

然後,我用它一旦Facebook在已經登錄在http://www.facebook.com/help/?faq=12345 您可以使用電子郵件主題設置視頻的標題。

+0

因爲據我所知,沒有辦法提取用戶的個人上傳來自Facebook圖表API的電子郵件地址。如果這是一個非常簡單的解決方案。 – 2011-03-22 14:48:14

2

您可以使用新的圖形API上傳視頻:

  • 用我/作爲圖形路徑視頻
  • 添加user_videos許可,您的應用程序
  • 設置文件名匹配在POST請求的文件的擴展名(後內容處置:)

您可以使用此叉https://github.com/johnmph/facebook-ios-sdk,有一個PARAM字典這樣的:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:movieData, @"source", @"File.mov", @"filename", nil]; 
[m_facebook requestWithGraphPath:@"me/videos" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

我也加入到這個叉追蹤上傳狀態(通過例如用進度條使用)

+0

John我認爲你已經成功地使用圖形API上傳視頻了嗎?你會如此友善地分享一些示例代碼? – 2011-05-10 14:02:14

+0

只需使用上面提到的fork的代碼,m_facebook是已經授權的Facebook對象(具有user_videos權限),movieData是您想要上傳的視頻的原始數據。 – Johnmph 2011-05-11 14:20:39

0

其實一切,這是值得一提,以保持眼睛在Facebook上的各種工程博客的方法。這是一個從2011年10月日,因此不存在「當前」 SDK: http://developers.facebook.com/blog/post/532/

但是,如果修改了包ID,URL模式添加到plist中,並添加您自己的App樣本仍然有效ID的視圖控制器:

enter image description here

這是最有用的信息我已經在視頻上傳發現 - 我不知道爲什麼Facebook的掩蓋這個從他們的主要SDK文檔了!它奇怪的是沒有在任何地方的聯繫,我不得不做一些挖掘周圍...

2
- (void)viewDidLoad 
{ 
    facebook = [[Facebook alloc] initWithAppId:@"276907032339239"]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
- (IBAction)buttonClicked:(id)sender 
{ 
    NSArray* permissions = [[NSArray alloc] initWithObjects: 
          @"publish_stream", nil]; 
    [facebook authorize:permissions delegate:self]; 
    [permissions release]; 
} 
- (void)fbDidLogin 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mov"]; 
    NSData *videoData = [NSData dataWithContentsOfFile:filePath]; 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            videoData, @"video.mov", 
            @"video/quicktime", @"contentType", 
            @"Video Test Title", @"title", 
            @"Video Test Description", @"description", 
            nil]; 
    [facebook requestWithGraphPath:@"me/videos" 
         andParams:params 
        andHttpMethod:@"POST" 
         andDelegate:self]; 
    NSLog(@"hiiiiiiiii"); 

} 

-(void)fbDidNotLogin:(BOOL)cancelled 
{ 

    NSLog(@"did not login"); 

} 

- (void)request:(FBRequest *)request didLoad:(id)result 
{ 
    if ([result isKindOfClass:[NSArray class]]) 
    { 
     result = [result objectAtIndex:0]; 
    } 
    NSLog(@"Result of API call: %@", result); 
} 

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"Failed with error: %@", [error localizedDescription]); 
}