Hintergrundaktivität

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hintergrundaktivität

    Hallo,

    ich versuche über eine Klasse Daten in die Zwischablage zu kopieren und nach einem bestimmten Zeitintervall zu löschen, falls der Inhalt noch der von mir kopierte ist.

    Quellcode

    1. import SwiftUI
    2. public class Clipboard {
    3. /// The background task.
    4. private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier.invalid
    5. /// Creates a new instance from Swift objects.
    6. ///
    7. /// - Parameters:
    8. /// - value: The value to be copy to the clipboard.
    9. /// - timeout: The time in seconds after which the clipboard is erased.
    10. public init(value: String, timeout: Double?) {
    11. UIPasteboard.general.setValue(value, forPasteboardType: "public.plain-text")
    12. if let timeout {
    13. backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
    14. self?.endBackgroundTask()
    15. }
    16. Timer.scheduledTimer(withTimeInterval: timeout,repeats: false) { [weak self] _ in
    17. if UIPasteboard.general.string == value {
    18. UIPasteboard.general.setValue("", forPasteboardType: "public.plain-text")
    19. }
    20. self?.endBackgroundTask()
    21. }
    22. }
    23. }
    24. /// Finished the background task.
    25. private func endBackgroundTask() {
    26. UIApplication.shared.endBackgroundTask(backgroundTask)
    27. backgroundTask = UIBackgroundTaskIdentifier.invalid
    28. }
    29. }
    Alles anzeigen
    Solange ich im in meiner App befinde, funktioniert das Kopieren und Löschen auch.
    Sobald ich die App verlasse funktioniert das Löschen jedoch nicht mehr.

    Habt Ihr einen Tipp?
  • Du hast Dir den Tipp eigentlich schon fast selber gegeben: Eine App im Hintergrund wird unter iOS nach wenigen Sekunden deaktiviert, d. h. es finden keine Hintergrundaktivitäten mehr statt. Für bestimmte Fälle kannst Du eine Background Execution konfigurieren: Früher war das sehr restriktiv für Playback, Routing etc., aber inzwischen lassen sich diverse Verwendungen konfigurieren - ich würde bei Dir "Background Processing" vermuten.

    Eigene Erfahrungen mit dem genannten BGTaskScheduler habe ich nicht, aber nach meinem Verständnis könntest Du über BGTaskRequest die (frühste) Startzeit mitgeben und müsstest den Task-Identifier beim App-Start registrieren...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich bin mir nicht sicher, ob tatsächlich hier das Problem liegt.
    Wenn ich die App in den Hintergrund lege bekomme ich nämlich folgende Fehlermeldung in der Konsole:

    Quellcode

    1. 2022-09-15 20:49:04.235783+0200 OwnPassword[957:29641] [Pasteboard] ...retrieving pasteboard named com.apple.UIKit.pboard.general failed with error: Error Domain=PBErrorDomain Code=10 "Pasteboard com.apple.UIKit.pboard.general is not available at this time." UserInfo={NSLocalizedDescription=Pasteboard com.apple.UIKit.pboard.general is not available at this time.}

    Und kurz drauf noch diese beiden

    Quellcode

    1. 2022-09-15 20:49:27.112115+0200 OwnPassword[957:29641] [BackgroundTask] Background task still not ended after expiration handlers were called: <_UIBackgroundTaskInfo: 0x281fbcec0>: taskID = 2, taskName = Called by OwnPassword, from $s15OwnAppFramework9ClipboardC5value7timeoutACSS_SdSgtcfc, creationTime = 3041 (elapsed = 28). This app will likely be terminated by the system. Call UIApplication.endBackgroundTask(_:) to avoid this.
    2. 2022-09-15 20:49:49.737583+0200 OwnPassword[957:29641] [BackgroundTask] Background Task 2 ("Called by OwnPassword, from $s15OwnAppFramework9ClipboardC5value7timeoutACSS_SdSgtcfc"), was created over 30 seconds ago. In applications running in the background, this creates a risk of termination. Remember to call UIApplication.endBackgroundTask(_:) for your task in a timely manner to avoid this.

    Ich verstehe nur nicht, was ich nun tun muss.
  • also ich finde das nicht lustig wenn eine App die ich beendet habe mir meinen Clipboard Inhalt verändern kann…. Ich finde das schon nicht witzig wenn eine laufende App das automatisch kann ohne mein aktives Eingreifen.
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    also ich finde das nicht lustig wenn eine App die ich beendet habe mir meinen Clipboard Inhalt verändern kann…. Ich finde das schon nicht witzig wenn eine laufende App das automatisch kann ohne mein aktives Eingreifen.
    Das kann der Benutzer natürlich einstellen, ob er das will und falls ja nach welcher Zeit.
    Bei der App geht es mir auch darum Swift und SwiftUI zu lernen und nicht eine produktive App zu erstellen.
  • Das Ergebnis wird noch etwas auf sich warten lassen.
    Ich musste umbauen, da der Modifier .backgroundTask für Scene und nicht View ist.
    Jetzt laufe ich in den bekannten Compiler-Fehler der erst in Xcode 14.1 gefixt sein soll