【问题标题】:How to handle URL redirects in SwiftUI?如何在 SwiftUI 中处理 URL 重定向?
【发布时间】:2021-02-16 10:43:02
【问题描述】:

我有以下代码用网站的图标填充图像:

import SwiftUI

struct ContentView: View {
    
    @State var website = "https://www.stackoverflow.com/favicon.ico"
    @State var favicon : String?
    
    var body: some View {

        VStack {
            
            if favicon != nil {
            Image(uiImage: favicon!.toImage()!)
            }
            
            TextField("Sito", text: $website).padding()
            
            Button(action: {
                website = "https://www." + website + ".com/favicon.ico"
            }, label: {
                Text("Complete URL")
            }).padding()
            
            Button(action: {
                if let url = URL(string: website) {
                let session = URLSession.shared.dataTask(with: url) { [self] (data,response,error) in
                    if let error = error {
                        debugPrint(error.localizedDescription)
                        return
                    }
                    if let data = data {
                        var immagineTemp : UIImage = UIImage(systemName: "questionmark")!
                        if UIImage(data: data) != nil {
                        immagineTemp = UIImage(data: data)!
                        } else {
                            debugPrint("URL was redirected")
                        }
                        favicon = immagineTemp.toString()
                    }
                }
                session.resume()
            }
            }, label: {
                Text("Get favicon")
            }).padding()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

extension String {
    func toImage() -> UIImage? {
        if let data = Data(base64Encoded: self, options: .ignoreUnknownCharacters){
            return UIImage(data: data)
        }
        return nil
    }
}

extension UIImage {
    func toString() -> String? {
        let data: Data? = self.pngData()
        return data?.base64EncodedString(options: .endLineWithLineFeed)
    }
}

通常,var 网站是空的,可以通过 TextField 填充,但出于本示例的目的,我使用该 URL 填充它,因为如果您使用 Stackoverflow 网站下载 favicon,正如我在代码中所写上面,它不起作用,因为 URL“https://www.stackoverflow.com/favicon.ico”将您重定向到“https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v =ec617d715196",这是 Stackoverflow favicon 所在的位置。正因为如此,“immagineTemp = UIImage(数据:数据)!”结果为零,它放在有 debugPrint("URL was redirected") 的括号中。

我希望它自动检测一个 URL 将您重定向到另一个 URL 的事实,以便它可以继续自行下载网站图标。有办法吗?

【问题讨论】:

  • 据我尝试,URL https://www.stackoverflow.com/favicon.ico 返回带有 https://stackoverflow.com/favicon.ico,https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196(不是 https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196)的 301 响应,并且重定向的 URL 返回 404 响应。这似乎是服务器端的问题。
  • 直到今天早上,当我尝试访问 https://www.stackoverflow.com/favicon.ico 时,我一直被重定向到我链接的另一个网站。但是一般重定向的 URL 呢?有没有办法自动处理它们?
  • "有没有办法自动处理它们?"> 使用代码中的默认配置,重定向会在 URLSession 中自动处理。而我刚才又试了一次,原来的URL返回了location: https://stackoverflow.com/favicon.ico,https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196的301响应。您可能错过了第一部分,或者从今天早上起它突然发生了变化。
  • “第一部分”是什么意思?
  • location: 包含https://stackoverflow.com/favicon.ico 作为第一部分,https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196 作为第二部分,用逗号分隔。

标签: url redirect download swiftui favicon


【解决方案1】:

起初我以为你可以将响应(类型为URLResponse)转换为HTTPURLResponse,然后检查该对象的属性statusCode

但进一步检查,似乎要执行NSURLSessionTaskDelegate,更具体地说是以下方法:

optional func urlSession(_ session: URLSession, 
                               task: URLSessionTask, 
willPerformHTTPRedirection response: HTTPURLResponse, 
                 newRequest request: URLRequest, 
                  completionHandler: @escaping (URLRequest?) -> Void) 

在此处查看 Apple 文档:https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/1411626-urlsession

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2010-10-18
    • 2021-01-28
    • 2019-12-19
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2021-09-13
    • 2020-03-16
    相关资源
    最近更新 更多