Un timer qui continue de tourner en arrière plan?


#1

Bonsoir à tous!

Je suis actuellement sur une appli qui nécessite un timer (visible à l’écran), et ça serait vraiment bien que celui ci ne se mette pas en pause dès que l’app passe en arrière plan, par exemple lorsque l’on change d’app pour quelques secondes, ou qu’on va juste voir l’écran d’accueil de l’iPhone…

J’ai pas mal cherché sur internet et il semble que ce soit très compliqué, les possibilités de taches d’arrière plan étant semble t il limitées à des besoins très spécifiques (écoute de musique, téléchargement de données…).

Pourtant le Timer officiel d’Apple, lui, ne s’arrête pas lorsque l’on sort de l’app. C’est peut être une exception qu’Apple s’est accordé…

Mais quelqu’un a-t-il une idée qui pourrait me sauver?

Merci :slight_smile:

Guillaume


#2

Salut Guillaume;

Rajoute sa dans ton code :

var backgroundTaskIdentifier: UIBackgroundTaskIdentifier?

override func viewDidLoad() {
super.viewDidLoad()

    backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
    })

}


#3

Bonsoir Samir!

Tout d’abord, mille merci!

Ensuite…d’où sort cette merveille?
J’ai pourtant pas mal cherché toutes les fonctions dans la doc d’Apple traitant des taches en arrière plan…
Le applicationDidEnterBackground(:), le beginBackgroundTask(withName:expirationHandler:), le backgroundTimeRemaining, le setMinimumBackgroundFetchInterval(:slight_smile: et j’en passe…

Même stack overflow semblait unanime ^^

Sais tu quelles sont ses limites, quelles sont les conditions pour que cette tache d’arrière plan perdure?

Je viens à peine d’essayer et de constater que ta solution fonctionne, je vais investiguer et chercher d’où vient le miracle… :slight_smile:

Bonne soirée!

Guillaume


#4

Je viens de regarder un peu tout ça, et c’est une super solution si on ne reste pas trop longtemps en background. Il semble que la limite maximale de durée pendant que la tache de fond continue de fonctionner est de 180 secondes. Je l’ai constaté dans mon app.
A titre personnel ça me convient tout à fait, pour l’usage que je fais de mon app.
Mais si je compte la mettre un jour sur l’App Store…

Je me demandais si il est possible de déterminer un timer qui fonctionnerait non pas avec une variable dont on incrémente la valeur touted les secondes, mais qui serait mise à jour en fonction de l’heure.

La variable stockée serait alors une constante, l’heure à laquelle on a démarré le timer, et la mise à jour serait faite en fonction de cette heure, en comparant avec l’heure “actuelle”.

En parvenant à stocker cette heure de départ quelque part (Realm?) lorsque l’app est longtemps mise en arrière plan, ça pourrait régler le problème, le chrono se mettrait à jour dès la réouverture de l’app!

Guillaume


#5

Super nouvelle , content que cela t’es aider. Pour modifier cette durée essaye d’activer dans la section “capabitilies” la ligne background Mod .

Oui biensur tu peut utiliser l’heure pour regler ton timer. Je te conseil d’utiliser les notifications “UIApplicationDidEnterBackground” et “UIApplicationWillEnterForeground”. Effectivement l’idée est de stocker l’heure “quand l’app entre en back” et l’heure quand l’app “se reveille” et de comparer les secondes entre les deux. Pour la manipulation des Date je te conseil d’utiliser ce framework génialissime “DateTools” https://github.com/MatthewYork/DateTools

Bon courage à toi :slight_smile:


#6

Super, merci pour ce conseil et pour le framework! Je suis pour le moment sur l’interface graphique de mon app, je testerai ça lorsque je l’aurai terminé! :slight_smile:

Guillaume