Обмен видео через PHAsset - PullRequest
       81

Обмен видео через PHAsset

0 голосов
/ 19 марта 2020

Справочная информация:

У меня есть приложение, написанное на реагирующем языке, которое использует пакет 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;
            }
        }     
    }
} 
...
...