URLSession คือ API สำหรับคำขอเครือข่ายใน iOS และ macOS ซึ่งเป็นส่วนหนึ่งของ Foundation framework ที่ให้อินเทอร์เฟซแบบรวมสำหรับการทำงานกับ HTTP, HTTPS, การดาวน์โหลดพื้นหลัง และ WebSocket มันแทนที่ NSURLConnection ที่ล้าสมัยและกลายเป็นเครื่องมือเครือข่ายหลักสำหรับนักพัฒนา Apple ตาม Apple Developer Documentation (2025), URLSession จัดการการรับส่งข้อมูลเครือข่ายมากกว่า 90% ในแอปพลิเคชัน iPhone และ iPad
ประเด็นสำคัญ
URLSession คือ API สำหรับการดำเนินการเครือข่ายที่ Apple นำเสนอใน iOS 7 และ macOS 10.9 มันแทนที่ NSURLConnection และให้โมเดลที่ยืดหยุ่นและทรงพลังมากขึ้นสำหรับการทำงานกับเครือข่าย ไลบรารีรองรับ HTTP/1.1, HTTP/2, HTTP/3 และ WebSocket รวมถึงเซสชันพื้นหลังสำหรับการโหลดข้อมูล
ข้อได้เปรียบหลักของ URLSession เหนือ NSURLConnection เดิมคือการรองรับการเชื่อมต่อพร้อมกันหลายรายการผ่านเซสชันเดียว การกำหนดค่าที่ปรับแต่งได้ และความสามารถในการหยุดและดำเนินการดาวน์โหลดต่อ เซสชัน รวมกลุ่มงานเครือข่ายเข้ากับการตั้งค่าร่วมกัน: การแคช, นโยบายคุกกี้, การหมดเวลา, ใบรับรอง TLS
ใน iOS, URLSession ทำงานกับแคช DNS ของระบบ, การจัดการพลังงาน และกระบวนการพื้นหลัง เมื่อแอปถูกย่อ ระบบสามารถโหลดข้อมูลต่อผ่านเซสชันพื้นหลัง และเมื่อเสร็จสิ้น จะแจ้งให้แอปทราบผ่านตัวจัดการการเสร็จสิ้น เซสชันพื้นหลังมีประโยชน์อย่างยิ่งสำหรับการดาวน์โหลดไฟล์ขนาดใหญ่ การอัปเดตเนื้อหา และการซิงโครไนซ์ข้อมูลในแอปพลิเคชันเอกสารและสื่อ การทำงานกับเซสชันพื้นหลัง คุณต้องใช้งาน URLSessionDelegate และส่งตัวระบุการกำหนดค่าเมื่อสร้างเซสชัน — ระบบใช้ตัวระบุนี้เพื่อกู้คืนเซสชันหลังจากรีสตาร์ทแอป
ข้อได้เปรียบที่สำคัญของ URLSession คือการรองรับ HTTP/2 และ HTTP/3 การมัลติเพล็กซ์ HTTP/2 ช่วยให้ส่งคำขอหลายรายการผ่านการเชื่อมต่อ TCP เดียว ลดความหน่วงและภาระของเซิร์ฟเวอร์ HTTP/3 ซึ่งใช้โปรโตคอล QUIC บน UDP ให้การสร้างการเชื่อมต่อที่รวดเร็วยิ่งขึ้นโดยไม่ต้องมีการจับมือ TCP
สถาปัตยกรรม URLSession ประกอบด้วยสามองค์ประกอบหลัก: การกำหนดค่าเซสชัน, เซสชันเอง, และงาน แต่ละองค์ประกอบรับผิดชอบด้านปฏิสัมพันธ์เครือข่ายของตนเอง และการรวมกันของพวกมันกำหนดพฤติกรรมของแอปพลิเคชันเมื่อทำงานกับเครือข่าย
การกำหนดค่ากำหนดพารามิเตอร์เซสชัน — จากการหมดเวลาถึงนโยบายการแคช มีสามประเภท: .default (มาตรฐานพร้อมแคชดิสก์), .ephemeral (ไม่บันทึกแคชและคุกกี้) และ .background (สำหรับดาวน์โหลดพื้นหลัง) ในการกำหนดค่า คุณสามารถระบุจำนวนการเชื่อมต่อสูงสุดต่อโฮสต์, การหมดเวลาของคำขอและทรัพยากร, นโยบาย TLS และการตั้งค่าพร็อกซี
URLSessionTask เป็นคลาสพื้นฐานสำหรับการดำเนินการเครือข่ายทั้งหมด คลาสย่อยหลักคือ: URLSessionDataTask สำหรับคำขอ GET และ POST ที่ส่งคืนข้อมูลในหน่วยความจำ, URLSessionDownloadTask สำหรับดาวน์โหลดไฟล์ไปยังดิสก์, URLSessionUploadTask สำหรับอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ และ URLSessionWebSocketTask สำหรับทำงานกับ WebSocket ตั้งแต่ iOS 13
ตัวแทนเซสชันรับเหตุการณ์เกี่ยวกับความคืบหน้าของงาน: การรับข้อมูล, การดาวน์โหลดเสร็จสิ้น, ข้อผิดพลาดการยืนยันตัวตน, การเปลี่ยนเส้นทาง URLSessionDelegate และโปรโตคอลย่อยอนุญาตให้สกัดกั้นใบรับรอง TLS ระหว่างการยืนยันตัวตน, จัดการการแคชคำตอบผ่าน URLCache และติดตามความคืบหน้าการดาวน์โหลดไฟล์ขนาดใหญ่ อีกทางเลือกหนึ่ง สามารถใช้ closures (ตัวจัดการการเสร็จสิ้น) สำหรับกรณีง่าย ๆ ที่ไม่จำเป็นต้องจัดการเหตุการณ์ระหว่างกลาง
ขั้นตอนการทำงานพื้นฐานกับ URLSession เป็นดังนี้: สร้างการกำหนดค่า, สร้างเซสชันตามนั้น, จากนั้นผ่านเซสชันสร้างงานพร้อมคำขอ URL และเริ่มงาน มาดูตัวอย่างคำขอ GET ด้วย closure กัน รูปแบบนี้ใช้ในแอปพลิเคชัน iOS ส่วนใหญ่เพื่อดึงข้อมูลจาก REST API, โหลดรูปภาพ และโต้ตอบกับบริการคลาวด์
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()
ตัวอย่างใช้ URLSession.shared — ซิงเกิลตันที่มีการกำหนดค่า .default สำหรับคำขออย่างง่าย dataTask สร้างการดำเนินการแบบไม่พร้อมกันแต่ไม่ได้เริ่มต้น — คุณต้องเรียก resume() closure ทำงานหลังจากคำขอเสร็จสิ้นและส่งคืน data, response หรือ error สำหรับเซสชันที่กำหนดเองกับการกำหนดค่าของคุณเอง ใช้ตัวเริ่มต้น URLSession(configuration:) ซึ่งอนุญาตให้ตั้งค่านโยบายการแคช, การหมดเวลา, การเชื่อมต่อสูงสุด, ส่วนหัว HTTP เริ่มต้น และการตั้งค่าพร็อกซีสำหรับงานเซสชันทั้งหมด วิธีการนี้ให้คุณควบคุมพฤติกรรมเครือข่ายในแอปพลิเคชันของคุณได้อย่างสมบูรณ์
URLSession รองรับการดาวน์โหลดไฟล์ด้วยความสามารถในการหยุดและดำเนินการต่อ รวมถึงการดาวน์โหลดพื้นหลัง DownloadTask บันทึกไฟล์ไปยังไดเรกทอรีชั่วคราว และใน closure การเสร็จสิ้น คุณต้องย้ายไปยังตำแหน่งถาวร
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()
พารามิเตอร์ location ใน closure ชี้ไปยังไฟล์ชั่วคราวที่ต้องย้าย มิฉะนั้นระบบจะลบมันหลังจากออกจาก closure เพื่อติดตามความคืบหน้า ให้ใช้ตัวแทน URLSessionDownloadDelegate กับเมธอด didWriteData ซึ่งส่งจำนวนไบต์ที่เขียนและขนาดไฟล์ทั้งหมด — ข้อมูลนี้สามารถใช้เพื่อแสดงแถบความคืบหน้าในอินเทอร์เฟซผู้ใช้ เซสชันพื้นหลังกับ downloadTask อนุญาตให้ดาวน์โหลดต่อแม้หลังจากย่อแอป และเมื่อเสร็จสิ้น ระบบจะเรียกตัวจัดการใน AppDelegate
Alamofire คือไลบรารี Swift ที่สร้างบน URLSession ซึ่งให้อินเทอร์เฟซที่ประกาศมากขึ้น การเลือกระหว่าง API ดั้งเดิมและ Alamofire ขึ้นอยู่กับความซับซ้อนของโครงการและความชอบของทีม
| เกณฑ์ | URLSession | Alamofire |
|---|---|---|
| การพึ่งพา | ไม่มี, สร้างใน Foundation | ต้องใช้ SPM หรือ CocoaPods |
| ไวยากรณ์ | จำเป็น (imperative) พร้อม closures | ประกาศ (declarative) พร้อมการต่อโซ่ |
| การจัดการ JSON | JSONSerialization ด้วยตนเอง | responseDecodable กับ Codable |
| ตัวสกัดกั้น | ผ่านตัวแทน | RequestInterceptor, EventMonitor |
| ความคืบหน้า | ผ่านตัวแทน | downloadProgress, uploadProgress |
สำหรับโครงการง่าย ๆ URLSession ก็เพียงพอและไม่เพิ่มการพึ่งพา Alamofire เหมาะสมในโครงการที่มีคำขอเครือข่ายจำนวนมาก การจัดการข้อผิดพลาดที่ซับซ้อน และต้องการไวยากรณ์ที่กระชับ ทั้งสองเทคโนโลยีใช้พื้นฐาน URLSessionConfiguration ร่วมกันและเข้ากันได้ เมื่อเลือก ให้พิจารณาว่า URLSession ถูกควบคุมโดย Apple อย่างสมบูรณ์และอัปเดตพร้อม iOS ในขณะที่ Alamofire ต้องการให้นักพัฒนาไลบรารีรักษาความเข้ากันได้กับเวอร์ชันระบบปฏิบัติการใหม่
Swift สมัยใหม่รองรับ async/await ซึ่งทำให้คำขอเครือข่ายอ่านง่ายขึ้นเมื่อเทียบกับ closures มาดูคำขอ GET เดียวกันโดยใช้ไวยากรณ์แบบไม่พร้อมกัน
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
}
เมธอด data(from:) พร้อมใช้งานตั้งแต่ iOS 15 และ macOS 12 มันส่งคืนทูเพิล (Data, URLResponse) และโยนข้อผิดพลาดเมื่อมีปัญหาเครือข่าย JSONDecoder กับโมเดล Codable จะดีซีเรียลไลซ์คำตอบโดยอัตโนมัติ — ซึ่งแทนที่ JSONSerialization ที่ยุ่งยากจากตัวอย่างก่อนหน้า
สำหรับคำขอ POST พร้อมเนื้อหา JSON จะใช้ URLRequest ซึ่งคุณกำหนดค่าเมธอด, ส่วนหัว Content-Type และเนื้อหาคำขอเป็น Data Async/await ทำให้กระบวนการนี้กระชับและชัดเจน และการจัดการข้อผิดพลาดทำได้ง่ายผ่านบล็อก 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)
}
คำถามที่พบบ่อย
URLSession คือสิ่งทดแทนที่ทันสมัยสำหรับ NSURLConnection ซึ่งเปิดตัวใน iOS 7 ความแตกต่างหลักรวมถึงการรองรับการเชื่อมต่อหลายรายการผ่านเซสชัน, การระงับและดำเนินการงานต่อ, การดาวน์โหลดพื้นหลัง และ WebSocket NSURLConnection เลิกใช้แล้วและไม่แนะนำให้ใช้ในโครงการใหม่
เพื่อติดตามความคืบหน้า ให้ใช้ตัวแทน URLSessionDownloadDelegate กับเมธอด urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) อีกทางเลือกหนึ่ง สำหรับ dataTask คุณสามารถสมัครรับ URLSessionTaskDelegate และรับการอัปเดตผ่าน didSendBodyData
การดาวน์โหลดพื้นหลังถูกกำหนดค่าผ่านการกำหนดค่า .background(withIdentifier:) แอปลงทะเบียนตัวจัดการการเสร็จสิ้นใน AppDelegate และรับผลลัพธ์แม้หลังจากถูกย่อหรือปิด ระบบจัดการการดาวน์โหลดและแจ้งให้แอปทราบผ่านตัวแทน sessionDidFinishEvents
ได้ ตั้งแต่ iOS 13 URLSession รองรับ WebSocket ผ่านคลาส URLSessionWebSocketTask มันถูกสร้างด้วยเมธอด webSocketTask(with:) และให้เมธอด send, receive ที่รองรับข้อความข้อความและไบนารี รวมถึง ping/pong เพื่อรักษาการเชื่อมต่อ
การหมดเวลาถูกกำหนดค่าผ่าน URLSessionConfiguration: คุณสมบัติ timeoutIntervalForRequest (รอคำตอบสำหรับคำขอ) และ timeoutIntervalForResource (เวลาสูงสุดสำหรับการดาวน์โหลดทั้งหมด) ค่าเริ่มต้น: 60 วินาทีสำหรับคำขอ และ 7 วันสำหรับทรัพยากร
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม