Справочная информация:
У меня есть приложение, написанное на реагирующем языке, которое использует пакет react-native-share
. Я разбудил этот пакет, поскольку существует проблема, из-за которой загруженное изображение или видео не будут передаваться с URL-адреса ресурса-заполнителя (например, ph://[media-id]
)
У меня был некоторый частичный успех с код ниже и изображения теперь работают. Видео оказывается немного сложнее. Я могу взять URL-адрес ph://
и получить актив, в результате чего URL-адрес file://
будет работать ТОЛЬКО при совместном использовании через airdrop. URL-адрес разрешается, и я получаю файл MP4 на рабочем столе ... отлично!
Проблема:
Однако, если я пытаюсь поделиться одним и тем же file://
URL-адресом для сообщения или электронной почты, я просто вижу саму ссылку.
Возможное решение:
Я предполагаю, что мне нужно разрешить этот видео актив в объект NSData
в Obj- c и затем отправить файл Я возвращаюсь к компоненту share для обработки (как изображение), но я не слишком хорош в Obj- C, поэтому буду признателен за помощь! Для видео файл всегда является файлом mp4.
Вот мой код: (я передаю ph://
URL-адрес нативной стороне ...)
...
if([URL.scheme.lowercaseString isEqualToString:@"ph"]) {
NSString *assetIdentifier = [urlsArray[i] stringByReplacingOccurrencesOfString: @"ph://" withString: @""];
PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers: @[assetIdentifier] options:nil];
PHAsset *asset = fetchResult.firstObject;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
options.version = PHImageRequestOptionsVersionCurrent;
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
options.resizeMode = PHImageRequestOptionsResizeModeNone;
PHVideoRequestOptions *options2 = [[PHVideoRequestOptions alloc] init];
options2.networkAccessAllowed = YES;
options2.deliveryMode = PHVideoRequestOptionsDeliveryModeHighQualityFormat;
options2.version = PHVideoRequestOptionsVersionCurrent;
NSString __block *url = @"";
if (asset){
switch(asset.mediaType) {
case PHAssetMediaTypeVideo: {
//*** THIS IS THE PROBLEMATIC AREA ***
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options2 resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
AVURLAsset *urlAsset = (AVURLAsset*)asset;
url = [[urlAsset URL] absoluteString];
[items addObject: url]; //items is passed over to the share handler
dispatch_semaphore_signal(semaphore); //added to counter-act the fact requestAVAssetForVideo is asynchronous
}];
break;
}
case PHAssetMediaTypeImage: {
//*** THIS SHARES IMAGES AS EXPECTED ***
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info)
{
[items addObject:imageData]; //items is passed over to the share handler
dispatch_semaphore_signal(semaphore); //added to counter-act the fact requestAVAssetForVideo is asynchronous
}];
break;
}
default: {
RCTLogError(@"Asset type can't be shared");
return;
}
}
}
}
...