Reputation: 71
I Need to share a video on facebook, and have fileURL of this video, but to share I need the asset URL of this video. How can I get the asset URL from a local video without using UIImagePickerViewController?
Upvotes: 0
Views: 977
Reputation: 64
Facebook SDK requires asset URL, so you have to pass your video file to asset library and get the new url from it. The complete code look like:
NSURL *_videoURL = [URL to local video file];
//initilize the asset library object and define the completion block
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
ALAssetsLibraryWriteVideoCompletionBlock videoWriteCompletionBlock =
^(NSURL *newURL, NSError *error) {
if (error) {
NSLog( @"Error writing image with metadata to Photo Library: %@", error );
} else {
NSLog( @"Wrote image with metadata to Photo Library %@", newURL.absoluteString);
//share to facebook when we have new asset URL
FBSDKShareVideo *shareVideo = [[FBSDKShareVideo alloc]init];
shareVideo.videoURL = newURL;
FBSDKShareVideoContent *shareContent = [[FBSDKShareVideoContent alloc] init];
shareContent.video = shareVideo;
[FBSDKShareDialog showFromViewController:self withContent:shareContent delegate:nil];
}
};
//write video file and fire up facebook sharing diaglog when complete
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:_videoURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:_videoURL
completionBlock:videoWriteCompletionBlock];
}
UPDATED (for iOS SDK 9.0+):
NSURL *_videoURL = [URL to local video file];
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *changeRequest= [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:_videoURL];
_videoPlaceHolder= [changeRequest placeholderForCreatedAsset];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (error) {
NSLog( @"Error writing image with metadata to Photo Library: %@", error );
} else {
NSLog( @"Wrote image with metadata to Photo Library %@", [_videoPlaceHolder localIdentifier]);
//example for localidentifier:2BC8A8A8-E974-42D9-AD0F-2F463B353914/L0/001
NSArray *id=[_videoPlaceHolder.localIdentifier componentsSeparatedByString:@"/"];
NSString *path= [NSString stringWithFormat:@"assets-library://asset/asset.MOV?id=%@&ext=MOV",id[0]];
_videoAssetURL = [NSURL URLWithString:path];
dispatch_async(dispatch_get_main_queue(), ^{
//share to facebook
FBSDKShareVideo *shareVideo = [[FBSDKShareVideo alloc]init];
shareVideo.videoURL = _videoAssetURL;
FBSDKShareVideoContent *shareContent = [[FBSDKShareVideoContent alloc] init];
shareContent.video = shareVideo;
[FBSDKShareDialog showFromViewController:self withContent:shareContent delegate:nil];
});
}
}];
Upvotes: 2
Reputation: 683
import FacebookShare
let shareDialog = ShareDialog(content: myContent)
shareDialog.mode = .Native
shareDialog.failsOnInvalidData = true
shareDialog.completion = { result in
// Handle share results
}
try shareDialog.show()
Refer Facebook Developer API for More Detail
https://developers.facebook.com/docs/swift/sharing/share-dialog
Upvotes: 0