XPC szolgáltatások a macOS alkalmazáson
Az XPC előtt Socketeket és Mach üzeneteket (Mach Ports) vettünk fel.
Az XPC mechanizmus alternatívát kínál a socketek (vagy a MIG-et használó Mach Services) helyett az IPC számára. Lehet például egy olyan folyamatunk, amely “kiszolgálóként” várja, hogy a kliensek hozzáférjenek az API-jához, és valamilyen szolgáltatást nyújtsanak.
XPC Services on applications
Amikor XPC Services-ről (nagy ‘S’) beszélünk, akkor az XPC Service nevű csomagra utalunk. A csomagok az Apple ökoszisztémájában egy adott könyvtárszerkezet által reprezentált entitásokra utalnak. A leggyakoribb Bundle, amivel találkozhatunk, az Application Bundle. Ha jobb egérgombbal kattintasz bármelyik alkalmazásra (például a Chess.app-ra), és kiválasztod a Tartalom megjelenítése lehetőséget, akkor egy könyvtárszerkezetet találsz. Visszatérve az XPC-hez, az alkalmazásoknak lehetnek XPC Service csomagjai. Ezeket a Contents/XPCServices/ könyvtárban találja az alkalmazáscsomagon belül. Yo rákereshet a /Applications könyvtárában, és megnézheti, hogy hány alkalmazás támaszkodik az XPC szolgáltatásokra.
A XPC szolgáltatások a keretrendszereken belül is lehetnek (amelyek egy másik típusú csomagok).
Az XPC szolgáltatások további előnyei
Az XPC szolgáltatások használata az alkalmazásainkban lehetővé teszi számunkra, hogy bizonyos funkciókat külön modulokba (Az XPC szolgáltatás) bontsunk. Létrehozhatunk egy XPC Service-t, amely néhány költséges, de ritkán előforduló feladat futtatásáért felelhet. Például valamilyen kriptográfiai feladatot a véletlen számok generálására.
Egy másik további előnye, hogy az XPC Service saját folyamaton fut. Ha ez a folyamat összeomlik vagy megölik, az nem érinti a fő alkalmazásunkat. Képzeljük el, hogy az alkalmazásunk támogatja a felhasználó által definiált bővítményeket. A bővítményeket pedig az XPC Services segítségével építjük fel. Ha rosszul vannak kódolva és összeomlanak, nem befolyásolják a fő alkalmazás integritását.
Az XPC Service további előnye, hogy saját jogosultságokkal rendelkezhetnek. Az alkalmazásnak csak akkor lesz szüksége a jogosultságra, ha olyan XPC Service által nyújtott szolgáltatást vesz igénybe, amelyhez a jogosultság szükséges. Képzeljük el, hogy van egy alkalmazásunk, amely a helymeghatározást használja, de csak bizonyos funkciókhoz. Ezeket a funkciókat áthelyezheti egy XPC szolgáltatásba, és a helymeghatározási jogosultságot csak ehhez az XPC szolgáltatáshoz adhatja hozzá. Ha a felhasználónak soha nincs szüksége a helymeghatározást használó funkcióra, akkor nem fog kérni jogosultságot, így az alkalmazás használata megbízhatóbbá válik.
XPC és barátunk, a launchd
A launchd az első folyamat, amely lefut a rendszerünkön. Feladata más folyamatok, szolgáltatások és daemonok indítása és kezelése. launchd felelős a feladatok ütemezéséért is. Így logikus, hogy a launchd lesz felelős az XPC szolgáltatások kezeléséért is.
Az XPC szolgáltatás leállítható, ha hosszú ideig tétlen volt, vagy igény szerint létrehozható. Az összes kezelést a launchd végzi, és nekünk nem kell semmit sem tennünk ahhoz, hogy működjön.
a launchd rendelkezik információkkal a rendszerszintű erőforrások rendelkezésre állásáról és a memóriaterhelésről, ki tud jobban dönteni arról, hogyan használjuk a leghatékonyabban a rendszerünk erőforrásait, mint a launchd
XPC szolgáltatások megvalósítása
Az XPC szolgáltatás egy köteg a fő alkalmazáscsomag Contents/XPCServices könyvtárában; az XPC szolgáltatásköteg tartalmaz egy Info.plist fájlt, egy futtatható fájlt és a szolgáltatáshoz szükséges erőforrásokat. Az XPC szolgáltatás az xpc_main(3) Mac OS X Developer Tools Manual Page meghívásával jelzi, hogy melyik függvényt hívja meg, amikor a szolgáltatás üzeneteket kap, a főfüggvényéből.
Az XPC szolgáltatás létrehozásához az Xcode-ban a következőket kell tennie:
- Adjon hozzá egy új célt a projektjéhez, az XPC szolgáltatás sablon használatával.
- Adjon hozzá egy Fájlok másolása fázist az alkalmazás építési beállításaihoz, amely az XPC szolgáltatást a fő alkalmazáscsomag Contents/XPCServices könyvtárába másolja.
- Adjon hozzá egy függőséget az alkalmazás építési beállításaihoz, hogy jelezze, hogy az XPC szolgáltatáscsomagtól függ.
- Ha alacsony szintű (C-alapú) XPC szolgáltatást ír, implementáljon egy minimális főfüggvényt az eseménykezelő regisztrálásához, ahogy az a következő kódlistában látható. Helyettesítse a my_event_handler-t az eseménykezelő függvény nevével.
int main(int argc, const char *argv) {
xpc_main(my_event_handler);
// The xpc_main() function never returns.
exit(EXIT_FAILURE);
}
Ha magas szintű (Objective-C-alapú) szolgáltatást ír az NSXPCConnection használatával, először hozzon létre egy, az NSXPCListenerDelegate protokollnak megfelelő kapcsolati delegált osztályt. Ezután implementáljon egy minimális főfüggvényt, amely létrehoz és konfigurál egy listener objektumot, ahogy az a következő kódlistában látható.
int main(int argc, const char *argv) {
MyDelegateClass *myDelegate = ...
NSXPCListener *listener =
;
listener.delegate = myDelegate;
;
// The resume method never returns.
exit(EXIT_FAILURE);
}
A szolgáltatás használata
Az XPC szolgáltatás használatának módja attól függ, hogy a C API-val (XPC Services) vagy az Objective-C API-val (NSXPCConnection) dolgozik.
Az Objective-C NSXPCConnection API használata Az Objective-C NSXPCConnection API egy magas szintű távoli eljáráshívó interfészt biztosít, amely lehetővé teszi, hogy egy másik folyamatból (általában egy XPC szolgáltatás egy metódusát hívó alkalmazásból) egy folyamat objektumainak metódusait hívja meg. Az NSXPCConnection API automatikusan szerializálja az adatstruktúrákat és objektumokat az átvitelhez, és deszerializálja azokat a másik oldalon. Ennek eredményeképpen egy távoli objektumon egy metódus hívása ugyanúgy viselkedik, mint egy helyi objektumon.
Az NSXPCConnection API használatához a következőket kell létrehoznia:
- Egy interfészt. Ez főként egy protokollból áll, amely leírja, hogy milyen metódusok legyenek hívhatók a távoli folyamatból. Ezt a következő fejezetben ismertetjük: Egy interfész tervezése
- Egy kapcsolati objektum mindkét oldalon. A szolgáltatás oldalán ezt korábban a Szolgáltatás létrehozása című fejezetben ismertettük. Az ügyféloldalon ezt a Csatlakozás egy interfészhez és használata című fejezetben ismertettük.
- Egy figyelő. Ez a kód az XPC szolgáltatásban fogadja a kapcsolatokat. Ezt a Kapcsolat elfogadása a segédprogramban című fejezetben ismertetjük. Üzenetek.