Closed jebinwinfy closed 5 years ago
@jebinwinfy The sharing capabilities are currently limited to string/url/image. See: https://github.com/alinz/react-native-share-extension/blob/master/ios/ReactNativeShareExtension.m#L81-L89
This would be a nice feature addition, if you want to submit a PR 😄
I made it with the following,
update "ReactNativeShareExtension.m" file and it will give you thumbnail of video.
NSString *VideoIdentifier;
NSExtensionContext* extensionContext;
@implementation ReactNativeShareExtension { NSTimer autoTimer; NSString type; NSString* value; }
RCT_EXPORT_MODULE();
(void)viewDidLoad { [super viewDidLoad];
//object variable for extension doesn't work for react-native. It must be assign to gloabl //variable extensionContext. in this way, both exported method can touch extensionContext extensionContext = self.extensionContext;
UIView *rootView = [self shareView]; if (rootView.backgroundColor == nil) { rootView.backgroundColor = [[UIColor alloc] initWithRed:1 green:1 blue:1 alpha:0.1]; }
self.view = rootView; }
RCT_EXPORT_METHOD(close) { [extensionContext completeRequestReturningItems:nil completionHandler:nil]; }
RCT_REMAP_METHOD(data, resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { [self extractDataFromContext: extensionContext withCallback:^(NSString val, NSString contentType, NSString thumbnailBase64, NSException err) { if(err) { reject(@"error", err.description, nil); } else { resolve(@{ @"type": contentType, @"value": val, @"thumbnailBase64": thumbnailBase64 }); } }]; }
(void)extractDataFromContext:(NSExtensionContext )context withCallback:(void(^)(NSString value, NSString contentType, NSString thumbnailBase64, NSException exception))callback { @try { NSExtensionItem item = [context.inputItems firstObject]; NSArray *attachments = item.attachments;
__block NSItemProvider *urlProvider = nil;
__block NSItemProvider *imageProvider = nil;
__block NSItemProvider *textProvider = nil;
__block NSItemProvider *videoProvider = nil;
[attachments enumerateObjectsUsingBlock:^(NSItemProvider *provider, NSUInteger idx, BOOL *stop) {
if([provider hasItemConformingToTypeIdentifier:URL_IDENTIFIER]) {
urlProvider = provider;
*stop = YES;
} else if ([provider hasItemConformingToTypeIdentifier:TEXT_IDENTIFIER]){
textProvider = provider;
*stop = YES;
} else if ([provider hasItemConformingToTypeIdentifier:IMAGE_IDENTIFIER]){
imageProvider = provider;
*stop = YES;
} else if ([provider hasItemConformingToTypeIdentifier:VIDEO_IDENTIFIER_MPEG_4]) {
videoProvider = provider;
VideoIdentifier = VIDEO_IDENTIFIER_MPEG_4;
*stop = YES;
} else if([provider hasItemConformingToTypeIdentifier:VIDEO_IDENTIFIER_QUICK_TIME_MOVIE]) {
videoProvider = provider;
VideoIdentifier = VIDEO_IDENTIFIER_QUICK_TIME_MOVIE;
*stop = YES;
}
}];
if(urlProvider) {
[urlProvider loadItemForTypeIdentifier:URL_IDENTIFIER options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
NSURL *url = (NSURL *)item;
if(callback) {
callback([url absoluteString], @"text/plain",nil, nil);
}
}];
} else if (imageProvider) {
[imageProvider loadItemForTypeIdentifier:IMAGE_IDENTIFIER options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
NSURL *url = (NSURL *)item;
if(callback) {
callback([url absoluteString], [[[url absoluteString] pathExtension] lowercaseString], @"", nil);
}
}];
} else if (textProvider) {
[textProvider loadItemForTypeIdentifier:TEXT_IDENTIFIER options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
NSString *text = (NSString *)item;
if(callback) {
callback(text, @"text/plain", nil, nil);
}
}];
}
else if(videoProvider) {
[videoProvider loadItemForTypeIdentifier:VideoIdentifier options:nil completionHandler:^(NSURL *path,NSError *error){
if (path)
{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Path");
if(callback) {
AVAsset *asset = [AVAsset assetWithURL:path];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = CMTimeMake(1, 1);
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
NSString *base64Image = [UIImagePNGRepresentation(thumbnail) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
callback([path absoluteString], [[[path absoluteString] pathExtension] lowercaseString],base64Image, nil);
}
});
}
}];
}
else {
if(callback) {
callback(nil, nil, nil, [NSException exceptionWithName:@"Error" reason:@"couldn't find provider" userInfo:nil]);
}
}
} @catch (NSException *exception) { if(callback) { callback(nil, nil, nil, exception); } } }
@end
Cant share video file through this! If I set 'NSExtensionActivationRule' with 'NSExtensionActivationSupportsMovieWithMaxCount', can't get video url, anybody know this issue???