URLSession — คืออะไร, API เครือข่าย และทำงานอย่างไรใน iOS

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-07 เวลาอ่าน: 8 นาที

URLSession คือ API สำหรับคำขอเครือข่ายใน iOS และ macOS ซึ่งเป็นส่วนหนึ่งของ Foundation framework ที่ให้อินเทอร์เฟซแบบรวมสำหรับการทำงานกับ HTTP, HTTPS, การดาวน์โหลดพื้นหลัง และ WebSocket มันแทนที่ NSURLConnection ที่ล้าสมัยและกลายเป็นเครื่องมือเครือข่ายหลักสำหรับนักพัฒนา Apple ตาม Apple Developer Documentation (2025), URLSession จัดการการรับส่งข้อมูลเครือข่ายมากกว่า 90% ในแอปพลิเคชัน iPhone และ iPad

ประเด็นสำคัญ

  • URLSession — API ดั้งเดิมของ Apple สำหรับคำขอเครือข่าย, HTTP, การดาวน์โหลดไฟล์ และ WebSocket
  • ประเภทงาน: dataTask (คำขอ), downloadTask (ดาวน์โหลด), uploadTask (อัปโหลด), webSocketTask
  • การกำหนดค่า เซสชันกำหนดพฤติกรรม: การแคช, หมดเวลา, พร็อกซี, ข้อมูลประจำตัว
  • ความไม่พร้อมกัน ถูกนำไปใช้ผ่าน closures, ตัวแทน หรือ async/await สมัยใหม่
  • เซสชันพื้นหลัง อนุญาตให้โหลดข้อมูลแม้ในขณะที่แอปถูกย่อ

URLSession คืออะไร?

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

สถาปัตยกรรม URLSession ประกอบด้วยสามองค์ประกอบหลัก: การกำหนดค่าเซสชัน, เซสชันเอง, และงาน แต่ละองค์ประกอบรับผิดชอบด้านปฏิสัมพันธ์เครือข่ายของตนเอง และการรวมกันของพวกมันกำหนดพฤติกรรมของแอปพลิเคชันเมื่อทำงานกับเครือข่าย

URLSessionConfiguration

การกำหนดค่ากำหนดพารามิเตอร์เซสชัน — จากการหมดเวลาถึงนโยบายการแคช มีสามประเภท: .default (มาตรฐานพร้อมแคชดิสก์), .ephemeral (ไม่บันทึกแคชและคุกกี้) และ .background (สำหรับดาวน์โหลดพื้นหลัง) ในการกำหนดค่า คุณสามารถระบุจำนวนการเชื่อมต่อสูงสุดต่อโฮสต์, การหมดเวลาของคำขอและทรัพยากร, นโยบาย TLS และการตั้งค่าพร็อกซี

ประเภทของ URLSessionTask

URLSessionTask เป็นคลาสพื้นฐานสำหรับการดำเนินการเครือข่ายทั้งหมด คลาสย่อยหลักคือ: URLSessionDataTask สำหรับคำขอ GET และ POST ที่ส่งคืนข้อมูลในหน่วยความจำ, URLSessionDownloadTask สำหรับดาวน์โหลดไฟล์ไปยังดิสก์, URLSessionUploadTask สำหรับอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ และ URLSessionWebSocketTask สำหรับทำงานกับ WebSocket ตั้งแต่ iOS 13

ตัวแทนของ URLSession

ตัวแทนเซสชันรับเหตุการณ์เกี่ยวกับความคืบหน้าของงาน: การรับข้อมูล, การดาวน์โหลดเสร็จสิ้น, ข้อผิดพลาดการยืนยันตัวตน, การเปลี่ยนเส้นทาง URLSessionDelegate และโปรโตคอลย่อยอนุญาตให้สกัดกั้นใบรับรอง TLS ระหว่างการยืนยันตัวตน, จัดการการแคชคำตอบผ่าน URLCache และติดตามความคืบหน้าการดาวน์โหลดไฟล์ขนาดใหญ่ อีกทางเลือกหนึ่ง สามารถใช้ closures (ตัวจัดการการเสร็จสิ้น) สำหรับกรณีง่าย ๆ ที่ไม่จำเป็นต้องจัดการเหตุการณ์ระหว่างกลาง

วิธีทำคำขอด้วย URLSession

ขั้นตอนการทำงานพื้นฐานกับ URLSession เป็นดังนี้: สร้างการกำหนดค่า, สร้างเซสชันตามนั้น, จากนั้นผ่านเซสชันสร้างงานพร้อมคำขอ URL และเริ่มงาน มาดูตัวอย่างคำขอ GET ด้วย closure กัน รูปแบบนี้ใช้ในแอปพลิเคชัน iOS ส่วนใหญ่เพื่อดึงข้อมูลจาก REST API, โหลดรูปภาพ และโต้ตอบกับบริการคลาวด์

swift
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

URLSession รองรับการดาวน์โหลดไฟล์ด้วยความสามารถในการหยุดและดำเนินการต่อ รวมถึงการดาวน์โหลดพื้นหลัง DownloadTask บันทึกไฟล์ไปยังไดเรกทอรีชั่วคราว และใน closure การเสร็จสิ้น คุณต้องย้ายไปยังตำแหน่งถาวร

swift
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

URLSession vs Alamofire

Alamofire คือไลบรารี Swift ที่สร้างบน URLSession ซึ่งให้อินเทอร์เฟซที่ประกาศมากขึ้น การเลือกระหว่าง API ดั้งเดิมและ Alamofire ขึ้นอยู่กับความซับซ้อนของโครงการและความชอบของทีม

