Skip to content

Instantly share code, notes, and snippets.

@fahied
Created April 11, 2019 06:28
Show Gist options
  • Select an option

  • Save fahied/d4a99e12914eb3edb074663828240907 to your computer and use it in GitHub Desktop.

Select an option

Save fahied/d4a99e12914eb3edb074663828240907 to your computer and use it in GitHub Desktop.
Get URL from Xcode asset catalogs
import UIKit
//It basically just gets image from assets, saves its data to disk and return file URL.
class AssetExtractor {
static func createLocalUrl(forImageNamed name: String) -> URL? {
let fileManager = FileManager.default
let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
let url = cacheDirectory.appendingPathComponent("\(name).png")
guard fileManager.fileExists(atPath: url.path) else {
guard
let image = UIImage(named: name),
let data = UIImagePNGRepresentation(image)
else { return nil }
fileManager.createFile(atPath: url.path, contents: data, attributes: nil)
return url
}
return url
}
}
@mauriciochirino
Copy link
Copy Markdown

Nice workaround 👏 I'd add a file type extension parameter defaulted in png.

@mauriciochirino
Copy link
Copy Markdown

mauriciochirino commented Mar 29, 2021

/// Retrieves (or creates should it be necessary) a temporary image's local URL on cache directory for testing purposes
/// - Parameter name: image name retrieved from asset catalog
/// - Parameter imageExtension: Image type. Defaults to `.jpg` kind
/// - Returns: Resulting URL for named image
func createLocalUrl(forImageNamed name: String, imageExtension: String = "jpg") -> URL? {
    let fileManager = FileManager.default

    guard let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first else {
        print("Unable to access cache directory")
        return nil
    }

    let url = cacheDirectory.appendingPathComponent("\(name).\(imageExtension)")

    // If file doesn't exist, creates it
    guard fileManager.fileExists(atPath: url.path) else {
        // Bundle(for: Self.self) is used here instead of .main in order to work on test target as well
        guard let image = UIImage(named: name, in: Bundle(for: Self.self), with: nil),
              let data = image.jpegData(compressionQuality: 1) else {
            print("Impossible to convert to jpg data")
            return nil
        }

        fileManager.createFile(atPath: url.path, contents: data, attributes: nil)
        return url
    }

    return url
}

@michzio
Copy link
Copy Markdown

michzio commented Apr 22, 2022

it is url to cache not to .xcassets catalog

@DenimMerzhan
Copy link
Copy Markdown

it is url to cache not to .xcassets catalog

@ulkoart
Copy link
Copy Markdown

ulkoart commented Sep 21, 2023

it is url to cache not to .xcassets catalog

@eldaroid
Copy link
Copy Markdown

it is url to cache not to .xcassets catalog

@Jasperav
Copy link
Copy Markdown

it is url to cache not to .xcassets catalog

@ovoitenk
Copy link
Copy Markdown

it is url to cache not to .xcassets catalog

@shynggys-s
Copy link
Copy Markdown

it is url to cache not to .xcassets catalog

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment