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, delegates ή σύγχρονου async/await
  • Συνεδρίες παρασκηνίου επιτρέπουν τη λήψη δεδομένων ακόμη και όταν η εφαρμογή έχει ελαχιστοποιηθεί

Τι είναι το URLSession;

URLSession — είναι το API για λειτουργίες δικτύου που εισήχθη από την Apple στο iOS 7 και macOS 10.9. Αντικατέστησε το NSURLConnection και παρείχε ένα πιο ευέλικτο και ισχυρό μοντέλο για εργασία με το δίκτυο. Η βιβλιοθήκη υποστηρίζει HTTP/1.1, HTTP/2, HTTP/3 και WebSocket, καθώς και συνεδρίες παρασκηνίου για λήψη δεδομένων.

Το κύριο πλεονέκτημα του URLSession έναντι του παλιού NSURLConnection — υποστήριξη για πολλαπλές ταυτόχρονες συνδέσεις μέσω μιας ενιαίας συνεδρίας, προσαρμόσιμες διαμορφώσεις και δυνατότητα παύσης και συνέχισης λήψεων. Συνεδρία ομαδοποιεί ένα σύνολο εργασιών δικτύου με κοινές ρυθμίσεις: προσωρινή αποθήκευση, πολιτική cookies, χρονικά όρια, πιστοποιητικά TLS.

Στο iOS, το URLSession λειτουργεί με την προσωρινή μνήμη DNS συστήματος, τη διαχείριση ενέργειας και τις διεργασίες παρασκηνίου. Όταν η εφαρμογή είναι ελαχιστοποιημένη, το σύστημα μπορεί να συνεχίσει τη λήψη δεδομένων μέσω μιας συνεδρίας παρασκηνίου και μετά την ολοκλήρωση να ειδοποιήσει την εφαρμογή μέσω ενός χειριστή ολοκλήρωσης. Οι συνεδρίες παρασκηνίου είναι ιδιαίτερα χρήσιμες για λήψη μεγάλων αρχείων, ενημέρωση περιεχομένου και συγχρονισμό δεδομένων σε εφαρμογές εργασίας με έγγραφα και αρχεία πολυμέσων. Για εργασία με συνεδρίες παρασκηνίου πρέπει να υλοποιηθεί ο delegate URLSessionDelegate και να μεταβιβαστεί το αναγνωριστικό διαμόρφωσης κατά τη δημιουργία της συνεδρίας — το σύστημα χρησιμοποιεί αυτό το αναγνωριστικό για επαναφορά της συνεδρίας μετά από επανεκκίνηση της εφαρμογής.

Ένα σημαντικό πλεονέκτημα του URLSession είναι η υποστήριξη για HTTP/2 και HTTP/3. Η πολυπλεξία HTTP/2 επιτρέπει την αποστολή πολλαπλών αιτημάτων μέσω μιας σύνδεσης TCP, μειώνοντας την καθυστέρηση και το φορτίο του διακομιστή. Το HTTP/3, βασισμένο στο πρωτόκολλο QUIC πάνω από UDP, εξασφαλίζει ακόμη ταχύτερη εγκατάσταση σύνδεσης εξαλείφοντας τη χειραψία TCP.

Αρχιτεκτονική του URLSession

Η αρχιτεκτονική του URLSession αποτελείται από τρία βασικά στοιχεία: διαμόρφωση συνεδρίας, την ίδια τη συνεδρία και τις εργασίες (tasks). Κάθε στοιχείο είναι υπεύθυνο για μια πτυχή της αλληλεπίδρασης δικτύου και ο συνδυασμός τους καθορίζει τη συμπεριφορά της εφαρμογής κατά την εργασία με το δίκτυο.

URLSessionConfiguration

Η διαμόρφωση ορίζει τις παραμέτρους συνεδρίας — από χρονικά όρια έως πολιτικές προσωρινής αποθήκευσης. Υπάρχουν τρεις τύποι: .default (τυπική με προσωρινή μνήμη δίσκου), .ephemeral (χωρίς αποθήκευση cache και cookies) και .background (για λήψη στο παρασκήνιο). Στη διαμόρφωση μπορεί να οριστεί ο μέγιστος αριθμός συνδέσεων ανά κεντρικό υπολογιστή, το χρονικό όριο αιτήματος και πόρου, η πολιτική TLS και ο διακομιστής μεσολάβησης.

Τύποι εργασιών URLSessionTask

Το URLSessionTask — είναι η βασική κλάση για όλες τις λειτουργίες δικτύου. Οι κύριες υποκλάσεις: URLSessionDataTask για αιτήματα GET και POST με επιστροφή δεδομένων στη μνήμη, URLSessionDownloadTask για λήψη αρχείων στο δίσκο, URLSessionUploadTask για αποστολή αρχείων στο διακομιστή και URLSessionWebSocketTask για εργασία με WebSocket από το iOS 13.

Delegates του URLSession

