Gain a huge bounty with this seemingly easy question that has no attention.
In modern iOS (2017),
here's actually the only way I know to save an image to the iOS photos system, and get the filename/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") }
}
There are two problems with this:
1. WTH ?!?
2. It fails in racetrack conditions.
This is amazingly unwieldy, and it seems worrysome in a number of ways.
Is it really the way to go, today?
You just saved image programmatically, so you can get the image from camera and save it with your path:
I think you can do this with
PHPhotoLibrary
andPHObjectPlaceholder
.Maybe this is a different approach but here's what I'm doing in my app and I'm satisfied with it:
If you don't want to use ALAssetsLibrary, you'll probably be interested in this answer.