Here is the test code I used and the output I get:
import Foundation
import SwiftUI
struct ContentView: View {
let urlString = "http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg"
var body: some View {
Text("testing")
.onAppear {
getData()
}
}
func getData() {
guard let url = URL(string: urlString) else {
print("---> bad url")
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let data = data,
let response = response as? HTTPURLResponse,
error == nil
else {
print("network error:", error ?? "Unknown error")
return
}
print("\n---> data: \n \(String(data: data, encoding: .utf8) as AnyObject)")
print("\n---> response: \n \(response)")
guard 200 != response.statusCode else {
print("invalid status code, expected 2xx, received", response.statusCode)
return
}
guard let image = UIImage(data: data) else {
print("\n--> Not valid image")
return
}
}.resume()
}
}
The Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</dict>
</plist>
The output prints:
---> data:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
---> response:
<NSHTTPURLResponse: 0x600003ac66c0> { URL: http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg } { Status Code: 403, Headers {
Connection = (
"Keep-Alive"
);
"Content-Length" = (
199
);
"Content-Type" = (
"text/html; charset=iso-8859-1"
);
Date = (
"Fri, 10 Mar 2023 10:31:33 GMT"
);
"Keep-Alive" = (
"timeout=5, max=256"
);
Server = (
"Apache/2.4.43 (Unix) OpenSSL/1.0.2k-fips PHP/5.3.29"
);
} }
--> Not valid image
EDIT-1:
works for me with the following User-Agent
in the request, as mentioned in the comments. Not sure what is the most appropriate User-Agent
to use:
struct ContentView: View {
let urlString = "http://alivenews.net/data/file/tr_commerce/2303/20230309080756-6546.jpg"
@State var image = UIImage()
var body: some View {
Image(uiImage: image)
.onAppear {
getData()
}
}
func getData() {
guard let url = URL(string: urlString) else {
print("---> bad url")
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("image/png", forHTTPHeaderField: "Content-Type")
request.addValue("Mickey Mouse", forHTTPHeaderField: "User-Agent")
URLSession.shared.dataTask(with: request) { data, response, error in
guard
let data = data,
let response = response as? HTTPURLResponse,
error == nil
else {
print("network error:", error ?? "Unknown error")
return
}
guard 200 < response.statusCode || 299 > response.statusCode else {
print("invalid status code, expected 2xx, received", response.statusCode)
return
}
if let img = UIImage(data: data) {
self.image = img
}
}.resume()
}
}
Note, do not use guard 200 != response.statusCode ...
, try something like this: guard 200 < response.statusCode || 299 > response.statusCode ...