-
-
Save eleev/2f041bb8b1936093773f0bde42af3a49 to your computer and use it in GitHub Desktop.
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) | |
} | |
}) | |
} | |
} |
Hi @jVirus
I have not got URL in the iPhone X device
My code is,
if mPhasset.mediaType == .image {
let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions.init()
options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
return true
}
mPhasset.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput, info) in
//completionHandler(contentEditingInput!.fullSizeImageURL)
if let value = contentEditingInput {
completionHandler(value.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)
}
})
}
Any idea ??
I have get the contentEditingInput
nil value in Image and
asset
value is nil form video asses
I am also having the same issue. It is not getting in the iPhone X device how should I solve it. -@ptvyas
Hello, @RamohanReddy, @ptvyas, @sravyagajavalli!
As the description of the gist
mentions, it was originally developed and tested alongside the Swift 3.0 and the corresponding iOS SDK
. Since then, a lot of things have changed. I can't tell you immediately what's wrong with the snippet for the iPhone X
and iOS 13.0
+= 1 version.
I will later check it out and post an update.
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 param isNetworkAccessAllowed
to be true
.
@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!
Hi @jVirus
I am using below code some times getting asset values some times getting nil.
what is the issue here? how can i do ?
Thanks&Regards
Ramohan reddy