Kipnoedels
Kipnoedels

Reputation: 1365

SwiftUI UIImage from path not visible

I have an image stored inside an AppGroup, but I'm unable to show the image and I'm not sure why.

I have this inside my view:

Image(uiImage: getImageFromDir(imageName: name)!)
   .resizable()

I get the image using the following function:

func getImageFromDir(imageName: String) -> UIImage? {
  
  let appGroupPath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myId")!
  
  let imagePath = appGroupPath.appendingPathComponent(imageName)
  do {
    let imageData = try Data(contentsOf: imagePath)
    return UIImage(data: imageData)
  } catch {
    print("Error loading image : \(error)")
  }
  return nil
}

This runs fine and the catch block is never hit, but the image still isn't visible. My initial thought was that I had an invalid path, but this doesn't seem the case since I can load the image as expected in React Native using the path.

There's also nothing wrong with my styles since a different image loaded from Assets.xcassets works fine.

Upvotes: 1

Views: 281

Answers (2)

Kipnoedels
Kipnoedels

Reputation: 1365

While my solution is working, it is NOT a valid answer to why my images aren't showing and I would still like to know why, if anyone knows who comes across this post in the future.

To solve this, instead of using an absolute path to the image, I used a base64 string to use as the data. The image now succesfully shows.

Upvotes: 0

Asperi
Asperi

Reputation: 257493

Assuming the file is really existed at specified location (you can verify generated URL for that) try with security scoped resource wrapper, like below

func getImageFromDir(imageName: String) -> UIImage? {
  
  let appGroupPath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myId")!
  
  let imagePath = appGroupPath.appendingPathComponent(imageName)
  do {
    if imagePath.startAccessingSecurityScopedResource() {  // << this !!
        defer {
            imagePath.stopAccessingSecurityScopedResource()   // << and this !!
        }
         let imageData = try Data(contentsOf: imagePath)
         return UIImage(data: imageData)
        }
  } catch {
    print("Error loading image : \(error)")
  }
  return nil
}

Upvotes: 2

Related Questions