2013-10-25 143 views
3

我写了如下代码,其中文件存在于资源中。它不是空的。如何在Facebook SDK中分享视频?

我成功添加图片,但卡在视频中。

-(void)uploadVideo { 

    NSLog(@"UPload Videio "); 

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"abc" ofType:@"mp4"]; 

    NSError *error = nil; 


    NSData *data = [NSData dataWithContentsOfFile:filePath options:NSDataReadingUncached error:&error]; 

    if(data == nil && error!=nil) { 
     //Print error description 

     NSLog(@"error is %@", [error description]); 
    } 

    NSLog(@"data is %@", data); 

    NSDictionary *parameters = [NSDictionary dictionaryWithObject:data forKey:@"sample.mov"]; 

    if (FBSession.activeSession.isOpen) { 


     [FBRequestConnection startWithGraphPath:@"me/videos" 
            parameters:parameters 
            HTTPMethod:@"POST" 
           completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
           // [FBRequestConnection setVideoMode:NO]; 

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

           }]; 

    } else { 

     // We don't have an active session in this app, so lets open a new 
     // facebook session with the appropriate permissions! 

     // Firstly, construct a permission array. 
     // you can find more "permissions strings" at http://developers.facebook.com/docs/authentication/permissions/ 
     // In this example, we will just request a publish_stream which is required to publish status or photos. 

     NSArray *permissions = [[NSArray alloc] initWithObjects: 
           @"publish_stream", 
           nil]; 
     //[self controlStatusUsable:NO]; 
     // OPEN Session! 
     [FBSession openActiveSessionWithPermissions:permissions 
             allowLoginUI:YES 
            completionHandler:^(FBSession *session, 
                 FBSessionState status, 
                 NSError *error) { 
             // if login fails for any reason, we alert 
             if (error) { 

              // show error to user. 

             } else if (FB_ISSESSIONOPENWITHSTATE(status)) { 

              // no error, so we proceed with requesting user details of current facebook session. 


              [FBRequestConnection startWithGraphPath:@"me/videos" 
                     parameters:parameters 
                     HTTPMethod:@"POST" 
                   completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
                    // [FBRequestConnection setVideoMode:NO]; 

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

                   }]; 





              //[self promptUserWithAccountNameForUploadPhoto]; 
             } 
             // [self controlStatusUsable:YES]; 
            }]; 
    } 

} 

作为回报,我得到错误的

The operation couldn’t be completed. (com.facebook.sdk error 5.) 

如何上传视频,使用Facebook的iOS SDK的Facebook?

感谢

+0

检查FB推荐的视频格式。 – user1673099

+0

从哪里,你只能通过链接? – Duaan

+0

https://www.facebook.com/help/www/218673814818907他们推荐mp4。 – opedge

回答

0

建议:

我认为这可能是一个权限问题,但我不知道被抛出错误的位置。将抛出的委托方法不会显示在您的代码中。我认为将您的代码与此sample中的步骤进行协调可能会有所帮助;如果是这样,请接受答案。

样品的一些关键方面:

权限:

- (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]; 
} 

请求didLoad委托方法:

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

请求didFail委托方法:

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

Facebook的视频权限Link

-1

你问前publish_stream许可?

+0

该权限已被替换为'publish_actions',请删除这个答案/问题进行检查。 –

3

以下是将视频上传到Facebook的方法。此代码正在测试和100%工作。

ACAccountStore *accountStore = [[ACAccountStore alloc] init]; 

ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

// Specify App ID and permissions 
NSDictionary *options = @{ACFacebookAppIdKey: FACEBOOK_ID, 
          ACFacebookPermissionsKey: @[@"publish_stream", @"video_upload"], 
          ACFacebookAudienceKey: ACFacebookAudienceFriends}; // basic read permissions 

