Fon rejimidagi URLSession
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() }
}
}
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() }
}
}
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() }
}
}
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!
