Sobes.tech
Middle

Kaip užtikrinti, kad programa veiktų fone?

sobes.tech AI

Atsakymas iš AI

Įvairūs iOS mechanizmai, priklausomai nuo užduoties tipo:

  • Background Modes (Fono režimai): Tai iš anksto nustatyti sisteminiai režimai, leidžiantys vykdyti tam tikras operacijas fono režimu. Dažniausiai naudojami:

    • audio: garso atkūrimas arba įrašymas.
    • location: vietos stebėjimas.
    • voip: VoIP telefonijos paslaugų veikimas.
    • fetch: reguliariai naujo turinio įkėlimas.
    • processing: išteklių reikalaujančios užduotys.
    • remote-notification: push pranešimų apdorojimas.

    Norint aktyvuoti foninius režimus, reikia pridėti atitinkamus raktus į Info.plist arba naudoti Capabilities Xcode.

  • Background Task (Fono užduotis): leidžia gauti ribotą laiką, kad užbaigtumėte esamą užduotį, kai programa pereina į foninį režimą.

    var backgroundTask: UIBackgroundTaskIdentifier = .invalid
    
    func registerBackgroundTask() {
        backgroundTask = UIApplication.shared.beginBackgroundTask {
            // laiko pabaigos apdorojimas
            self.endBackgroundTask()
        }
        // vykdyti foninę užduotį
        // ...
    }
    
    func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }
    
  • Background Fetch (Fono įkėlimas): sistema gali periodiškai paleisti programą fone, kad patikrintų ir įkeltų naują turinį.

    // AppDelegate, didFinishLaunchingWithOptions
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
    
    // didFinishLaunchingWithOptions arba atskiras metodas
    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // vykdyti asinchroninį duomenų įkėlimą
        // pasibaigus, iškviesti completionHandler su atitinkamu rezultatu:
        // .newData, .noData, .failed
        completionHandler(.newData)
    }
    
  • Background Processing (Fono apdorojimas): skirtas vykdyti išteklių reikalaujančias užduotis, kurios gali užtrukti ilgai. Naudojama su BGTaskScheduler.

    import BackgroundTasks
    
    let taskID = "com.yourapp.mytask"
    
    func registerBackgroundTasks() {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: taskID) { task in
            // vykdyti užduotį
            self.handleBackgroundTask(task: task as! BGProcessingTask)
        }
    }
    
    func handleBackgroundTask(task: BGProcessingTask) {
        // vykdyti ilgą užduotį
        // pažymėti užduotį kaip užbaigtą
        task.setTaskCompleted(success: true)
    }
    
    // užduoties planavimas
    func scheduleBackgroundProcessingTask() {
        let request = BGProcessingTaskRequest(identifier: taskID)
        // nustatyti vykdymo reikalavimus (pvz., tinklo ryšys, baterijos įkrova)
        request.requiresNetworkConnectivity = true
    
        do {
            try BGTaskScheduler.shared.submit(request)
        } catch {
            print("Nepavyko suplanuoti užduoties: \(error)")
        }
    }
    
  • Push Notifications (Push pranešimai): tylios push žinutės gali būti naudojamos programos aktyvavimui fone ir naujo turinio įkėlimui.

  • Work Manager (Android) analogas iOS (netiesioginis): BGTaskScheduler yra Android Work Manager analogas, leidžiantis planuoti fonines užduotis, atsižvelgiant į sisteminius išteklius ir apribojimus.

Pasirinkimas priklauso nuo užduoties tipo, kurią reikia atlikti fone. Netinkamas mechanizmas gali sukelti programos atmetimą App Store ir greitą foninių procesų užbaigimą sistema. Taip pat svarbu tausoti sisteminius išteklius: bateriją, atmintį ir CPU.