我如何从Swift中的URL下载GIF (GIF from Tenor)



我遇到了两个问题,试图从Tenor下载Gif。在我的主应用程序中,我通过我的API_Key并发出一个请求,作为回报,它给了我一个ITEMURL: https://tenor.com/view/yes-chuck-norris-approves-thumbs-up-gif-14366055和一个URL: https://tenor.com/8rqJ.gif

我能够在浏览器上打开url并看到gif,但我无法将其下载到应用程序。我有一个ViewController,我将在下面发布。我真的在寻找一种方法来成功地从男高音网址下载gif。我能够使gif工作与一个公共URL: https://blog.hootsuite.com/wp-content/uploads/2022/06/How-to-Make-a-GIF-1.gif这是我的代码

我ViewController:

import UIKit
import FLAnimatedImage
class ViewController: UIViewController {

let imageView = FLAnimatedImageView()
let button = UIButton()
let spinner = UIActivityIndicatorView(style: .large)

override func viewDidLoad() {
super.viewDidLoad()
setupButton()
setupSpinner()
setupImageView()
}

private func setupButton() {
button.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
button.backgroundColor = .black
view.addSubview(button)
button.addTarget(self, action: #selector(getGif), for: .touchUpInside)
}

private func setupSpinner() {
view.addSubview(spinner)
spinner.center = view.center
}

private func setupImageView() {
imageView.frame = CGRect(x: 300, y: 600, width: 200, height: 200)
view.addSubview(imageView)
imageView.center = view.center
imageView.contentMode = .scaleAspectFit
}

@objc func getGif() {
// Create a URL for the GIF
spinner.startAnimating()
guard let url = URL(string: "https://blog.hootsuite.com/wp-content/uploads/2022/06/How-to-Make-a-GIF-1.gif") else { return }
let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
guard let this = self else { return }
if let error = error {
print(error)
return
}
guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
print("Invalid Response")
return
}

//make sure there is data
guard let data = data else {
print("No Data returned")
return
}

let animatedImage = FLAnimatedImage(animatedGIFData: data)
DispatchQueue.main.async {
this.spinner.stopAnimating()
this.button.isHidden = true
this.imageView.animatedImage = animatedImage
}
}
task.resume()
}
}

我认为这将是明智的提及我使用FLAnimatedImage来帮助显示Gif。我愿意考虑其他的解决方案。

我发现了Tenor URL的问题。

我不能在应用程序上显示它的原因是我正在显示Tenor网站上的URL,该网站也有其他动图。在查看了API的响应后,我注意到它返回了一堆媒体格式。(如果有人想看,我会把回复粘贴在下面)

我注意到gif媒体格式,并在浏览器中打开它,发现这个URL只带我到这个gif,页面上没有其他内容。我重写了我的Struct模型来匹配这个和BOOM…问题解决了。

数据模型Struct:

import Foundation
// MARK: - Content
struct Content: Decodable {
let results: [Result]
}
// MARK: - Result
struct Result: Decodable {
let media_formats: MediaFormats
}
// MARK: - MediaFormats
struct MediaFormats: Decodable {
let gif: GIF
}
// MARK: - GIF
struct GIF: Decodable {
let url: String
}

来自API调用的响应:

{
"results": [
{
"id": "7321207095287125549",
"title": "texas",
"media_formats": {
"tinywebm": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAP3/chuck-norris-walker-texas-ranger.webm",
"duration": 0,
"preview": "",
"dims": [
320,
240
],
"size": 57989
},
"tinygifpreview": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAF/chuck-norris-walker-texas-ranger.png",
"duration": 0,
"preview": "",
"dims": [
220,
165
],
"size": 0
},
"mp4": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAPo/chuck-norris-walker-texas-ranger.mp4",
"duration": 2.3,
"preview": "",
"dims": [
400,
300
],
"size": 139907
},
"webm": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAPs/chuck-norris-walker-texas-ranger.webm",
"duration": 0,
"preview": "",
"dims": [
400,
300
],
"size": 65667
},
"nanogifpreview": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAT/chuck-norris-walker-texas-ranger.png",
"duration": 0,
"preview": "",
"dims": [
120,
90
],
"size": 0
},
"nanomp4": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAP2/chuck-norris-walker-texas-ranger.mp4",
"duration": 2.3,
"preview": "",
"dims": [
150,
112
],
"size": 45110
},
"tinygif": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAM/chuck-norris-walker-texas-ranger.gif",
"duration": 0,
"preview": "",
"dims": [
220,
165
],
"size": 266545
},
"gifpreview": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAe/chuck-norris-walker-texas-ranger.png",
"duration": 0,
"preview": "",
"dims": [
400,
300
],
"size": 37163
},
"nanogif": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAS/chuck-norris-walker-texas-ranger.gif",
"duration": 0,
"preview": "",
"dims": [
120,
90
],
"size": 103784
},
"mediumgif": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAd/chuck-norris-walker-texas-ranger.gif",
"duration": 0,
"preview": "",
"dims": [
400,
300
],
"size": 991245
},
"tinymp4": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAP1/chuck-norris-walker-texas-ranger.mp4",
"duration": 2.3,
"preview": "",
"dims": [
320,
240
],
"size": 127441
},
"loopedmp4": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAPo/chuck-norris-walker-texas-ranger.mp4",
"duration": 2.3,
"preview": "",
"dims": [
400,
300
],
"size": 139907
},
"gif": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAAC/chuck-norris-walker-texas-ranger.gif",
"duration": 0,
"preview": "",
"dims": [
400,
300
],
"size": 1520206
},
"nanowebm": {
"url": "https://media.tenor.com/ZZonEFGoli0AAAP4/chuck-norris-walker-texas-ranger.webm",
"duration": 0,
"preview": "",
"dims": [
150,
112
],
"size": 56817
}
},
"created": 1460746269.6868651,
"content_description": "Texas GIF",
"itemurl": "https://tenor.com/view/chuck-norris-walker-texas-ranger-gif-5336135",
"url": "https://tenor.com/wykR.gif",
"tags": [
"Chuck Norris",
"Walker Texas Ranger"
],
"flags": [],
"hasaudio": false
}
],
"next": "CAEQ79qe_OSJ_AIaHgoKAD-_xhumWuxY_xIQOpL78_1184rUPMB1AAAAADAy"
}

最新更新