Fon rejimidagi URLSession


ULASHISH

Fon rejimidagi URLSession

Fon rejimidagi URL sessiyalari yordamida ilovangiz to‘xtatib qo‘yilganda (suspended) ham davom etadigan yuklash (upload) va yuklab olish (download) amallarini bajaring.


Fon sessiyasini sozlash

Noyob identifikatorga ega fon konfiguratsiyasini yarating, so‘ng delegate bilan URLSession ni yarating.

Sintaksis:

  • URLSessionConfiguration.background(withIdentifier:)
  • URLSession(configuration:delegate:delegateQueue:)

Misol

import Foundation

final class BGSession: NSObject, URLSessionDownloadDelegate {
  static let shared = BGSession()
  lazy var session: URLSession = {
    let config = URLSessionConfiguration.background(withIdentifier: "com.example.bg")
    config.isDiscretionary = true
    return URLSession(configuration: config, delegate: self, delegateQueue: nil)
  }()

  func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
                  didFinishDownloadingTo location: URL) {
    // Move file from temporary location to a permanent URL
  }
}
import SwiftUI

struct ContentView: View {
  var body: some View {
    Text("Background URLSession Setup")
      .padding()
  }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

Misolni ishga tushirish »

Ushbu misol fon sessiyasini sozlaydi va yuklab olish uchun delegate callback funksiyasini realizatsiya qiladi.



Yuklab olish yoki yuklashni boshlash

Katta fayllarni yuklab olish uchun downloadTask dan, yuklash (upload) uchun esa fayl URL’i bilan uploadTask dan foydalaning.

Sintaksis:

  • session.downloadTask(with: url).resume()
  • session.uploadTask(with: request, fromFile: url).resume()

Misol

import Foundation

func startDownload() {
  let url = URL(string: "https://example.com/large.zip")!
  BGSession.shared.session.downloadTask(with: url).resume()
}

func startUpload(file: URL) {
  var req = URLRequest(url: URL(string: "https://example.com/upload")!)
  req.httpMethod = "POST"
  BGSession.shared.session.uploadTask(with: req, fromFile: file).resume()
}
import SwiftUI

struct ContentView: View {
  var body: some View {
    VStack(spacing: 12) {
      Button("Start Download") { startDownload() }
      Button("Start Upload") { /* pick file and call startUpload */ }
    }
    .padding()
  }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

Misolni ishga tushirish »

Ushbu misol fon rejimiga mos yuklab olish va yuklash vazifalarini ishga tushiradi.


Fondagi yakunlanishni qayta ishlash

iOS fon sessiyasi hodisalarini yetkazish uchun ilovangizni qayta ishga tushiradi. Completion handler’ni app delegate’ingizda ulang.

Sintaksis: application(_:handleEventsForBackgroundURLSession:completionHandler:)

Misol

import UIKit

class AppDelegate: UIResponder, UIApplicationDelegate {
  var bgCompletionHandler: (() -> Void)?

  func application(_ application: UIApplication,
    handleEventsForBackgroundURLSession identifier: String,
    completionHandler: @escaping () -> Void) {
    bgCompletionHandler = completionHandler
  }
}

// Later, after URLSession finishes all events:
extension BGSession: URLSessionDelegate {
  func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
    DispatchQueue.main.async {
      (UIApplication.shared.delegate as? AppDelegate)?.bgCompletionHandler?()
      (UIApplication.shared.delegate as? AppDelegate)?.bgCompletionHandler = nil
    }
  }
}
import SwiftUI

struct ContentView: View {
  var body: some View {
    Text("Handle Background Completion")
      .padding()
  }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

Misolni ishga tushirish »

Ushbu misol tizim taqdim etgan completion handler’ni saqlaydi va barcha fon hodisalari qayta ishlangach uni chaqiradi.

Maslahat: Fon sessiyasi identifikatorini taqdim eting va yakunlanish callback funksiyalarini app delegate’da qayta ishlang.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!