如何将Spotify短链接扩展为完整URL?Swift实现难题求解
Spotify短链接解析的Swift解决方案问题
背景
2023年左右,Spotify推出短链接功能,导致不少开发者原有代码失效。这类短链接采用特殊的多次跳转逻辑,常规解析方式无法直接获取最终目标URL。
Python中的可行方案
Python可通过requests库的HEAD请求自动跟随重定向,轻松解析出最终URL,示例代码如下:
def expand_short_url(short_url_string): try: response = requests.head(short_url_string, allow_redirects=True) return response.url except Exception as e: # 可按需添加异常处理逻辑 return None
相关技术社区中也有类似实现:
import requests r = requests.head("<spotify.link url>", allow_redirects=True) print(r.url)
Swift/SwiftUI中的解析困境
Swift的URL会话机制在处理这类特殊重定向时存在局限,无法完整获取最终目标URL。以下为测试案例:
- 测试短链接:
https://spotify.link/H6FTskvicDb - Chrome浏览器中最终跳转目标:
https://open.spotify.com/playlist/5zPbGYMyILmVCty6TJ9mOO?si=IkYKRaG5S5-6S_QY0YEYeg&utm_source=copy-link&utm_medium=copy-link&nd=1&_branch_match_id=1159194084012404754&_branch_referrer=H4sIAAAAAAAAA8soKSkottLXLy7IL8lMq9TLyczL1vcwcwspzi7LTHZJAgAyNUUSIAAAAA%3D%3D - 当前Swift代码仅能解析到中间URL:
https://spotify.app.link/H6FTskvicDb?_p=c11334dc9f057af2e21e90fce1b0
当前Swift实现代码:
func expandShortURL(shortURLString: String, completion: @escaping (String?) -> Void) { guard let url = URL(string: shortURLString) else { print("Invalid URL: \(shortURLString)") completion(nil) return } var request = URLRequest(url: url) request.httpMethod = "GET" // 设置浏览器模拟User-Agent request.setValue("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36", forHTTPHeaderField: "User-Agent") let session = URLSession(configuration: .default, delegate: RedirectFollower(), delegateQueue: nil) session.dataTask(with: request) { _, response, error in if let error = error { print("URL Expansion Error: \(error.localizedDescription)") completion(nil) return } guard let httpResponse = response as? HTTPURLResponse, let finalURL = httpResponse.url else { print("Failed to get final URL") completion(nil) return } print("Final URL: \(finalURL.absoluteString)") completion(finalURL.absoluteString) }.resume() } class RedirectFollower: NSObject, URLSessionDelegate, URLSessionTaskDelegate { func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { if let url = request.url, url.absoluteString.contains("open.spotify.com/playlist/") { // 识别到目标URL,停止跟随重定向 completionHandler(nil) } else { // 继续跟随后续重定向 completionHandler(request) } } }
需求
尽管目前Spotify暂未大规模推广这类移动端短链接,但仍需找到Swift环境下能完整解析该类短链接的解决方案。
内容的提问来源于stack exchange,提问作者George Hayward
相关产品推荐
相关产品推荐