Ο delegate συνεδρίας λαμβάνει γεγονότα σχετικά με την πρόοδο των εργασιών: λήψη δεδομένων, ολοκλήρωση λήψης, σφάλματα ταυτοποίησης, ανακατευθύνσεις. URLSessionDelegate και τα υποπρωτόκολλά του επιτρέπουν την παρεμβολή πιστοποιητικών TLS κατά την ταυτοποίηση, τη διαχείριση προσωρινής αποθήκευσης απαντήσεων μέσω URLCache και την παρακολούθηση προόδου λήψης μεγάλων αρχείων. Εναλλακτικά, μπορούν να χρησιμοποιηθούν closures (completion handlers) σε απλές περιπτώσεις όπου δεν απαιτείται επεξεργασία ενδιάμεσων γεγονότων.

Πώς να κάνετε αιτήματα με το URLSession

Το βασικό σενάριο εργασίας με το URLSession είναι το εξής: δημιουργείται μια διαμόρφωση, βάσει αυτής μια συνεδρία, στη συνέχεια μέσω της συνεδρίας δημιουργείται μια εργασία με ένα αίτημα URL και η εργασία ξεκινά. Ας εξετάσουμε ένα παράδειγμα αιτήματος GET με closure. Αυτό το μοτίβο χρησιμοποιείται στις περισσότερες εφαρμογές iOS για λήψη δεδομένων από REST API, φόρτωση εικόνων και αλληλεπίδραση με υπηρεσίες cloud.

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!.localizedDescription)")
        return
    }
    if let json = try? JSONSerialization.jsonObject(with: data) {
        print("JSON: \(json)")
    }
}
task.resume()

Στο παράδειγμα χρησιμοποιείται URLSession.shared — ένα singleton με διαμόρφωση .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. Για παρακολούθηση προόδου χρησιμοποιείται ο delegate URLSessionDownloadDelegate με τη μέθοδο didWriteData, η οποία μεταδίδει τον αριθμό των εγγεγραμμένων byte και το συνολικό μέγεθος του αρχείου — αυτά τα δεδομένα μπορούν να χρησιμοποιηθούν για εμφάνιση γραμμής προόδου στη διεπαφή χρήστη. Οι συνεδρίες παρασκηνίου με downloadTask επιτρέπουν τη συνέχιση της λήψης ακόμη και μετά την ελαχιστοποίηση της εφαρμογής και μετά την ολοκλήρωση το σύστημα καλεί τον χειριστή στο AppDelegate.

URLSession εναντίον Alamofire

Το Alamofire — είναι μια βιβλιοθήκη Swift χτισμένη πάνω στο URLSession που παρέχει πιο δηλωτική διεπαφή. Η επιλογή μεταξύ του εγγενούς API και του Alamofire εξαρτάται από την πολυπλοκότητα του έργου και τις προτιμήσεις της ομάδας.

ΚριτήριοURLSessionAlamofire
ΕξαρτήσειςΌχι, ενσωματωμένο στο FoundationΑπαιτεί SPM ή CocoaPods
ΣύνταξηΠροστακτική με closuresΔηλωτική με αλυσίδες
Επεξεργασία JSONJSONSerialization χειροκίνηταresponseDecodable με Codable
ΠαρεμβολείςΜέσω delegatesRequestInterceptor, EventMonitor
ΠρόοδοςΜέσω delegatedownloadProgress, uploadProgress

Για απλά έργα το URLSession είναι επαρκές και δεν προσθέτει εξαρτήσεις. Το Alamofire δικαιολογείται σε έργα με πολλά αιτήματα δικτύου, σύνθετο χειρισμό σφαλμάτων και απαίτηση συνοπτικής σύνταξης. Και οι δύο τεχνολογίες χρησιμοποιούν την κοινή βάση URLSessionConfiguration και είναι συμβατές μεταξύ τους. Κατά την επιλογή πρέπει να ληφθεί υπόψη ότι το URLSession ελέγχεται πλήρως από την Apple και ενημερώνεται μαζί με το iOS, ενώ το Alamofire απαιτεί υποστήριξη συμβατότητας με νέες εκδόσεις OS από τους προγραμματιστές της βιβλιοθήκης.

Παραδείγματα κώδικα 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;

Για παρακολούθηση προόδου χρησιμοποιείται ο delegate URLSessionDownloadDelegate με τη μέθοδο urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Εναλλακτικά, για dataTask μπορείτε να εγγραφείτε στο URLSessionTaskDelegate και να λαμβάνετε ενημερώσεις μέσω didSendBodyData.

Πώς μπορώ να κάνω λήψη στο παρασκήνιο με το URLSession;

Η λήψη στο παρασκήνιο διαμορφώνεται μέσω του .background(withIdentifier:). Η εφαρμογή καταχωρεί έναν χειριστή ολοκλήρωσης στο AppDelegate και λαμβάνει αποτελέσματα ακόμη και μετά από ελαχιστοποίηση ή κλείσιμο. Το σύστημα διαχειρίζεται τη λήψη και ειδοποιεί την εφαρμογή μέσω του delegate 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
  • Delegates επιτρέπουν τη διαχείριση ταυτοποίησης, προόδου και ανακατευθύνσεων
  • Async/await από iOS 15 καθιστά τον κώδικα URLSession πιο ευανάγνωστο και συνοπτικό
  • Επιλογή URLSession ή Alamofire εξαρτάται από την κλίμακα του έργου — το URLSession είναι επαρκές για απλές εργασίες

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης