05/05/2026
V dnešní době, kdy jsou chytré hodinky nedílnou součástí našeho digitálního života, se stává komunikace mezi iPhonem a Apple Watch klíčovou pro vytváření skutečně pohlcujících a interaktivních uživatelských zážitků. Představte si, že vaše aplikace na iPhonu může nenápadně, ale účinně komunikovat s hodinkami na vašem zápěstí, například jemným haptickým poklepáním. To není sci-fi, ale realita díky robustnímu frameworku WatchConnectivity a jeho srdci – třídě WCSession. I když se někteří vývojáři zdráhají tuto oblast prozkoumat kvůli menšímu počtu uživatelů Apple Watch, potenciál pro inovace a vylepšení uživatelského rozhraní je obrovský. Pojďme se ponořit do toho, jak můžete snadno a efektivně propojit vaše iOS aplikace s Apple Watch.

- Proč komunikovat mezi iOS a watchOS?
- WCSession: Klíč k propojení vašeho iPhonu a Apple Watch
- Implementace protokolu WCSessionDelegate: Nezbytný most
- Inteligentní odesílání zpráv: Omezení frekvence (Rate Limiting)
- Posílání dat na Apple Watch: Metoda sendMessage()
- Praktická ukázka: Haptická odezva u karetní hry
- Důležité poznámky a úskalí komunikace s Apple Watch
- Srovnání: Dobré a Špatné Zprávy při vývoji WatchConnectivity
- Často kladené dotazy (FAQ)
- Závěr
Proč komunikovat mezi iOS a watchOS?
Komunikace mezi aplikacemi na iPhonu a Apple Watch otevírá dveře k mnoha fascinujícím možnostem. Nejde jen o zrcadlení notifikací, ale o plnohodnotnou interakci, která může zásadně obohatit uživatelský zážitek. Přenos dat, vzdálené ovládání funkcí, synchronizace stavu – to vše jsou scénáře, kde se WCSession uplatní. Jedním z nejatraktivnějších využití je však jemná haptická odezva. Představte si aplikaci, kde se uživateli dostane diskrétního upozornění přímo na zápěstí, aniž by musel vytahovat telefon. Tato subtilnost je jedním z největších kouzel Apple Watch – nikdo kolem vás netuší, co se děje, a přesto jste informováni. Ať už jde o karetní hru, kde vás hodinky jemně upozorní na správný tah, nebo o zdravotní aplikaci, která signalizuje dosažení cíle, možnosti jsou prakticky neomezené. Právě tato schopnost vytvářet diskrétní, ale silné interakce dělá z propojení iOS a watchOS tak lákavou oblast pro vývojáře.
WCSession: Klíč k propojení vašeho iPhonu a Apple Watch
Srdcem veškeré komunikace mezi aplikacemi na iPhonu a Apple Watch je framework WatchConnectivity a jeho hlavní třída WCSession. Tato třída slouží jako most, který umožňuje obousměrnou výměnu zpráv a dat. Implementace je překvapivě jednoduchá a rychlá. Prvním krokem je importování potřebného frameworku do vašeho projektu v Swiftu. Do souboru ViewController.swift (nebo jiného relevantního souboru, kde chcete zahájit komunikaci) stačí přidat řádek:
import WatchConnectivity
Jakmile máte framework importovaný, můžete přistoupit k inicializaci a aktivaci sezení. Předtím je však dobré ověřit, zda je WCSession na daném zařízení vůbec podporováno. To je důležité pro zajištění kompatibility s různými modely iPhonů a pro správné chování aplikace v simulátorech, kde nemusí být vždy komunikace s hodinkami dostupná. Tento kontrolní mechanismus je jednoduchý:
if (WCSession.isSupported()) { ... }
Pokud je WCSession podporováno, můžete získat výchozí instanci sezení a připravit ji k použití. Tato výchozí instance je singleton, což znamená, že k ní vždy přistupujete stejným způsobem. Klíčovým krokem je pak aktivace sezení. Bez aktivace se komunikace neuskuteční. Kód pro inicializaci a aktivaci sezení byste typicky umístili do metody viewDidLoad() ve vašem ViewControlleru:
let session = WCSession.default
session.delegate = self
session.activate()
Všimněte si řádku session.delegate = self. Ten je naprosto nezbytný. I když se může zdát, že ho v některých případech nebudete přímo využívat pro zpracování přijatých zpráv, bez přiřazení delegáta nelze sezení aktivovat. Delegát je v podstatě pověřený objekt, který bude přijímat notifikace o změnách stavu WCSession a přijatých datech. V dalším kroku si podrobněji rozebereme, co obnáší implementace delegáta.
Implementace protokolu WCSessionDelegate: Nezbytný most
Když přiřadíte session.delegate = self, Swift kompilátor vás upozorní, že vaše třída ViewController zatím neodpovídá protokolu WCSessionDelegate. Protokoly v Swiftu definují sadu metod, které musí třída implementovat, aby se protokolu přizpůsobila. V případě WCSessionDelegate existují tři metody, které jsou povinné, i když v mnoha jednoduchých případech (jako je naše haptická odezva) je můžete ponechat prázdné. Tyto metody slouží k informování aplikace o životním cyklu komunikačního sezení a jsou klíčové pro robustní správu spojení.
Chcete-li problém s kompilátorem vyřešit, musíte deklarovat, že vaše třída ViewController se přizpůsobuje protokolu WCSessionDelegate. To provedete přidáním názvu protokolu k deklaraci vaší třídy:
class ViewController: UIViewController, WCSessionDelegate { ... }
Poté je třeba přidat požadované metody protokolu do vaší třídy. Jak již bylo zmíněno, pro náš účel je můžeme ponechat prázdné, ale jejich přítomnost je nutná pro splnění požadavků protokolu a pro to, aby se WCSession správně aktivovalo a fungovalo. Tyto metody jsou:
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { }
Tato metoda se volá, když se sezení WCSession úspěšně aktivuje nebo když dojde k chybě během aktivace. ParametractivationStatevám řekne, v jakém stavu se sezení nachází (např. aktivní, neaktivní, nepodporované).func sessionDidBecomeInactive(_ session: WCSession) { }
Tato metoda se volá, když se sezení WCSession stane neaktivním. K tomu může dojít z různých důvodů, například když uživatel opustí vaši aplikaci na Apple Watch.func sessionDidDeactivate(_ session: WCSession) { }
Tato metoda se volá, když se sezení WCSession plně deaktivuje. Typicky ji budete používat pro vyčištění zdrojů nebo pro opětovnou aktivaci sezení, pokud je to nutné pro vaši aplikaci. Důležité je, že po volání této metody byste měli znovu aktivovat sezení, pokud chcete pokračovat v komunikaci.
Přestože v našem jednoduchém případě tyto metody nemají žádnou konkrétní logiku, jejich existence je základním kamenem pro spolehlivou komunikaci. Bez nich by WCSession nemohlo správně spravovat svůj životní cyklus a komunikace by selhala.
Inteligentní odesílání zpráv: Omezení frekvence (Rate Limiting)
Posílání zpráv z iPhonu na Apple Watch je s WCSession opravdu triviální, ale je zde jeden důležitý aspekt, který je třeba vzít v úvahu: omezení frekvence zpráv neboli rate limiting. Představte si, že vaše aplikace detekuje pohyb prstu nad správnou kartou a chcete, aby hodinky zavibrovaly. Pokud by se tato zpráva posílala stokrát za sekundu pokaždé, když se prst pohne, vaše hodinky by se zbláznily a uživatelský zážitek by byl zničen. Je proto nezbytné omezit, jak často se zprávy na hodinky posílají.
Pro řešení tohoto problému přidáme do naší třídy ViewController jednoduchou vlastnost, která bude sledovat čas posledního odeslání zprávy na hodinky. Tímto způsobem můžeme snadno zabránit odesílání zpráv příliš rychle za sebou – například častěji než jednou za půl sekundy. Vlastnost, kterou přidáte, bude mít typ CFAbsoluteTime:
var lastMessage: CFAbsoluteTime = 0
Možná se ptáte, co je CFAbsoluteTime. Jedná se v podstatě o alias pro Double, který reprezentuje počet sekund, které uplynuly od půlnoci 1. ledna 2001. Ačkoli se datum může zdát poněkud náhodné, pro naše účely to nehraje roli. Důležité je, že nám umožňuje snadno získat aktuální čas pomocí funkce CFAbsoluteTimeGetCurrent() a porovnávat ho s časem poslední odeslané zprávy. Nás nezajímá absolutní čas, ale pouze časový rozdíl od předchozího volání.
Logika pro omezení frekvence bude vypadat takto: před každým pokusem o odeslání zprávy zkontrolujeme, zda od poslední zprávy uplynula dostatečná doba (například 0,5 sekundy). Pokud ne, jednoduše proces přerušíme a zprávu nepošleme. Tím zajistíme plynulou a příjemnou haptickou odezvu bez přetěžování hodinek.
Posílání dat na Apple Watch: Metoda sendMessage()
Samotné odeslání zprávy z aplikace na iPhonu na Apple Watch se skládá ze dvou hlavních částí. Zaprvé, musíme ověřit, zda jsou hodinky vůbec dosažitelné. To v praxi znamená, zda je aplikace na Apple Watch spuštěná a v popředí, a zda je spojení mezi iPhonem a hodinkami aktivní. Zadruhé, použijeme metodu sendMessage() třídy WCSession k odeslání slovníku dat. Je důležité si uvědomit, že pro účely naší haptické odezvy nezáleží na tom, jaká data posíláme – jakákoli přijatá zpráva bude interpretována jako signál k vibraci.
Pro implementaci odesílání zprávy a zároveň pro zajištění rate limitingu vytvoříme novou metodu v naší třídě ViewController, například pojmenovanou sendWatchMessage(). Tato metoda bude obsahovat veškerou logiku pro bezpečné a efektivní odesílání zpráv:
Nejprve získáme aktuální čas pomocí CFAbsoluteTimeGetCurrent(). Poté provedeme kontrolu pro rate limiting: if lastMessage + 0.5 > currentTime { return }. Pokud od poslední zprávy neuplynulo dostatek času, metoda se okamžitě ukončí, čímž zabráníme příliš rychlému odesílání.
Následně zkontrolujeme dosažitelnost hodinek: if (WCSession.default.isReachable) { ... }. Tato podmínka je klíčová. Pokud hodinky nejsou dosažitelné (například aplikace na Watch není spuštěná nebo je v pozadí), nemá smysl zprávu odesílat. Tím se vyhneme zbytečným chybám a optimalizujeme výkon aplikace.

