ios8 - Как получить URL-адрес ALAsset от PHAsset?




alassetslibrary photokit (3)

Вот рабочий код, протестированный на iOS 11 как на симуляторе, так и на устройстве

PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
    [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        PHAsset *asset = (PHAsset *)obj;
        [asset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
            NSLog(@"URL:%@",  contentEditingInput.fullSizeImageURL.absoluteString);
            NSString* path = [contentEditingInput.fullSizeImageURL.absoluteString substringFromIndex:7];//screw all the crap of file://
            NSFileManager *fileManager = [NSFileManager defaultManager];
            BOOL isExist = [fileManager fileExistsAtPath:path];
            if (isExist)
                NSLog(@"oh yeah");
            else {
                NSLog(@"damn");
            }
        }];
    }];

Вы можете сделать это незаметно † используя undocumented свойство PHAsset.ALAssetURL , но я ищу что-то задокументированное.

† В Objective-C это поможет

@interface PHAsset (Sneaky)

@property (nonatomic, readonly) NSURL *ALAssetURL;

@end

Создайте assetURL, используя локальный PHAsset . Пример: PHAsset.localidentifier возвращает 91B1C271-C617-49CE-A074-E391BA7F843F/L0/001

Теперь возьмите 32 первых символа для создания assetURL, например:

assets-library://asset/asset.JPG?id=91B1C271-C617-49CE-A074-E391BA7F843F&ext=JPG

Вы можете изменить расширение JPG зависимости от UTI актива ( requestImageDataForAsset возвращает UTI), но в моем тестировании расширения assetURL все равно игнорируются.


Я также хотел получить URL-адрес для ресурса. Тем не менее, я понял, что localIdentifier можно localIdentifier вместо этого и использовать для восстановления PHAsset .

PHAsset* asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil].firstObject;

Устаревшие URL-адреса активов можно преобразовать с помощью:

PHAsset* legacyAsset = [PHAsset fetchAssetsWithALAssetUrls:@[assetUrl] options:nil].firstObject;
NSString* convertedIdentifier = legacyAsset.localIdentifier;

(до того, как этот метод устарел ...)

(Спасибо - localIdentifier скрыт в PHObject .)





phasset