2016-02-24 155 views
7

我正在写一个简单的测试应用程序,从iOS上传视频到Facebook。分享到Facebook的视频

我发现很难找到关于如何使用Swift执行此操作的示例/教程,因为FacebookSDK的所有文档都在Objective-C中。

我有这个迄今为止放在我的用户界面上的分享按钮,但它看起来禁用,从我读过这是因为没有内容设置,但我不明白这是如何可能的。

let video_content : FBSDKShareVideoContent = FBSDKShareVideoContent() 

    video_content.video = FBSDKShareVideo(videoURL: getVideoURL()) 

    let button : FBSDKShareButton = FBSDKShareButton() 
    button.shareContent = video_content 

    button.frame = CGRectMake((UIScreen.mainScreen().bounds.width - 100) * 0.5, 50, 100, 25) 
    self.view.addSubview(button) 

getVideoURL()函数返回一个肯定包含的URL视频NSURL(我已经打印了安慰,并检查它指向我都存储在一个文件夹前面的视频)。

我看着社会框架和它的耻辱我不能使用它,因为它似乎只用于共享照片和不能共享视频。

我正在使用最新版本的Xcode,Swift和Facebook SDK。

+0

我有完全相同同样的问题和我解决了它! 视频网址应该来自图书馆,而不是您的应用,因此请保存您的视频并从图书馆获取网址。那么它会工作。 – KimCrab

回答

3

@AngryDuck

试试这个代码将工作

func uploadVideoOnFacebook() { 
    var pathURL: NSURL 
    var videoData: NSData 
    pathURL = NSURL(string: self.strUploadVideoURL)! 
    videoData = NSData.dataWithContentsOfURL(NSURL(string: self.strUploadVideoURL)!) 
    NSString * strDesc 
    strDesc = txtCaption.text! 
    var videoObject: [NSObject : AnyObject] = ["title": "application Name", "description": strDesc, pathURL.absoluteString(): videoData] 
    var uploadRequest: FBRequest = FBRequest(graphPath: "me/videos", parameters: videoObject, HTTPMethod: "POST") 
    self.view!.userInteractionEnabled = false 
    uploadRequest.startWithCompletionHandler({(connection: FBRequestConnection, result: AnyObject, error: NSError) -> Void in 
     if !error { 
      NSLog("Success") 
     } 
     else { 
      NSLog("Error") 
     } 
    }) 
} 
1

我已经在目标c中完成了这项工作,并且遇到了类似的问题。不知道这是否会很快适用。

问题是,如果由于某种原因,视频必须存储在NSDocumentDirectoryNSTemporaryDirectory,以便她可以工作。不是,如果这是你的情况。

虽然可以在最坏的情况下FBSDKGraphRequest与/ ME /视频

我来看到的分享,你要使用视频这种方式,直接从照片库中得到的链接使用。正如你在this example

看到目前只有在objective-c例子,我希望这可以帮助你

- (void)uploadVideoWithoutSettingsCredentials:(NSURL *)videoUrl withTitle:(NSString *)title withDesc:(NSString *)desc withPrivacy:(NSString *)privacy 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0), ^{ 
     NSError * error = nil; 

     NSData * videoData = [NSData dataWithContentsOfURL:videoUrl options:0 error:&error]; 
     NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:4L]; 
     [params setObject:videoData forKey:[NSString stringWithFormat:@"%@.MOV",title]]; 
     [params setObject:desc forKey:@"description"]; 

     NSString *privacyString = @"EVERYONE"; 
     if (privacy.length > 0) 
      privacyString = privacy; 

     NSDictionary *privacyDict = [[NSDictionary alloc] initWithObjectsAndKeys: privacyString, @"value", nil]; 
     [params setObject:[Utils objectToJsonString:privacyDict] forKey:@"privacy"]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [[[FBSDKGraphRequest alloc] initWithGraphPath:@"/me/videos" parameters:params HTTPMethod:@"POST"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 

       NSLog(@"RESPONSE!!! /me/videos"); 
       NSLog(@"result %@",result); 
       NSLog(@"error %@",error); 

       dispatch_async(dispatch_get_main_queue(), ^{ 
        if (!error) { 
         [[[UIAlertView alloc] initWithTitle:@"Success" message:@"Your clip was posted!" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil] show]; 
        } else { 
         [[[UIAlertView alloc] initWithTitle:@"Error!" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil] show]; 
        } 
       }); 
      }]; 
     }); 
    }); 
} 

你可以改变迅速sintax,使用Xcode的自动完成功能。

可以帮助自己的语法迅速一点与this

+0

我试图上传的视频位于文档目录中,但我也有NSURL,我也将它保存到相册中,我尝试过,但仍显示禁用,因为我没有设置任何媒体内容?你有一个与图形请求一起工作的例子吗? – AngryDuck

+0

@AngryDuck我编辑了我的答案 – jose920405

1

我在我的应用程序使用此代码,并能正常工作对我来说。

此代码适用于Objective-C但您可以在将它转换为swift语法后在swift中使用它。

我希望这会帮助你。

尝试下面的代码。

-(void) uploadVideoOnFacebook 
{ 
    NSURL *pathURL; 
    NSData *videoData; 


    pathURL = [NSURL URLWithString:self.strUploadVideoURL]; 
    videoData = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.strUploadVideoURL]]; 

    NSString *strDesc; 
    strDesc = txtCaption.text; 

    NSDictionary *videoObject = @{@"title": @"application Name",@"description": strDesc,[pathURL absoluteString]: videoData}; 
    FBRequest *uploadRequest = [FBRequest requestWithGraphPath:@"me/videos" parameters:videoObject HTTPMethod:@"POST"]; 
    [self.view setUserInteractionEnabled:NO]; 

    [uploadRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
      if (!error) 
       NSLog("Success"); 
      else 
       NSLog("Error"); 
    }]; 
} 
+0

寻找swift如果你可以翻译?谢谢 – AngryDuck

+0

我不能因为我没有在swift语言上做任何项目。 – DJ1

+0

@AngryDuck - 你有没有试过把上面的代码转换成swift? – DJ1

9

转换成快捷3和4: - 试试这个

func uploadVideoOnFacebook() { 
     var pathURL: URL 
     var videoData: Data 
     pathURL = URL(string: "Your video url string")! 
     do { 
      videoData = try Data(contentsOf: URL(string: "Your video url string")!) 
      print(videoData) 
      var strDesc : String 
      strDesc = "" 
      let videoObject: [String : Any] = ["title": "application Name", "description": strDesc, pathURL.absoluteString: videoData] 
      let uploadRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/videos", parameters: videoObject, httpMethod: "POST") 
      self.view!.isUserInteractionEnabled = false 
      uploadRequest.start(completionHandler: {(connection: FBSDKGraphRequestConnection, result: AnyObject, error: NSError) -> Void in 
       if error == error { 
        NSLog("Error") 

       } 
       else { 
        NSLog("Success") 
       } 
      } as! FBSDKGraphRequestHandler) 
     } catch { 
      print(error) 
     } 

    } 
+0

如何附加place/placeId? –

+0

我收到两个错误“使用未声明的类型'FBSDKGraphRequest'”和“使用未声明的类型'FBSDKGraphRequestConnection'” – VagueExplanation