Clock Sync (synchronizace hodin) — proces slaďování údajů vnitřních hodin zařízení s referenčním zdrojem času. V mobilních aplikacích je přesná synchronizace kritická pro správnou funkci push notifikací, SSL/TLS certifikátů, kryptografických protokolů a analýzy. Podle Google Security Blog (2024) je více než 30 % selhání HTTPS připojení na mobilních zařízeních způsobeno desynchronizací systémového času o více než 5 sekund.
Hlavní body
Synchronizace hodin (Clock Sync) — je mechanismus přizpůsobení vnitřních hodin zařízení referenčnímu času UTC (Universal Coordinated Time). Bez synchronizace se křemíkový oscilátor v mobilním zařízení postupně rozchází — odchylka činí 1–10 sekund denně v závislosti na teplotě a kvalitě součástek. Synchronizace tuto odchylku kompenzuje získáním přesného času z externích zdrojů: NTP serverů na internetu, GPS satelitů nebo mobilních základnových stanic. Ideálně by se zařízení mělo synchronizovat každé 4–6 hodin pro udržení přesnosti v rozmezí 1 sekundy.
V mobilním zařízení existují dva typy hodin: hardwarové (RTC, Real-Time Clock) s odděleným napájením z baterie — fungují i při vypnutém zařízení, a softwarové (system time) spravované operačním systémem. Při spuštění zařízení je systémový čas inicializován z RTC a poté udržován pomocí přerušení generátoru hodinového signálu. Synchronizace NTP koriguje systémový čas a v některých případech zapisuje korekci i do RTC. V Androidu je přístup k hardwarovému RTC omezen — aplikace jej nemohou měnit bez root oprávnění.
Mnoho aspektů fungování mobilní aplikace kriticky závisí na přesném systémovém čase. SSL certifikáty mají dobu platnosti: pokud je na zařízení čas nastaven dříve než datum vydání certifikátu nebo později než datum jeho vypršení, bude HTTPS připojení zablokováno. OAuth tokeny a JWT autentizace používají časová razítka pro kontrolu platnosti — desynchronizace vede k falešnému odmítání autorizace. Push notifikace jsou plánovány podle času, a pokud se hodiny rozcházejí, uživatel dostává notifikace v nesprávnou dobu nebo je nedostává vůbec.
Bezpečnost aplikací také trpí nesprávným časem: časově založené šifrování (time-based OTP), protokoly událostí s nesprávnými časovými razítky, nesprávná funkce rate-limiting na straně serveru (server blokuje „budoucí“ požadavky). Podle OWASP Mobile Top 10 (2024) spadá nedůvěra k systémovému času do kategorie nedostatečného zabezpečení platformy. Vývojářům se doporučuje vždy kontrolovat čas na serveru, nikoli spoléhat výhradně na hodiny klienta. Pokud rozdíl překročí práh (doporučeno 5 sekund), aplikace by měla blokovat kritické operace až do synchronizace.
| Scénář | Efekt desynchronizace |
|---|---|
| HTTPS/TLS | Certifikáty jsou považovány za prošlé nebo neplatné |
| OAuth 2.0 / JWT | Tokeny jsou odmítány jako prošlé |
| Push notifikace | Notifikace přicházejí v nesprávnou dobu |
| Analytika | Události s nesprávnými časovými razítky zkreslují zprávy |
| Kryptografie | Time-based OTP nesouhlasí se serverem |
| Rate limiting | Server blokuje požadavky s „budoucím“ časem |
Hlavní protokoly pro synchronizaci hodin — NTP a jeho zjednodušená verze SNTP. NTP (RFC 5905) — plný protokol s filtrováním serverů, analýzou odchylky a korekcí PLL. Používá se na serverech a síťových zařízeních. SNTP (RFC 4330) — odlehčená verze pro klientská zařízení, nevyžadující nepřetržitou synchronizaci. SNTP klient odešle požadavek, obdrží odpověď a nastaví čas bez analýzy historie. Na mobilních zařízeních se používá právě SNTP — vestavěná služba Android Google Time Service (GTS) synchronizuje přes SNTP se servery time.google.com.
Kromě NTP/SNTP je synchronizace času na mobilních zařízeních možná přes GPS přijímač (přesnost až 10 ns v ideálních podmínkách) a mobilní síť (přes NITZ — Network Identity and Time Zone). GPS poskytuje maximální přesnost, ale funguje pouze na otevřeném prostranství a spotřebovává mnoho energie. NITZ je poskytován mobilním operátorem automaticky při registraci v síti, ale ne všichni operátoři jej podporují. Android používá kombinaci všech metod: GTS (SNTP) jako prioritu, NITZ jako zálohu a GPS pro aplikace vyžadující vysokou přesnost.
V distribuovaných systémech — když jsou server a klient na různých zařízeních — synchronizace hodin naráží na zásadní omezení. Zpoždění sítě (latence) znemožňuje jednoznačné určení přesného času na klientovi: pokud paket putoval 200 ms, čas na serveru v okamžiku odeslání požadavku a přijetí odpovědi je již jiný. NTP řeší tento problém měřením RTT a statistickým zpracováním, ale pro distribuované transakce (např. bankovní převody) to nestačí — používají se logické hodiny (Lamportova razítka) nebo vektorové hodiny.
Fyzické hodiny (wall clock) — reálný čas UTC, synchronizovaný přes NTP. Logické hodiny — pořadová čísla událostí v systému, nezávislá na fyzickém čase. V distribuovaných systémech se pro řazení událostí často používají vektorové hodiny: každý uzel ukládá vektor čítačů pro všechny uzly clusteru. Pro mobilní aplikace stačí fyzická synchronizace s přesností 1–5 sekund — zajišťuje správnou funkci OAuth, SSL a push notifikací. Pokud je vyžadováno striktní řazení událostí (např. v chatech v reálném čase), přidává se logická synchronizace na úrovni serveru.
Implementovat synchronizaci hodin v aplikaci pro Android lze několika způsoby. Nejjednodušší — získat čas serveru pomocí REST API: server vrací Unix Timestamp v těle odpovědi nebo v HTTP hlavičce Date. Tento přístup nevyžaduje další knihovny a zaručuje, že čas souhlasí se serverem. Druhý způsob — použít SNTP klienta pro přímý dotaz na NTP server. Třetí — spoléhat na Android Google Time Service, který automaticky synchronizuje systémový čas, pokud je zařízení připojeno k internetu.
V aplikacích pro Android s autorizací a finančními operacemi se doporučuje kombinovaný přístup: při každém požadavku na API se ukládá rozdíl mezi časem serveru a System.currentTimeMillis(). Tento rozdíl se aplikuje na všechny časové výpočty na klientovi, bez ohledu na to, zda jsou systémové hodiny synchronizovány. Tento přístup se nazývá clock skew correction a je implementován pomocí třídy, která ukládá poslední známý rozdíl se serverem. Dále lze spouštět synchronizaci NTP na pozadí každé 4–6 hodin pomocí WorkManageru.
// Korekce odchylky hodin
class ClockSyncManager {
private var serverTimeDiff: Long = 0 // serverTime - deviceTime (ms)
fun updateServerTime(serverTimestampMs: Long) {
serverTimeDiff = serverTimestampMs - System.currentTimeMillis()
}
fun getCorrectedTime(): Long {
return System.currentTimeMillis() + serverTimeDiff
}
fun isSyncValid(maxDiffMs: Long = 5000): Boolean {
return Math.abs(serverTimeDiff) < maxDiffMs
}
}
Pro periodickou synchronizaci času na pozadí na Androidu použijte WorkManager s PeriodicWorkRequest. Úloha synchronizace provede SNTP dotaz nebo volání REST API, získá čas serveru a aktualizuje ClockSyncManager. Minimální interval pro PeriodicWorkRequest je 15 minut, ale pro synchronizaci času stačí 4–6 hodin. Při synchronizaci berte v úvahu stav sítě — použijte NetworkType.CONNECTED k zabránění zbytečným požadavkům v roamingu. Pokud synchronizace selže, ponechte předchozí korekci — zůstává platná s postupně klesající přesností.
Moderní mobilní zařízení synchronizují čas automaticky prostřednictvím vestavěných služeb. V Androidu — Google Time Service (GTS), součást Google Play Services. V iOS — NTP klient integrovaný v operačním systému. Tyto služby fungují nezávisle na aplikacích a nevyžadují další konfiguraci. Uživatel může automatickou synchronizaci vypnout v nastavení, což vytváří riziko pro aplikace — právě v tomto případě musí vývojář implementovat vlastní synchronizaci. Doporučuje se kontrolovat stav automatické synchronizace přes Settings.Global.getInt(AUTO_TIME) a upozornit uživatele, když je vypnutá.
| Platforma | Synchronizační služba | Protokol |
|---|---|---|
| Android | Google Time Service (GTS) | SNTP |
| iOS | Vestavěný NTP klient | NTP |
| Mobilní síť | NITZ (operátor) | NITZ |
| GPS přijímač | Satelitní signál | GPS Atomic Time |
Spoléhat se výhradně na automatickou synchronizaci je riskantní — uživatel ji může vypnout nebo se nacházet v zóně bez internetu. Nejlepší praxe — získávat čas ze serveru při každém požadavku API a ukládat desynchronizaci do SharedPreferences nebo DataStore. Pro kritické operace (platby, autorizace, podepisování dokumentů) vždy kontrolujte isSyncValid() před provedením. Pokud desynchronizace překročí práh — zobrazte uživateli obrazovku s návrhem zapnout automatickou synchronizaci nebo počkat na synchronizaci. Pro hry a zábavní aplikace stačí získat čas ze serveru při spuštění a aktualizovat jej každou hodinu.
Často kladené otázky
Synchronizace hodin — je proces přizpůsobení systémového času zařízení referenčnímu UTC. Funguje přes protokoly NTP nebo SNTP: zařízení odešle požadavek na server, změří zpoždění sítě a vypočítá korekci pro své hodiny. Výsledkem je přesný čas s chybou 1–100 ms v závislosti na síti.
Bez synchronizace jsou možné poruchy: SSL certifikáty blokují HTTPS, OAuth tokeny jsou považovány za prošlé, push notifikace přicházejí v nesprávnou dobu, analytika zaznamenává nesprávná razítka. Pro kritické operace (platby, autorizace) je desynchronizace o více než 5 sekund považována za bezpečnostní hrozbu a měla by operaci blokovat.
Hlavní — NTP (přesnost 1–50 ms, s filtrováním a PLL) a SNTP (10–100 ms, zjednodušený). Doplňkově: GPS (10 ns, ale pouze venku) a NITZ (přes mobilního operátora, přesnost ~1 sekunda). Android používá Google Time Service na SNTP, iOS — vestavěný NTP klient.
Použijte knihovnu Apache Commons Net (třída NTPUDPClient) pro přímý SNTP dotaz na time.google.com nebo pool.ntp.org. Alternativou je získat čas serveru z HTTP hlaviček odpovědi vašeho API. Pro trvalou korekci implementujte ClockSyncManager, který ukládá rozdíl mezi časem serveru a lokálním časem.
Implementujte clock skew correction: při každém požadavku API ukládejte rozdíl mezi časem serveru a System.currentTimeMillis(). Použijte tento rozdíl pro korekci času ve všech operacích aplikace. Pokud rozdíl přesáhne 5 sekund — blokujte kritické transakce a navrhněte uživateli zapnout automatickou synchronizaci v nastavení.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také