AsyncImage не отображает URL-адрес изображения при передаче в представление

В этом дочернем представлении не отображаются URL-адреса изображений, переданные из родительского представления. Детский вид:

      struct PostImageView: View {

  var postImage: String

  var body: some View {
      AsyncImage(url: URL(string: postImage)) { image in
          image
              .resizable()
              .aspectRatio(contentMode: .fit)
      } placeholder: {
          Text("IMAGE URL: \(postImage)")
          ProgressView()
      }
      .ignoresSafeArea()
  }
}
  • Отображает URL-адрес изображения в представлении во время загрузки.
  • Добавление статического URL-адреса изображения отображает изображение: AsyncImage(url: URL(string: "https://url-to-image"))

Родительское представление полагается на ObservableObject чтобы определить, когда отображать представление, содержащее:

      class ImageDetail: ObservableObject {
    @Published var imageUrl = ""
    @Published var showImageDetail: Bool = false
}

Эта часть родительского представления затем переходит к дочернему представлению и передает URL-адрес изображения:

       NavigationLink(destination: PostImageView(postImage: imageDetail.imageUrl), isActive: $imageDetail.showImageDetail) {
    EmptyView()
 }

Когда showImageDetail является true, значение содержит действительный URL-адрес изображения, который затем передается в PostImageView содержащий AsyncImage.

В imageUrl значение успешно передается в соответствии с Text("IMAGE URL: \(postImage)") вывод упомянутый выше.

2 ответа

После некоторого тестирования выяснилось, что AsyncImage молча терпит неудачу, когда небезопасный http URL-адрес передается от родителя.

Я решил эту проблему, добавив функцию для обнаружения небезопасных URL-адресов http и вместо этого преобразовывая их в URL-адреса https.

Как ни странно, существует явная ошибка о запрете небезопасных URL-адресов при использовании статического URL-адреса в дочернем представлении, но не при передаче от родительского.

Если вам действительно нужно использовать http вместо https, необходимо изменить NSAppTransportSecurity в вашем info.plist

Но, похоже, вам удалось решить проблему без использования http, что лучше.

Другие вопросы по тегам