2015-03-05 9 views

Antwort

36

die assetURL durch die Nutzung der Local der PHAsset erstellen helfen. Beispiel: PHAsset.localidentifier kehrt 91B1C271-C617-49CE-A074-E391BA7F843F/L0/001

nun die 32 ersten Zeichen nehmen Sie die assetURL zu bauen, wie:

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

Sie könnten die Erweiterung ändern JPG auf der UTI des Vermögenswertes abhängig (requestImageDataForAsset kehrt die UTI), aber in meinen Tests scheinen die Erweiterungen der aintURL sowieso ignoriert zu werden.

+0

Gute Eins. Wird diese Beziehung dokumentiert? Wenn nicht, wo/wie hast du das entdeckt? Haben Sie bemerkt, dass die GUID-Zeichenfolgen gleich sind? –

+1

Nicht dokumentiert, sah ich, dass die GUID-Zeichenfolgen die gleichen sind und es sinnvoll ist, da sowohl das PhotoKit als auch die AssetsLibrary mit den gleichen CoreData-Objekten unter der Haube arbeiten - dies ist also nur die UUID des Coredata-Objekts. Ich würde diese Methode lieber private API-Aufrufe verwenden. – holtmann

+0

Nun, Requisiten. Ich werde ein bisschen auf dem grünen Scheck für eine dokumentierte Antwort halten, da das, was ich gefragt habe, aber das hat mich viel erleichtert. Vielen Dank. –

8

Ich wollte in der Lage sein, eine URL für ein Asset zu erhalten. Allerdings habe ich festgestellt, dass die localIdentifier stattdessen persistiert werden kann und verwendet, um die PHAsset wiederherzustellen.

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

(vorher Methode wird verworfen ...)

-

:

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

Legacy-Asset-URLs können mit umgewandelt werden (Danke holtmannlocalIdentifier ist versteckt in PHObject.)

+2

Was Sie sagen, kann wahr sein, aber es scheint nur schräg mit der tatsächlichen (ich dachte, klar angegeben) Frage verbunden. –

+0

@Clay Bridges Wahr. Ich glaube, ich hatte eine Erkenntnis, die mir half, mein Problem zu lösen, und fügte eine Antwort hinzu, ohne die Frage noch einmal zu überprüfen. Es tut uns leid. – Matt

+2

Ich finde das Erstellen einer separaten selbst beantworteten Frage ein besseres Format für solche Realisierungen, die Sie machen. Ich habe es sehr oft getan, und trotz allem, was sie dir erzählen, sind sie noch nicht erblindet. :) Sie können sogar auf diese Frage verlinken. –

-1

Gemäß der Erörterung von holtmann & & Ton Bridges, getan ich den Link wie folgt anhängt, ist diese vor Antwort, aber für Zeitersparnis ich es schreiben wieder

upvote Hierlink

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

Dies funktioniert im Allgemeinen nicht. Nur für JPG –

+0

@PredragManojlovic welchen Fehler Sie konfrontiert sind? –

+0

Autor erfordern eine Lösung, die für alle Formate funktioniert. Dieser setzt JPG als Erweiterung voraus. –

0

Hier arbeitet Code getestet auf iOS 11 Simulator und Gerät

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"); 
      } 
     }]; 
    }];