เกณฑ์URLSessionAlamofire
การพึ่งพาไม่มี, สร้างใน Foundationต้องใช้ SPM หรือ CocoaPods
ไวยากรณ์จำเป็น (imperative) พร้อม closuresประกาศ (declarative) พร้อมการต่อโซ่
การจัดการ JSONJSONSerialization ด้วยตนเองresponseDecodable กับ Codable
ตัวสกัดกั้นผ่านตัวแทนRequestInterceptor, EventMonitor
ความคืบหน้าผ่านตัวแทนdownloadProgress, uploadProgress

สำหรับโครงการง่าย ๆ URLSession ก็เพียงพอและไม่เพิ่มการพึ่งพา Alamofire เหมาะสมในโครงการที่มีคำขอเครือข่ายจำนวนมาก การจัดการข้อผิดพลาดที่ซับซ้อน และต้องการไวยากรณ์ที่กระชับ ทั้งสองเทคโนโลยีใช้พื้นฐาน URLSessionConfiguration ร่วมกันและเข้ากันได้ เมื่อเลือก ให้พิจารณาว่า URLSession ถูกควบคุมโดย Apple อย่างสมบูรณ์และอัปเดตพร้อม iOS ในขณะที่ Alamofire ต้องการให้นักพัฒนาไลบรารีรักษาความเข้ากันได้กับเวอร์ชันระบบปฏิบัติการใหม่

ตัวอย่างโค้ด URLSession

Swift สมัยใหม่รองรับ async/await ซึ่งทำให้คำขอเครือข่ายอ่านง่ายขึ้นเมื่อเทียบกับ closures มาดูคำขอ GET เดียวกันโดยใช้ไวยากรณ์แบบไม่พร้อมกัน

swift
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

สำหรับคำขอ POST พร้อมเนื้อหา JSON จะใช้ URLRequest ซึ่งคุณกำหนดค่าเมธอด, ส่วนหัว Content-Type และเนื้อหาคำขอเป็น Data Async/await ทำให้กระบวนการนี้กระชับและชัดเจน และการจัดการข้อผิดพลาดทำได้ง่ายผ่านบล็อก do-catch

swift
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 อย่างไร?

URLSession คือสิ่งทดแทนที่ทันสมัยสำหรับ NSURLConnection ซึ่งเปิดตัวใน iOS 7 ความแตกต่างหลักรวมถึงการรองรับการเชื่อมต่อหลายรายการผ่านเซสชัน, การระงับและดำเนินการงานต่อ, การดาวน์โหลดพื้นหลัง และ WebSocket NSURLConnection เลิกใช้แล้วและไม่แนะนำให้ใช้ในโครงการใหม่

จะติดตามความคืบหน้าการดาวน์โหลดใน URLSession ได้อย่างไร?

เพื่อติดตามความคืบหน้า ให้ใช้ตัวแทน URLSessionDownloadDelegate กับเมธอด urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) อีกทางเลือกหนึ่ง สำหรับ dataTask คุณสามารถสมัครรับ URLSessionTaskDelegate และรับการอัปเดตผ่าน didSendBodyData

จะทำการดาวน์โหลดพื้นหลังด้วย URLSession ได้อย่างไร?

การดาวน์โหลดพื้นหลังถูกกำหนดค่าผ่านการกำหนดค่า .background(withIdentifier:) แอปลงทะเบียนตัวจัดการการเสร็จสิ้นใน AppDelegate และรับผลลัพธ์แม้หลังจากถูกย่อหรือปิด ระบบจัดการการดาวน์โหลดและแจ้งให้แอปทราบผ่านตัวแทน sessionDidFinishEvents

สามารถใช้ URLSession กับ WebSocket ได้หรือไม่?

ได้ ตั้งแต่ iOS 13 URLSession รองรับ WebSocket ผ่านคลาส URLSessionWebSocketTask มันถูกสร้างด้วยเมธอด webSocketTask(with:) และให้เมธอด send, receive ที่รองรับข้อความข้อความและไบนารี รวมถึง ping/pong เพื่อรักษาการเชื่อมต่อ

จะกำหนดค่าหมดเวลาใน URLSession ได้อย่างไร?

การหมดเวลาถูกกำหนดค่าผ่าน URLSessionConfiguration: คุณสมบัติ timeoutIntervalForRequest (รอคำตอบสำหรับคำขอ) และ timeoutIntervalForResource (เวลาสูงสุดสำหรับการดาวน์โหลดทั้งหมด) ค่าเริ่มต้น: 60 วินาทีสำหรับคำขอ และ 7 วันสำหรับทรัพยากร

สรุป

  • URLSession — API ดั้งเดิมของ Apple สำหรับคำขอเครือข่าย, รองรับ HTTP, การดาวน์โหลดพื้นหลัง และ WebSocket
  • การกำหนดค่าสามประเภท (.default, .ephemeral, .background) กำหนดพฤติกรรมของเซสชัน
  • งานสี่ประเภท ครอบคลุมทุกสถานการณ์: dataTask, downloadTask, uploadTask, webSocketTask
  • ตัวแทน อนุญาตให้จัดการการยืนยันตัวตน, ความคืบหน้า และการเปลี่ยนเส้นทาง
  • Async/await ตั้งแต่ iOS 15 ทำให้โค้ด URLSession อ่านง่ายและกระชับยิ่งขึ้น
  • การเลือก URLSession หรือ Alamofire ขึ้นอยู่กับขนาดโครงการ — URLSession เพียงพอสำหรับงานง่าย ๆ

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม