从iOS照片库uri获取base64照片

从iOS照片库uri获取base64照片,ios,objective-c,react-native,Ios,Objective C,React Native,我正在React Native中构建一个应用程序,我需要使用Photouri(例如photos://A2B9B28B-9A3E-4190-BCA0-B11F1E587085/L0/002)。我最初使用的是资产库,但我已经更新了我的应用程序以使用新的照片库,我正在努力让它工作 我的旧资产库方法是: { NSURL *url = [[NSURL alloc] initWithString:input]; ALAssetsLibrary *library = [[ALAssetsLibrary

我正在React Native中构建一个应用程序,我需要使用Photo
uri
(例如
photos://A2B9B28B-9A3E-4190-BCA0-B11F1E587085/L0/002
)。我最初使用的是资产库,但我已经更新了我的应用程序以使用新的照片库,我正在努力让它工作

我的旧资产库方法是:

{
  NSURL *url = [[NSURL alloc] initWithString:input];
  ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
  [library assetForURL:url resultBlock:^(ALAsset *asset) {
    ALAssetRepresentation *rep = [asset defaultRepresentation];
    CGImageRef imageRef = [rep fullScreenImage];
    NSData *imageData = UIImagePNGRepresentation([UIImage imageWithCGImage:imageRef]);
    NSString *base64Encoded = [imageData base64EncodedStringWithOptions:0];
    callback(@[[NSNull null], base64Encoded]);
  } failureBlock:^(NSError *error) {
    NSLog(@"that didn't work %@", error);
    callback(@[error]);
  }];
}

您可以在PHAsset
+(PHFetchResult*)fetchAssetsWithALAssetURLs:(NSArray*)assetURLs选项:(null PHFetchOptions*)选项中看到api

它与您已有的代码基本相同,只是被分为两部分。首先使用id获取
PHAsset
,然后使用
PHImageManager
从该资产获取图像

  • 要从库中获取
    相位集
    ,请使用
[+(PHFetchResult*)fetchAssetsWithALAssetURLs:(NSArray*)资产选项:(可为空的PHFetchOptions*)选项;

此方法是同步的,并立即返回
PHAsset
数组,但这些资源不包含任何图像数据

  • 下次使用
[PHImageManager defaultManager]
获取图像。这与AlassetLibrary方法一样是异步的。使用
-(PHImageRequestID)requestImageDataForAsset:(PHAsset*)资产选项:(PHImageRequestOptions*)选项结果Handler:(void(^)(NSData*imageData,NSString*dataUTI,UIImageOrientation,NSDictionary*info))resultHandler;

代码应该是这样的(显然,您必须为应用程序填写错误代码和错误域):


在获得图像后,您可以将其转换为base 64,因此我将使用它,您只需解决
photos://A2B9B28B-9A3E-4190-BCA0-B11F1E587085/L0/002
NSData
;base64的东西是不相关的,令人困惑的,您是如何获得
photos://A2B9B28B-9A3E-4190-BCA0-B11F1E587085/L0/002
首先?From。正如我在文章中所说,我使用的是React Native,因此目标是将Javascript中的图像作为base64;因此我不确定您如何发现它不相关或令人困惑。
PHFetchResult* results = [PHAsset fetchAssetsWithLocalIdentifiers:@[input] options:nil];
PHAsset *asset = [results firstObject];
if (asset) {
    [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
        if (imageData){
            NSString *base64Encoded = [imageData base64EncodedStringWithOptions:0];
            callback(@[[NSNull null], base64Encoded]);
        }else{
            NSError* error = info[PHImageErrorKey];
            if (!error) {
                error = [NSError errorWithDomain:@"" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"image not found"}];
            }
            callback(nil, error);

        }
    }];
}else{
    NSError* error = [NSError errorWithDomain:@"" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"asset not found"}];
    callback(nil, error);
}