Služby XPC v aplikaci macOS
Před XPC jsme vyzvedávali zásuvky a Machovy zprávy (Machovy porty).
Mechanismus XPC nabízí alternativu k zásuvkám (nebo službám Mach pomocí MIG) pro IPC. Můžeme mít například proces, který funguje jako „server“ a čeká na klienty, aby přistoupili k jeho API a poskytli nějakou službu.
Služby XPC na aplikacích
Když mluvíme o službách XPC (velké „S“), máme na mysli balíček nazvaný XPC Service. Svazky v ekosystému Apple označují entity reprezentované určitou adresářovou strukturou. Nejčastěji se setkáte se svazky aplikací. Pokud kliknete pravým tlačítkem myši na libovolnou aplikaci (například Chess.app) a vyberete možnost Zobrazit obsah, najdete adresářovou strukturu. Zpět k XPC, aplikace mohou mít svazky služeb XPC. Najdete je uvnitř adresáře Contents/XPCServices/ uvnitř balíčku aplikace. Yo můžete vyhledat v adresáři /Applications a zjistit, kolik aplikací se spoléhá na služby XPC.
Služby XPC můžete mít také uvnitř rámců (což je další typ svazku).
Další výhody služeb XPC
Používání služeb XPC v našich aplikacích nám umožňuje rozdělit některé funkce do samostatných modulů (The XPC Service). Můžeme vytvořit službu XPC Service, která může mít na starosti spouštění některých nákladných, ale málo častých úloh. Například nějakou kryptografickou úlohu pro generování náhodných čísel.
Další výhodou je, že služba XPC Service běží ve vlastním procesu. Pokud tento proces spadne nebo je zabit, nemá to vliv na naši hlavní aplikaci. Představte si, že vaše aplikace podporuje uživatelsky definované zásuvné moduly. A tyto zásuvné moduly jsou vytvořeny pomocí služby XPC. Pokud jsou špatně nakódované a dojde k jejich pádu, neovlivní to integritu vaší hlavní aplikace.
Další výhodou služby XPC je, že mohou mít vlastní oprávnění. Aplikace bude vyžadovat oprávnění pouze tehdy, když bude využívat službu poskytovanou službou XPC Service, která toto oprávnění vyžaduje. Představte si, že máte aplikaci, která využívá polohu, ale pouze pro určité funkce. Tyto funkce můžete přesunout do služby XPC a přidat oprávnění k poloze pouze do této služby XPC. Pokud váš uživatel nikdy nepotřebuje funkci, která využívá polohu, nebude vyzván k zadání oprávnění, čímž se používání vaší aplikace stane důvěryhodnějším.
XPC a náš přítel launchd
launchd je první proces, který se spouští v našem systému. Má na starosti spouštění a správu dalších procesů, služeb a démonů. launchd má také na starosti plánování úloh. Je tedy logické, že launchd bude zodpovědný také za správu služeb XPC.
Služba XPC může být zastavena, pokud byla dlouho nečinná, nebo může být spuštěna na vyžádání. Veškerou správu provádí launchd a my nemusíme dělat nic, aby to fungovalo.
launchd má informace o dostupnosti prostředků celého systému a vytížení paměti, kdo nejlépe rozhodne o tom, jak co nejefektivněji využít prostředky našeho systému, než launchd
Zavedení služby XPC
Služba XPC je balíček v adresáři Contents/XPCServices hlavního balíčku aplikace; balíček služby XPC obsahuje soubor Info.plist, spustitelný soubor a všechny prostředky potřebné pro službu. Služba XPC určuje, která funkce se má zavolat, když služba obdrží zprávy, voláním xpc_main(3) Mac OS X Developer Tools Manual Page z její hlavní funkce.
Chcete-li vytvořit službu XPC v Xcode, postupujte takto:
- Přidejte do projektu nový cíl pomocí šablony služby XPC.
- Přidejte do nastavení sestavení své aplikace fázi Kopírovat soubory, která zkopíruje službu XPC do adresáře Obsah/XPCSlužby hlavního svazku aplikace.
- Přidejte do nastavení sestavení své aplikace závislost, abyste uvedli, že závisí na svazku služby XPC.
- Pokud píšete nízkoúrovňovou službu XPC (založenou na jazyce C), implementujte minimální hlavní funkci pro registraci obsluhy událostí, jak je uvedeno v následujícím výpisu kódu. Nahraďte my_event_handler názvem své funkce obsluhy událostí.
int main(int argc, const char *argv) {
xpc_main(my_event_handler);
// The xpc_main() function never returns.
exit(EXIT_FAILURE);
}
Píšete-li vysokoúrovňovou službu (založenou na Objective-C) pomocí NSXPCConnection, vytvořte nejprve třídu delegáta připojení, která odpovídá protokolu NSXPCListenerDelegate. Poté implementujte minimální funkci main, která vytvoří a nakonfiguruje objekt posluchače, jak ukazuje následující výpis kódu.
int main(int argc, const char *argv) {
MyDelegateClass *myDelegate = ...
NSXPCListener *listener =
;
listener.delegate = myDelegate;
;
// The resume method never returns.
exit(EXIT_FAILURE);
}
Použití služby
Způsob použití služby XPC závisí na tom, zda pracujete s rozhraním API jazyka C (služby XPC), nebo s rozhraním API jazyka Objective-C (NSXPCConnection).
Používání rozhraní API Objective-C NSXPCConnection Rozhraní API Objective-C NSXPCConnection poskytuje rozhraní vzdáleného volání procedur na vysoké úrovni, které umožňuje volat metody objektů v jednom procesu z jiného procesu (obvykle aplikace volající metodu ve službě XPC). API NSXPCConnection automaticky serializuje datové struktury a objekty pro přenos a na druhé straně je deserializuje. V důsledku toho se volání metody na vzdáleném objektu chová podobně jako volání metody na lokálním objektu.
Chcete-li používat rozhraní NSXPCConnection API, musíte vytvořit následující:
- Rozhraní. To se skládá především z protokolu, který popisuje, jaké metody mají být volatelné ze vzdáleného procesu. To je popsáno v části Návrh rozhraní
- Objekt připojení na obou stranách. Na straně služby to bylo popsáno dříve v části Vytvoření služby. Na straně klienta je to popsáno v části Připojení k rozhraní a jeho použití
- Posluchač. Tento kód ve službě XPC přijímá připojení. To je popsáno v části Přijímání připojení v pomocném serveru. Zprávy.