2017-05-04 69 views
9

Dikkat çekmeyen bu kolay soruyla büyük bir ödül elde edin. Modern iOS (2017) yılında Fotoğraf albümüne kaydedilen görüntünün dosya ismini alın

,

burada aslında iOS fotoğraf sisteme bir görüntü kaydetmek ve dosya adı/yolu almak için ben bildiğim tek yolu bu.

import UIKit 
import Photos 

func saveTheImage...() { 

    UIImageWriteToSavedPhotosAlbum(yourUIImage, self, 
     #selector(Images.image(_:didFinishSavingWithError:contextInfo:)), 
     nil) 
} 

func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) { 
    guard error == nil else { 
     print("Couldn't save the image!") 
     return 
    } 
    doGetFileName() 
} 

func doGetFileName() { 
    let fo: PHFetchOptions = PHFetchOptions() 
    fo.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
    let r = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fo) 
    if let mostRecentThingy = r.firstObject { 

     PHImageManager.default().requestImageData(
      for: mostRecentThingy, 
      options: PHImageRequestOptions(), 
      resultHandler: { (imagedata, dataUTI, orientation, info) in 

       if info!.keys.contains("PHImageFileURLKey") { 
        let path = info!["PHImageFileURLKey"] as! NSURL 

        print("Holy cow. The path is \(path)") 
       } 
       else { print("bizarre problem") } 
      }) 

    } 
    else { print("unimaginable catastrophe") } 
} 

bu iki sorun vardır:

1. WTH?!?

2. Yarış pisti koşullarında arızalanır.

Bu inanılmaz bir şekilde göz kamaştırıcı ve bir çok açıdan endişeli görünüyor.

Gerçekten gitmenin yolu bu mu?

+0

Gerçekten URL'ye ihtiyacınız var mı? İlgili "PHObject" in "localIdentifier" özelliğini de kullanabilir misiniz? –

cevap

1
extension PHPhotoLibrary { 

    func save(imageData: Data, withLocation location: CLLocation?) -> Promise<PHAsset> { 
     var placeholder: PHObjectPlaceholder! 
     return Promise { fullfil, reject in 
      performChanges({ 
       let request = PHAssetCreationRequest.forAsset() 
       request.addResource(with: .photo, data: imageData, options: .none) 
       request.location = location 
       placeholder = request.placeholderForCreatedAsset 
      }, completionHandler: { (success, error) -> Void in 
       if let error = error { 
        reject(error) 
        return 
       } 

       guard let asset = PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier], options: .none).firstObject else { 
        reject(NSError()) 
        return 
       } 

       fullfil(asset) 
      }) 
     } 
    } 
} 

Sana PHPhotoLibrary ve PHObjectPlaceholder ile yapabilirsiniz düşünüyorum.

+0

PHPhotoLibrary ... ne var ki, bu konuda hiç duymadım! – Fattie

+0

https://developer.apple.com/reference/photos/phphotolibrary Dokümanı burada bulabilirsiniz. –

+0

Geleceğin googlers için inanıyorum ** ama emin değilim ** bu doğru modern cevaptır. – Fattie

2

Eğer kameradan görüntü almak ve yol ile kaydedebilirsiniz böylece sadece, programlı görüntü kaydedilir:

//save image in Document Derectory 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSLog(@"Get Path : %@",documentsDirectory); 

     //create Folder if Not Exist 
     NSError *error = nil; 
     NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/YourFolder"]; 

     if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) 
     [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder 

     NSString *[email protected]"YourPhotoName"; 
     NSString* path= [dataPath stringByAppendingString:[NSString stringWithFormat:@"/%@.png",yourPhotoName]]; 
     NSData* imageData = UIImagePNGRepresentation(imageToSaved); //which got from camera 

     [imageData writeToFile:path atomically:YES]; 

     imagePath = path; 
     NSLog(@"Save Image Path : %@",imagePath); 
+0

Merhaba Dong, Apple fotoğraf albümü sisteminde ise *** yolunu keşfetmeye çalışıyorum *** – Fattie

+0

@Fattie: Bu kod ile simülatörde denedim: ============= = - (void) imagePickerController: (UIImagePickerController *) seçici didFinishPickingMediaWithInfo: (NSDictionary *) bilgi { NSURL * localUrl = (NSURL *) [bilgi değeriForKey: UIImagePickerControllerReferenceURL]; NSLog (@ "image url% @", localUrl.absoluteString); } ====== ve benzeri bir şey var: image url assets-library: //asset/asset.JPG? Id = ED7AC36B-A150-4C38-BB8C-B6D696F4F2ED & ext = JPG İhtiyacınız varsa söyle. ^^ –

0

Belki bu burada farklı bir yaklaşımdır ama benim app ve I ne yapıyorum var 'onunla memnun değilim: Eğer ALAssetsLibrary kullanmak istemiyorsanız

func saveImage(image: UIImage, name: String) { 

    var metadata = [AnyHashable : Any]() 
    let iptcKey = kCGImagePropertyIPTCDictionary as String 
    var iptcMetadata = [AnyHashable : Any]() 

    iptcMetadata[kCGImagePropertyIPTCObjectName as String] = name 
    metadata[iptcKey] = iptcMetadata 

    let library = ALAssetsLibrary() 

    library.writeImage(toSavedPhotosAlbum: image.cgImage, metadata: metadata) { url, error in 

     // etc... 
    } 
} 

, muhtemelen this answer ilgi olacak.