URLSession là API cho các yêu cầu mạng trong iOS và macOS, thuộc framework Foundation cung cấp giao diện thống nhất để làm việc với HTTP, HTTPS, tải xuống nền và WebSocket. Nó đã thay thế NSURLConnection lỗi thời và trở thành công cụ mạng chính cho các nhà phát triển Apple. Theo Apple Developer Documentation (2025), URLSession xử lý hơn 90% lưu lượng mạng trong các ứng dụng iPhone và iPad.
Những điểm chính
URLSession là API cho các hoạt động mạng do Apple giới thiệu trong iOS 7 và macOS 10.9. Nó đã thay thế NSURLConnection và cung cấp mô hình linh hoạt và mạnh mẽ hơn để làm việc với mạng. Thư viện hỗ trợ HTTP/1.1, HTTP/2, HTTP/3 và WebSocket, cũng như các phiên nền để tải dữ liệu.
Lợi thế chính của URLSession so với NSURLConnection cũ là hỗ trợ nhiều kết nối đồng thời qua một phiên duy nhất, cấu hình có thể tùy chỉnh và khả năng tạm dừng và tiếp tục tải xuống. Một phiên kết hợp một nhóm tác vụ mạng với các cài đặt chung: bộ nhớ đệm, chính sách cookie, thời gian chờ, chứng chỉ TLS.
Trong iOS, URLSession hoạt động với bộ nhớ đệm DNS hệ thống, quản lý năng lượng và các tiến trình nền. Khi ứng dụng bị thu nhỏ, hệ thống có thể tiếp tục tải dữ liệu qua phiên nền và sau khi hoàn thành, thông báo cho ứng dụng qua trình xử lý hoàn thành. Phiên nền đặc biệt hữu ích để tải xuống tệp lớn, cập nhật nội dung và đồng bộ dữ liệu trong các ứng dụng tài liệu và phương tiện. Để làm việc với phiên nền, bạn cần triển khai URLSessionDelegate và truyền mã định danh cấu hình khi tạo phiên — hệ thống sử dụng mã định danh này để khôi phục phiên sau khi khởi động lại ứng dụng.
Một lợi thế quan trọng của URLSession là hỗ trợ HTTP/2 và HTTP/3. Ghép kênh HTTP/2 cho phép gửi nhiều yêu cầu qua một kết nối TCP duy nhất, giảm độ trễ và tải máy chủ. HTTP/3, dựa trên giao thức QUIC qua UDP, cung cấp thiết lập kết nối nhanh hơn nữa bằng cách loại bỏ bắt tay TCP.
Kiến trúc URLSession bao gồm ba thành phần chính: cấu hình phiên, phiên và các tác vụ. Mỗi thành phần chịu trách nhiệm cho một khía cạnh của tương tác mạng và sự kết hợp của chúng xác định hành vi của ứng dụng khi làm việc với mạng.
Cấu hình đặt tham số phiên — từ thời gian chờ đến chính sách bộ nhớ đệm. Có ba loại: .default (tiêu chuẩn với bộ nhớ đệm đĩa), .ephemeral (không lưu bộ nhớ đệm và cookie) và .background (cho tải xuống nền). Trong cấu hình, bạn có thể chỉ định số lượng kết nối tối đa mỗi máy chủ, thời gian chờ yêu cầu và tài nguyên, chính sách TLS và cài đặt proxy.
URLSessionTask là lớp cơ sở cho tất cả các hoạt động mạng. Các lớp con chính là: URLSessionDataTask cho yêu cầu GET và POST trả về dữ liệu trong bộ nhớ, URLSessionDownloadTask để tải tệp xuống đĩa, URLSessionUploadTask để tải tệp lên máy chủ và URLSessionWebSocketTask để làm việc với WebSocket từ iOS 13.
Delegate phiên nhận sự kiện về tiến trình của tác vụ: nhận dữ liệu, hoàn thành tải xuống, lỗi xác thực, chuyển hướng. URLSessionDelegate và các giao thức con của nó cho phép chặn chứng chỉ TLS trong quá trình xác thực, quản lý bộ nhớ đệm phản hồi qua URLCache và giám sát tiến trình tải xuống tệp lớn. Thay vào đó, có thể sử dụng closure (trình xử lý hoàn thành) cho các trường hợp đơn giản không cần xử lý sự kiện trung gian.
Quy trình làm việc cơ bản với URLSession như sau: tạo cấu hình, tạo phiên dựa trên cấu hình đó, sau đó qua phiên tạo tác vụ với yêu cầu URL và bắt đầu tác vụ. Hãy xem xét ví dụ về yêu cầu GET với closure. Mẫu này được sử dụng trong hầu hết các ứng dụng iOS để lấy dữ liệu từ REST API, tải hình ảnh và tương tác với dịch vụ đám mây.
let url = URL(string: "https://api.example.com/users")!
let session = URLSession.shared
let task = session.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print("Error: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
Ví dụ sử dụng URLSession.shared — một singleton với cấu hình .default cho các yêu cầu đơn giản. dataTask tạo một hoạt động bất đồng bộ nhưng không bắt đầu nó — bạn phải gọi resume(). Closure thực thi sau khi yêu cầu hoàn thành và trả về data, response hoặc error. Đối với phiên tùy chỉnh với cấu hình riêng, hãy sử dụng bộ khởi tạo URLSession(configuration:), cho phép đặt chính sách bộ nhớ đệm, thời gian chờ, kết nối tối đa, tiêu đề HTTP mặc định và cài đặt proxy cho tất cả tác vụ trong phiên. Cách tiếp cận này cho bạn toàn quyền kiểm soát hành vi mạng trong ứng dụng của mình.
URLSession hỗ trợ tải xuống tệp với khả năng tạm dừng và tiếp tục, cũng như tải xuống nền. DownloadTask lưu tệp vào thư mục tạm thời và trong closure hoàn thành bạn cần di chuyển nó đến vị trí cố định.
let url = URL(string: "https://example.com/file.zip")!
let session = URLSession(configuration: .default)
let task = session.downloadTask(with: url) { location, _, _ in
guard let location = location else { return }
let destination = FileManager.default.temporaryDirectory
.appendingPathComponent("file.zip")
try? FileManager.default.moveItem(at: location, to: destination)
}
task.resume()
Tham số location trong closure trỏ đến tệp tạm thời cần được di chuyển, nếu không hệ thống sẽ xóa nó sau khi thoát khỏi closure. Để theo dõi tiến trình, hãy sử dụng delegate URLSessionDownloadDelegate với phương thức didWriteData, phương thức này truyền số byte đã ghi và tổng kích thước tệp — dữ liệu này có thể được sử dụng để hiển thị thanh tiến trình trong giao diện người dùng. Phiên nền với downloadTask cho phép tiếp tục tải xuống ngay cả sau khi thu nhỏ ứng dụng và khi hoàn thành, hệ thống gọi trình xử lý trong AppDelegate.
Alamofire là thư viện Swift được xây dựng trên URLSession cung cấp giao diện khai báo hơn. Sự lựa chọn giữa API gốc và Alamofire phụ thuộc vào độ phức tạp của dự án và sở thích của nhóm.
| Tiêu chí | URLSession | Alamofire |
|---|---|---|
| Phụ thuộc | Không, tích hợp trong Foundation | Yêu cầu SPM hoặc CocoaPods |
| Cú pháp | Mệnh lệnh với closure | Khai báo với chuỗi |
| Xử lý JSON | JSONSerialization thủ công | responseDecodable với Codable |
| Bộ chặn | Qua delegate | RequestInterceptor, EventMonitor |
| Tiến trình | Qua delegate | downloadProgress, uploadProgress |
Đối với dự án đơn giản, URLSession là đủ và không thêm phụ thuộc. Alamofire phù hợp trong các dự án có nhiều yêu cầu mạng, xử lý lỗi phức tạp và cần cú pháp ngắn gọn. Cả hai công nghệ đều chia sẻ nền tảng URLSessionConfiguration chung và tương thích với nhau. Khi lựa chọn, hãy cân nhắc rằng URLSession hoàn toàn do Apple kiểm soát và được cập nhật cùng iOS, trong khi Alamofire yêu cầu các nhà phát triển thư viện duy trì khả năng tương thích với các phiên bản hệ điều hành mới.
Swift hiện đại hỗ trợ async/await, giúp các yêu cầu mạng dễ đọc hơn so với closure. Hãy xem cùng yêu cầu GET sử dụng cú pháp bất đồng bộ.
func fetchUsers() async throws -> [User] {
let url = URL(string: "https://api.example.com/users")!
let (data, _) = try await URLSession.shared.data(from: url)
let users = try JSONDecoder().decode([User].self, from: data)
return users
}
Phương thức data(from:) có sẵn từ iOS 15 và macOS 12. Nó trả về một bộ (Data, URLResponse) và ném lỗi khi có sự cố mạng. JSONDecoder với mô hình Codable tự động giải tuần tự phản hồi — điều này thay thế JSONSerialization cồng kềnh từ ví dụ trước.
Đối với yêu cầu POST với nội dung JSON, URLRequest được sử dụng, nơi bạn cấu hình phương thức, tiêu đề Content-Type và nội dung yêu cầu dưới dạng Data. Async/await làm cho quá trình này ngắn gọn và rõ ràng, và xử lý lỗi đơn giản qua khối do-catch.
func createUser(name: String) async throws -> User {
var request = URLRequest(url: URL(string: "https://api.example.com/users")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = try JSONEncoder().encode(["name": name])
request.httpBody = body
let (data, _) = try await URLSession.shared.data(for: request)
return try JSONDecoder().decode(User.self, from: data)
}
Câu hỏi thường gặp
URLSession là sự thay thế hiện đại cho NSURLConnection, được giới thiệu trong iOS 7. Sự khác biệt chính bao gồm hỗ trợ nhiều kết nối qua phiên, tạm dừng và tiếp tục tác vụ, tải xuống nền và WebSocket. NSURLConnection đã lỗi thời và không được khuyến nghị sử dụng trong các dự án mới.
Để theo dõi tiến trình, sử dụng delegate URLSessionDownloadDelegate với phương thức urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Thay vào đó, cho dataTask bạn có thể đăng ký URLSessionTaskDelegate và nhận cập nhật qua didSendBodyData.
Tải xuống nền được cấu hình qua cấu hình .background(withIdentifier:). Ứng dụng đăng ký trình xử lý hoàn thành trong AppDelegate và nhận kết quả ngay cả sau khi bị thu nhỏ hoặc đóng. Hệ thống quản lý việc tải xuống và thông báo cho ứng dụng qua delegate sessionDidFinishEvents.
Có, từ iOS 13, URLSession hỗ trợ WebSocket qua lớp URLSessionWebSocketTask. Nó được tạo bằng phương thức webSocketTask(with:) và cung cấp các phương thức send, receive hỗ trợ tin nhắn văn bản và nhị phân, cũng như ping/pong để duy trì kết nối.
Thời gian chờ được cấu hình qua URLSessionConfiguration: thuộc tính timeoutIntervalForRequest (chờ phản hồi cho yêu cầu) và timeoutIntervalForResource (thời gian tối đa cho toàn bộ tải xuống). Mặc định: 60 giây cho yêu cầu và 7 ngày cho tài nguyên.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm