2015-03-05 2 views

ответ

36

Создание assetURL за счет использования localidentifier в 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 в зависимости от ИМП актива (requestImageDataForAsset возвращает UTI), но в моем тестировании расширения objectURL, похоже, все равно игнорируются.

+0

Хорошо. Связаны ли эти отношения? Если нет, где/как вы это обнаружили? Вы только заметили, что строки GUID были одинаковыми? –

+1

Не документировано, я видел, что строки GUID одинаковы, и имеет смысл, поскольку и PhotoKit, и AssetsLibrary работают с теми же объектами CoreData под капотом - так что это всего лишь UUID объекта coredata. Я бы предпочел, чтобы этот метод использовал частные вызовы API. – holtmann

+0

Ну, реквизит. Я проведу немного по зеленому чеку за документированный ответ, так как это то, о чем я просил, но это меня сильно облегчило. Большое спасибо. –

8

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

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

URL-адреса Наследство активов могут быть преобразованы с помощью:

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

(до этого метод получает ... устарел)

-

(Спасибо holtmann localIdentifier спрятан в PHObject.)
+2

То, что вы говорите, может быть правдой, но кажется, что оно косвенно связано с фактическим (я думал, четко сформулированным) вопросом. –

+0

@ Клей Мосты Правда. Наверное, я понял, что помог мне решить мою проблему и добавил ответ, не переучивая вопрос. Сожалею. – Matt

+2

Я нахожу создание отдельного самостоятельного ответа на вопрос, лучший формат для любых таких реализаций, которые вы делаете. Я сделал это много, и, несмотря на то, что они говорят вам, еще не ослеп. :) Вы можете даже ссылаться на этот вопрос. –

-1

В соответствии с обсуждением holtmann & & Клей Мосты, я сделал Добавляя ссылку, как это, это заранее ответ, но для экономии времени я отправить его снова

UPVote Здесьlink

PHAsset *asset = self.allPhotos[indexPath.item]; 
    NSLog(@"this is local assets =%@",asset.localIdentifier); 
    NSString *localStr=asset.localIdentifier; 
    NSRange range = [localStr rangeOfString:@"/"]; 
    NSString *newString = [localStr substringToIndex:range.location]; 
    NSString *appendedString=[NSString stringWithFormat:@"%@%@%@",@"assets-library://asset/asset.JPG?id=",newString,@"&ext=JPG"]; 
    name=[NSURL URLWithString:appendedString]; 
+0

Это не работает вообще. Только для JPG –

+0

@PredragManojlovic, с какой ошибкой вы столкнулись? –

+0

Автор требует решения, которое работает для всех форматов. Это предполагает, что JPG является расширением. –

0

Здесь проверяются рабочим код на прошивке 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"); 
      } 
     }]; 
    }]; 
Смежные вопросы