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!)
    })

}

1 Like
#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

1 Like
#7

Salut à tous,

Je reprends mon propre fil pour donner quelques news, quelqu’un pourrait être intéressé dans le futur.

Après avoir concu presque toute mon app avec un modele de chrono classique, je me suis lancé dans la convertion de ce chrono vers un modele de comparaison de dates.
Le but étant de soustraire la date actuelle (celle du moment où on regarde le chrono) à la date à laquelle a été lancée le chrono.

Pourquoi m’embêter à faire ça? Tout simplement pour ne pas que mon chrono s’arrête lorsque je quitte momentanément l’app… les taches de background finissent toujours par s’arrêter, mais le temps lui ne s’arrête pas, la difference entre les deux dates augmentera toujours!
Il suffit alors de relancer la mise a jour du chrono toutes les secondes dès que l’app sort du background.

Il y a quelques ajustements à faire, des choses pas super instinctives. Il faut par exemple, lorsque l’on met le chrono en pause volontairement, soustraire le temps passé en pause à l’actualisation du chrono… on a donc besoin d’un deuxieme timer pour déterminer ce temps de pause.

Je ne rentre pas trop dans le détail, mais si un jour vous voulez en savoir plus n’hésitez pas!
Car it possi le, et cette solution est tres utile pour éviter qu’un timer s’arrête si l’on reste plus de é minutes hors de l’appli!

Guillaume