Usługi XPC w aplikacji macOS
Przed XPC dłubaliśmy w Socketach i Mach Messages (Mach Ports).
Mechanizm XPC oferuje alternatywę dla Socketów (lub Mach Services używających MIG) dla IPC. Możemy mieć na przykład proces, który działa jako „serwer” oczekujący na klientów, którzy uzyskają dostęp do jego API i dostarczą jakąś usługę.
Usługi XPC w aplikacjach
Gdy mówimy o Usługach XPC (duże 'S’), odnosimy się do pakietu o nazwie Usługa XPC. Wiązki w ekosystemie Apple odnosi się do podmiotów reprezentowanych przez określoną strukturę katalogów. Najczęstszym Bundle można spotkać są Application Bundles. Jeśli klikniesz prawym przyciskiem myszy na dowolnej aplikacji (na przykład Chess.app) i wybierzesz Pokaż zawartość, co znajdziesz jest struktura katalogów. Wracając do XPC, aplikacje mogą mieć wiele pakietów usług XPC. Znajdziesz je w katalogu Contents/XPCServices/ wewnątrz pakietu aplikacji. Yo może przeszukać twój katalog /Applications i zobaczyć jak wiele aplikacji polega na Usługach XPC.
Możesz również mieć Usługi XPC wewnątrz Struktur Ramowych (Które są innym typem Wiązek).
Dodatkowe Korzyści z Usług XPC
Używanie Usług XPC w naszych aplikacjach pozwala nam rozbić niektóre funkcjonalności w oddzielnych modułach (Usługa XPC). Możemy stworzyć usługę XPC, która może być odpowiedzialna za wykonywanie pewnych kosztownych, ale rzadkich zadań. Na przykład, jakieś zadanie kryptograficzne do generowania liczb losowych.
Kolejną dodatkową korzyścią jest to, że usługa XPC działa na swoim własnym procesie. Jeśli ten proces się zawiesi lub zostanie zabity, nie ma to wpływu na naszą główną aplikację. Wyobraź sobie, że Twoja aplikacja obsługuje zdefiniowane przez użytkownika wtyczki. I te wtyczki są zbudowane przy użyciu Usług XPC. Jeśli są źle zakodowane i ulegną awarii, nie wpłyną na integralność twojej głównej aplikacji.
Dodatkową zaletą Usług XPC jest to, że mogą one posiadać własne uprawnienia. Aplikacja będzie wymagać uprawnienia tylko wtedy, gdy korzysta z usługi świadczonej przez XPC Service, która wymaga uprawnienia. Wyobraź sobie, że masz aplikację, która używa lokalizacji, ale tylko dla określonych funkcji. Mógłbyś przenieść te funkcje do Usługi XPC i dodać uprawnienie lokalizacji tylko do tej Usługi XPC. Jeśli twój użytkownik nigdy nie potrzebuje funkcji, która używa lokalizacji, nie zostanie poproszony o uprawnienia, dzięki czemu korzystanie z twojej aplikacji będzie bardziej godne zaufania.
XPC i nasz przyjaciel launchd
launchd jest pierwszym procesem uruchamianym w naszym systemie. Odpowiada on za uruchamianie i zarządzanie innymi procesami, usługami i demonami. launchd jest również odpowiedzialny za planowanie zadań. Więc to ma sens, że launchd będzie również odpowiedzialny za zarządzanie usługami XPC.
Usługi XPC mogą być zatrzymane, jeśli były bezczynne przez długi czas, lub mogą być tworzone na żądanie. Całe zarządzanie jest wykonywane przez launchd, a my nie musimy nic robić, aby to działało.
launchd ma informacje o dostępności zasobów w całym systemie i nacisku na pamięć, kto najlepiej podejmie decyzje, jak najefektywniej wykorzystać zasoby naszego systemu niż launchd
Wdrażanie usług XPC
Usługa XPC jest pakietem w katalogu Contents/XPCServices głównego pakietu aplikacji; pakiet usługi XPC zawiera plik Info.plist, plik wykonywalny i wszelkie zasoby potrzebne usłudze. Usługa XPC wskazuje, którą funkcję należy wywołać, gdy usługa otrzymuje wiadomości, wywołując xpc_main(3) Mac OS X Developer Tools Manual Page ze swojej funkcji głównej.
Aby utworzyć usługę XPC w Xcode, wykonaj następujące czynności:
- Dodaj nowy cel do swojego projektu, używając szablonu Usługi XPC.
- Dodaj fazę Kopiuj pliki do ustawień budowania aplikacji, która kopiuje usługę XPC do katalogu Contents/XPCServices głównego pakietu aplikacji.
- Dodaj zależność do ustawień budowania aplikacji, aby wskazać, że zależy ona od pakietu usług XPC.
- Jeśli piszesz niskopoziomową (opartą na języku C) usługę XPC, zaimplementuj minimalną funkcję główną, aby zarejestrować obsługę zdarzeń, jak pokazano w poniższym listingu kodu. Zastąp my_event_handler nazwą swojej funkcji obsługi zdarzeń.
int main(int argc, const char *argv) {
xpc_main(my_event_handler);
// The xpc_main() function never returns.
exit(EXIT_FAILURE);
}
Jeśli piszesz wysokopoziomową (opartą na Objective-C) usługę używającą NSXPCConnection, najpierw stwórz klasę delegata połączenia, która jest zgodna z protokołem NSXPCListenerDelegate. Następnie zaimplementuj minimalną główną funkcję, która tworzy i konfiguruje obiekt słuchacza, jak pokazano na poniższym listingu kodu.
int main(int argc, const char *argv) {
MyDelegateClass *myDelegate = ...
NSXPCListener *listener =
;
listener.delegate = myDelegate;
;
// The resume method never returns.
exit(EXIT_FAILURE);
}
Używanie usługi
Sposób, w jaki używasz usługi XPC zależy od tego, czy pracujesz z C API (Usługi XPC) lub Objective-C API (NSXPCConnection).
Używanie API Objective-C NSXPCConnection API Objective-C NSXPCConnection zapewnia wysokopoziomowy interfejs zdalnego wywoływania procedur, który umożliwia wywoływanie metod na obiektach w jednym procesie z innego procesu (zwykle aplikacji wywołującej metodę w usłudze XPC). API NSXPCConnection automatycznie serializuje struktury danych i obiekty do transmisji i deserializuje je na drugim końcu. W rezultacie, wywołanie metody na zdalnym obiekcie zachowuje się podobnie jak wywołanie metody na lokalnym obiekcie.
Aby używać NSXPCConnection API, musisz utworzyć następujące elementy:
- Interfejs. Składa się on głównie z protokołu, który opisuje jakie metody powinny być wywoływane ze zdalnego procesu. Zostało to opisane w rozdziale Projektowanie interfejsu
- Obiekt połączenia po obu stronach. Po stronie usługi zostało to opisane wcześniej w Tworzenie usługi. Po stronie klienta jest to opisane w Connecting to and Using an Interface.
- Słuchacz. Ten kod w usłudze XPC akceptuje połączenia. Jest to opisane w Akceptowanie połączenia w helperze. Messages.