获取保存到照片相册的图像的文件名
用这个看起来很容易的问题来获得巨大的赏金。
在现代iOS(2017)中,
这里是我知道将图像保存到iOS照片系统的唯一途径 ,并获取文件名/path。
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") } }
这有两个问题:
1. WTH?!?
2.在赛道条件下失败。
这是非常难以处理的,而且在很多方面似乎令人担忧。
今天真的要走吗?
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) }) } } }
我想你可以用PHPhotoLibrary
和PHObjectPlaceholder
来做到这PHObjectPlaceholder
。
你只是以编程方式保存图像,所以你可以从相机获取图像,并保存你的path:
//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 *yourPhotoName=@"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);
也许这是一个不同的方法,但这是我在我的应用程序中做的,我很满意:
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... } }
如果你不想使用ALAssetsLibrary,你可能会对这个答案感兴趣。