Last active
April 2, 2025 13:33
-
-
Save eleev/2f041bb8b1936093773f0bde42af3a49 to your computer and use it in GitHub Desktop.
Getting URL for PHAsset (Swift 3.0)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func getURL(ofPhotoWith mPhasset: PHAsset, completionHandler : @escaping ((_ responseURL : URL?) -> Void)) { | |
if mPhasset.mediaType == .image { | |
let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions() | |
options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in | |
return true | |
} | |
mPhasset.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput, info) in | |
completionHandler(contentEditingInput!.fullSizeImageURL) | |
}) | |
} else if mPhasset.mediaType == .video { | |
let options: PHVideoRequestOptions = PHVideoRequestOptions() | |
options.version = .original | |
PHImageManager.default().requestAVAsset(forVideo: mPhasset, options: options, resultHandler: { (asset, audioMix, info) in | |
if let urlAsset = asset as? AVURLAsset { | |
let localVideoUrl = urlAsset.url | |
completionHandler(localVideoUrl) | |
} else { | |
completionHandler(nil) | |
} | |
}) | |
} | |
} |
@freemansion greatly appreciate for pointing that important case out.
Thanks! I slightly changed it for what i need
func requestAssetUrl() -> AnyPublisher<URL, Error> {
Future { [self] promise in
if self.mediaType == .image {
self.requestContentEditingInput(with: nil) { input, info in
if let input = input, let url = input.fullSizeImageURL {
promise(.success(url))
} else {
promise(.failure(Errors.urlNotAvailable))
}
}
} else if self.mediaType == .video {
let options: PHVideoRequestOptions = PHVideoRequestOptions()
options.version = .original
PHImageManager.default().requestAVAsset(forVideo: self, options: options) { asset, audio, info in
if let urlAsset = asset as? AVURLAsset {
let localVideoUrl = urlAsset.url
promise(.success(localVideoUrl))
} else {
promise(.failure(Errors.urlNotAvailable))
}
}
} else {
promise(.failure(Errors.mediaNotSupported))
}
}.eraseToAnyPublisher()
}
extension PHAsset {
enum Errors: Error {
case urlNotAvailable
case mediaNotSupported
}
}
@fernandodev I recommend you add some code that shows how to use this piece. Newbies would need it, but that definitely helped. Thanks!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thanks for sharing the snippet.
I would just add - in order to fetch videos stored in iCloud (otherwise result handler will return nil) - set
PHVideoRequestOptions
's paramisNetworkAccessAllowed
to betrue
.