Pokud jsou hodinky dosažitelné, můžeme přistoupit k odeslání zprávy. Zpráva je v podstatě slovník typu [String: Any]. I když v našem případě může být obsah zprávy symbolický (např. ["Message": "Hello"]), WCSession je velmi flexibilní a umožňuje posílat libovolné serializovatelné typy dat, jako jsou řetězce, čísla, pole nebo booleovské hodnoty. Samotné odeslání se provede voláním:
WCSession.default.sendMessage(message, replyHandler: nil)
Parametr replyHandler: nil znamená, že neočekáváme žádnou odpověď od hodinek. WCSession však podporuje i obousměrnou komunikaci, kde hodinky mohou na zprávu odpovědět, což otevírá další možnosti pro komplexnější interakce.
Nakonec, po úspěšném odeslání zprávy (nebo pokusu o odeslání, pokud byly hodinky dosažitelné), je důležité aktualizovat čas poslední zprávy, aby rate limiting fungoval správně pro další volání:
lastMessage = CFAbsoluteTimeGetCurrent()
Tímto způsobem máme robustní a efektivní metodu pro odesílání zpráv na Apple Watch, která zároveň respektuje omezení frekvence.
Praktická ukázka: Haptická odezva u karetní hry
Pojďme si ukázat, jak lze nově vytvořenou metodu sendWatchMessage() integrovat do reálného scénáře. Představme si jednoduchou karetní hru, kde uživatel pohybuje prstem po obrazovce a když se jeho prst ocitne nad správnou kartou, chceme, aby Apple Watch jemně zavibrovaly. Tento efekt je velmi působivý a nenápadný.
V iOS aplikacích se pohyb prstu (dotyk) zpracovává v metodě touchesMoved(_:with:), která je součástí životního cyklu pohledu. Tato metoda je volána opakovaně, jak se prst pohybuje po obrazovce. Uvnitř této metody obvykle iterujeme přes dotyky a kontrolujeme jejich pozici. V našem případě, pokud se dotyk nachází uvnitř rámečku karty a tato karta je navíc označena jako „správná“ (například po splnění nějaké podmínky ve hře), chceme aktivovat haptickou odezvu na hodinkách.
Integrace je neuvěřitelně jednoduchá. V části metody touchesMoved(), kde již kontrolujete podmínku if card.isCorrect { ... }, stačí přidat volání naší nové metody:
if card.isCorrect { sendWatchMessage() }
Celá metoda touchesMoved() by pak mohla vypadat nějak takto (zjednodušeně):
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesMoved(touches, with: event) guard let touch = touches.first else { return } let location = touch.location(in: cardContainer) for card in allCards { if card.view.frame.contains(location) { // Další logika, např. pro Force Touch, pokud je k dispozici // ... if card.isCorrect { sendWatchMessage() // Zde je nové volání! } } }}
A to je vše! S tímto minimálním množstvím kódu jste dosáhli plně funkční komunikace z vaší iOS aplikace na Apple Watch, která spouští jemnou a diskrétní haptickou odezvu. Tento příklad ukazuje sílu a jednoduchost WCSession pro vylepšení interakcí v reálném čase.
Důležité poznámky a úskalí komunikace s Apple Watch
Přestože je implementace WCSession pro posílání zpráv z iPhonu na Apple Watch poměrně přímočará, existují určité aspekty, které je dobré mít na paměti a které mohou ovlivnit chování vaší aplikace v reálném světě. Tyto body často představují „špatné zprávy“ pro vývojáře, ale s jejich znalostí se jim lze vyhnout nebo je elegantně vyřešit.
Jedním z nejdůležitějších faktorů je chování Apple Watch, pokud jde o spánek. Hodinky jsou navrženy tak, aby šetřily baterii, a proto se automaticky uspí po přibližně 70 sekundách nečinnosti. To znamená, že pokud vaše aplikace na Apple Watch není aktivně používána nebo nedělá něco, co by ji udrželo „probuzenou“ (například cvičení nebo dlouhodobá relace), přestane přijímat zprávy z iPhonu. Váš mechanismus WCSession.default.isReachable pak vrátí false, protože hodinky nejsou v aktivním stavu pro příjem zpráv.
Je tedy na vás jako na vývojáři, abyste se ujistili, že vaše aplikace na Watch zůstane probuzená, pokud vyžadujete nepřetržitou komunikaci. Toho lze dosáhnout různými způsoby, například:
- Extended Runtime Sessions: Pro specifické úkoly, které vyžadují delší dobu běhu na pozadí.
- Workout Sessions: Pokud vaše aplikace souvisí s fitness a sledováním cvičení.
- Background App Refresh: Pro pravidelné, ale ne okamžité aktualizace dat.
V kontextu jednoduché haptické odezvy, jako je ta u karetní hry, nemusí být udržování aplikace neustále probuzené prioritou, protože interakce je spíše krátkodobá a na vyžádání. Nicméně pro aplikace, které vyžadují nepřetržitou synchronizaci dat nebo stálou odezvu, je tento aspekt klíčový.
Dalším úskalím, které jsme již zmínili, je nutnost implementovat rate limiting. Bez něj byste riskovali přetížení hodinek a nepříjemnou uživatelskou zkušenost. I když je WCSession robustní, nadměrné zatěžování může vést k nečekanému chování nebo zpomalení. Vždy myslete na to, jak často vaše aplikace skutečně potřebuje posílat zprávy, a optimalizujte frekvenci.
Pamatujte, že komunikace funguje nejlépe, když je aplikace na Apple Watch v popředí. I když existují mechanismy pro komunikaci na pozadí, pro okamžité a citlivé interakce je ideální, aby byla aplikace na hodinkách aktivně spuštěna.
Srovnání: Dobré a Špatné Zprávy při vývoji WatchConnectivity
Při práci s WatchConnectivity se setkáte s několika výhodami i výzvami. Zde je stručné srovnání:
| Dobrá zpráva | Špatná zpráva |
|---|---|
| Snadná a rychlá implementace: Základní nastavení WCSession zabere jen pár minut. | Spánek Apple Watch: Hodinky se po 70 sekundách nečinnosti uspí, což vyžaduje specifické řešení pro udržení aktivity. |
| Triviální komunikace: Posílání zpráv z iPhonu na Watch je s WCSession velmi jednoduché. | Nutnost řídit aktivitu aplikace: Je na vývojáři, aby zajistil, že aplikace na Watch zůstane probuzená, pokud je to potřeba. |
| Efektivní pro haptickou odezvu: Ideální pro jemné, nenápadné vibrace, které vylepšují uživatelský zážitek. | Potřeba omezení frekvence zpráv (Rate Limiting): Aby nedocházelo k přetížení hodinek, je nutné implementovat logiku pro zpomalení odesílání zpráv. |
| Flexibilita dat: Možnost posílat libovolná data (slovníky) mezi zařízeními. | Dosažitelnost Watch: Komunikace funguje nejlépe, když je aplikace na Watch spuštěná a v popředí. |
Často kladené dotazy (FAQ)
- Proč moje Apple Watch nereagují na zprávy z iPhonu?
- Existuje několik možných důvodů. Nejprve zkontrolujte, zda je aplikace na Watch spuštěná a v popředí, protože komunikace přes
WCSession.default.isReachablevyžaduje aktivní stav. Ujistěte se, že jste správně implementovali protokolWCSessionDelegatea aktivovali sezení volánímsession.activate(). Dále ověřte, zda hodinky neusnuly kvůli nečinnosti (po 70 sekundách) nebo zda nejste blokováni mechanismem omezení frekvence zpráv (rate limiting), který brání příliš rychlému odesílání. - Co je to
WCSessionDelegatea proč ho potřebuji, když jeho metody nepoužívám? WCSessionDelegateje protokol v Swiftu, který definuje sadu metod pro zpracování událostí souvisejících s komunikací mezi iPhonem a Apple Watch. I když v jednoduchých případech (jako je pouhá haptická odezva) nemusíte implementovat vlastní logiku do jeho metod (např.activationDidCompleteWith), je jeho přiřazení k instanciWCSessionnezbytné.WCSessionvyžaduje delegáta pro svou správnou aktivaci a pro správu životního cyklu sezení. Bez něj by se sezení nemohlo aktivovat a komunikace by nefungovala.- Mohu posílat jakákoli data přes
WCSession.sendMessage()? - Ano, metoda
sendMessage()přijímá slovník typu[String: Any]. To znamená, že můžete posílat různé typy dat, jako jsou řetězce (String), čísla (Int,Double), booleovské hodnoty (Bool), pole (Array) a další typy, které jsou kompatibilní s formátem PropertyList. Je důležité, aby data byla serializovatelná, aby je bylo možné efektivně přenést mezi zařízeními. - Co když Watch není dosažitelné? Jak to zjistím?
- Dosažitelnost Apple Watch můžete zjistit pomocí vlastnosti
WCSession.default.isReachable. Tato vlastnost vrátítrue, pokud je aplikace na Apple Watch spuštěná a v popředí, a spojení mezi hodinkami a iPhonem je aktivní. Pokud vrátífalse, znamená to, že hodinky nejsou připraveny přijímat zprávy, a měli byste se vyhnout pokusu o odeslání, abyste předešli chybám a optimalizovali výkon. KontrolaisReachableby měla být vždy součástí vaší logiky před odesláním zprávy. - Jak funguje omezení frekvence zpráv (
rate limiting)? Rate limitingje mechanismus, který zabraňuje odesílání příliš mnoha zpráv v krátkém časovém intervalu, aby se předešlo přetížení cílového zařízení (v tomto případě Apple Watch). V našem příkladu se používá časová značka (CFAbsoluteTime) a funkceCFAbsoluteTimeGetCurrent(). Před odesláním každé zprávy se zkontroluje, zda od poslední odeslané zprávy uplynula dostatečná doba (například 0,5 sekundy). Pokud ne, odeslání zprávy se přeskočí. Tím se zajišťuje plynulá a kontrolovaná interakce bez zahlcení hodinek.
Závěr
Komunikace mezi iPhonem a Apple Watch prostřednictvím WCSession je mocný nástroj, který vám umožní vytvářet bohatší a interaktivnější aplikace. Jak jsme si ukázali, základní implementace je překvapivě rychlá a přímočará, což vám umožní rychle začít experimentovat s přenosem dat a haptickou odezvou. Ačkoli je třeba mít na paměti některá úskalí, jako je spánek hodinek a potřeba rate limitingu, tyto výzvy jsou snadno zvládnutelné s trochou plánování. Využijte potenciál WatchConnectivity k posunutí vašich iOS aplikací na novou úroveň a nabídněte uživatelům skutečně pohlcující zážitek, který překračuje hranice samotného iPhonu. Možnosti jsou nekonečné – stačí jen začít!
Chceš-li si přečíst další články podobné jako Jak posílat zprávy z iPhonu na Apple Watch?, navštiv kategorii Apple.
