Getting iOS temps de disponibilité du système, qui ne fait pas de pause pendant les heures de sommeil
Je suis à la recherche d'un moyen d'obtenir un absolu, toujours-l'incrémentation de la disponibilité du système sur iOS.
Il doit retourner le temps depuis la dernière redémarré, et de ne pas être affecté par les changements de la date du système.
Toutes les méthodes que je peux trouver, soit en pause lorsque l'appareil est en veille (CACurrentMediaTime
, [NSProcessInfo systemUptime]
, mach_absolute_time
) ou sont modifiés lorsque le système de changement de date (sysctl/KERN_BOOTTIME
).
Des idées?
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai travaillé dessus.
time()
porte sur l'incrémentation alors que l'appareil est en veille, mais bien sûr, peut être manipulé par le système d'exploitation ou de l'utilisateur. Cependant, le Noyau de démarrage (un horodatage quand le système le dernier démarrage) change également lorsque l'horloge du système est modifié, par conséquent, même si ces deux valeurs ne sont pas fixes, le décalage entre eux.Comme dit dans un des commentaires, POSIX est
clock_gettime()
a été mis en œuvre dans iOS 10 et macOS 10.12. Lorsqu'il est utilisé avec leCLOCK_MONOTONIC
argument, il ne semble pas retourner la disponibilité de la valeur. Cependant, ce n'est pas garanti par la documentation:Et un extrait du correspondant macOS homme page:
Noter que
CLOCK_MONOTONIC
retourne avec une précision tout enCLOCK_MONOTONIC_RAW
avec une précision à la nanoseconde.Code Swift:
Pour ceux qui sont encore intéressés par l'obtention du noyau au moment du démarrage rapide:
Il y a une condition de concurrence dans tous les exemples ci: si il y a un changement de temps (NTP ou modifié par l'utilisateur), le code de la race et de l'horloge n'est plus monotone.
La mise en œuvre correcte est:
us_since_boot
. C'est juste un temps de démarrage, pas du temps écoulé depuis le démarrage.boottime.tv_sec * 1000000
ounow.tv_sec * 1000000
(sur les plates-formes 32 bits, il est facile à attraper). Pour éviter ce problème, vous devez le faire directement en fonte.Si une plus grande précision est nécessaire, alors ci-dessous est une version modifiée de accepté de répondre.
J'avais commentaire sur Leszek réponse, mais pas assez de rep... Leszek la solution de retours secondes.
Ce qui suit est une version modifiée de Leszek la réponse si quelqu'un a besoin de la précision à la milliseconde.
Pourquoi ne pas utiliser systemUptime?
systemUptime
Renvoie combien de temps il a été depuis que l'ordinateur a été redémarré.
Valeur De Retour
Un NSTimeInterval indiquant depuis combien de temps, l'ordinateur a été redémarré.
Disponibilité
Disponible en iOS 4.0 et versions ultérieures.
Déclaré Dans
NSProcessInfo.h
J'ai testé et prouvé qu'au moins sur l'iPhone 5 avec iOS 7.1.1, systemUptime NE s'arrête PAS lorsque votre téléphone est verrouillé. Si quelqu'un ne pense pas qu'il puisse le tester vous-même.