[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *e) { 
    if (granted) { 
     NSArray *accountsArray = [accountStore accountsWithAccountType:facebookAccountType]; 

     if ([accountsArray count] > 0) { 
      ACAccount *facebookAccount = [accountsArray objectAtIndex:0]; 


      NSDictionary *parameters = @{@"description": aMessage}; 


      SLRequest *facebookRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook 
                  requestMethod:SLRequestMethodPOST 
                     URL:[NSURL URLWithString:@"https://graph.facebook.com/me/videos"] 
                   parameters:parameters]; 

      [facebookRequest addMultipartData: aVideo 
            withName:@"source" 
             type:@"video/mp4" 
            filename:@"video.mov"]; 

      facebookRequest.account = facebookAccount; 


      [facebookRequest performRequestWithHandler:^(NSData* responseData, NSHTTPURLResponse* urlResponse, NSError* error) { 
       if (error == nil) { 
        NSLog(@"responedata:%@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]); 
       }else{ 
        NSLog(@"%@",error.description); 
       } 
      }]; 
     } 
    } else { 
     NSLog(@"Access Denied"); 
     NSLog(@"[%@]",[e localizedDescription]); 
    } 
}]; 
+1

“publish_stream”和“video_upload”都不存在了。 –

0

该代码已成功测试了FaceBook SDK 3.14.1

建议:在的.plist

集FacebookAppID,FacebookDisplayName,
URL类型 - >项目0-> URL方案设置成facebookappId前缀为fb

-(void)shareOnFaceBook 
{ 
    //sample_video.mov is the name of file 
    NSString *filePathOfVideo = [[NSBundle mainBundle] pathForResource:@"sample_video" ofType:@"mov"]; 

    NSLog(@"Path Of Video is %@", filePathOfVideo); 
    NSData *videoData = [NSData dataWithContentsOfFile:filePathOfVideo]; 
    //you can use dataWithContentsOfURL if you have a Url of video file 
    //NSData *videoData = [NSData dataWithContentsOfURL:shareURL]; 
    //NSLog(@"data is :%@",videoData); 
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           videoData, @"video.mov", 
           @"video/quicktime", @"contentType", 
           @"Video name ", @"name", 
           @"description of Video", @"description", 
           nil]; 

    if (FBSession.activeSession.isOpen) 
    { 
     [FBRequestConnection startWithGraphPath:@"me/videos" 
           parameters:params 
           HTTPMethod:@"POST" 
          completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
           if(!error) 
           { 
            NSLog(@"RESULT: %@", result); 
            [self throwAlertWithTitle:@"Success" message:@"Video uploaded"]; 
           } 
           else 
           { 
            NSLog(@"ERROR: %@", error.localizedDescription); 
            [self throwAlertWithTitle:@"Denied" message:@"Try Again"]; 
           } 
          }]; 
    } 
    else 
    { 
     NSArray *permissions = [[NSArray alloc] initWithObjects: 
          @"publish_actions", 
          nil]; 
     // OPEN Session! 
     [FBSession openActiveSessionWithPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone allowLoginUI:YES 
            completionHandler:^(FBSession *session, 
                 FBSessionState status, 
                 NSError *error) { 
             if (error) 
             { 
              NSLog(@"Login fail :%@",error); 
             } 
             else if (FB_ISSESSIONOPENWITHSTATE(status)) 
             { 
              [FBRequestConnection startWithGraphPath:@"me/videos" 
                      parameters:params 
                      HTTPMethod:@"POST" 
                    completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
                     if(!error) 
                     { 
                      [self throwAlertWithTitle:@"Success" message:@"Video uploaded"]; 

                      NSLog(@"RESULT: %@", result); 
                     } 
                     else 
                     { 
                      [self throwAlertWithTitle:@"Denied" message:@"Try Again"]; 

                      NSLog(@"ERROR: %@", error.localizedDescription); 
                     } 

                    }]; 
             } 
            }]; 
     } 
} 

,我得到了错误:

The operation couldn’t be completed. (com.facebook.sdk error 5.) 

被inited的Facebook时,它发生。下次我打开我的应用程序,它工作正常,它总是第一次。尝试了应用程序中的所有内容,但似乎在Facebook SDK一侧。

几个原因看到com.facebook.sdk error 5

  • 会议是不开放的。验证。
  • Facebook检测到您发送垃圾邮件。更改视频名称。
  • Facebook使用SDK定义了一个限制。尝试不同的应用程序。