SwiftUI UIImage из пути не виден

#swift #swiftui

#swift #swiftui

Вопрос:

У меня есть изображение, хранящееся внутри AppGroup, но я не могу показать изображение, и я не уверен, почему.

У меня это внутри моего представления:

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

Я получаю изображение, используя следующую функцию:

 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
}
  

Это работает нормально, и блок catch никогда не попадает, но изображение по-прежнему не отображается. Моей первоначальной мыслью было, что у меня неверный путь, но, похоже, это не так, поскольку я могу загрузить изображение, как ожидалось, в React Native, используя путь.

В моих стилях также нет ничего плохого, поскольку другое изображение, загруженное из Assets.xcassets, работает нормально.

Ответ №1:

Предполагая, что файл действительно существует в указанном месте (для этого вы можете проверить сгенерированный URL-адрес), попробуйте использовать оболочку ресурсов с областью безопасности, как показано ниже

 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
}
  

Комментарии:

1. К сожалению, ImagePath.startAccessingSecurityScopedResource() возвращает false.

2. Я также могу абсолютно подтвердить, что путь к файлу указан правильно. При просмотре данных imageData и нажатии кнопки Экспорт -> сохранить как myimage.jpg я могу успешно открыть изображение в Finder.

Ответ №2:

Хотя мое решение работает, это неверный ответ на вопрос, почему мои изображения не отображаются, и я все равно хотел бы знать, почему, если кто-нибудь знает, кто столкнется с этим сообщением в будущем.

Чтобы решить эту проблему, вместо использования абсолютного пути к изображению я использовал строку base64 для использования в качестве данных. Теперь изображение успешно отображается.