/ / Pomocná aplikácia pre mac (prihlasovacia položka), ktorá nie je schopná komunikovať s objektívmi -c, xcode, macos, kakao

Pomocná aplikácia Mac (položka prihlasovania), ktorá nedokáže komunikovať s objektom c, xcode, makom, kakaom

Urobil som presne tak, ako to uvádza príklad aplikácie pomocníka v karanténe od spoločnosti Apple, a zdá sa, že všetky fungujú dobre. Som schopný úspešne vytvoriť NSXPCConnection a tiež získať späť môj vzdialený objekt (cez remoteObjectProxyWithErrorHandler).

Keď však zavolám metódu na objekt proxy (definovaný v definícii protokolu), vrátim túto chybu:

Failed to connect to launch agent: Error Domain=NSCocoaErrorDomain Code=4099 "Couldn’t communicate with a helper application.

V podstate bez ohľadu na to, čo robím, nie som schopnýkomunikovať s mojou pomocnou aplikáciou. Nerobím nič fantázie, len sa snažím jednoduchým spôsobom zavolať pomocnej aplikácii na niečo NSLog (). Ale nefunguje to. Napodiv nevidím žiaden výstup zvnútra:

- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection

Čo by som mohol robiť zle?

UPDATE: Ak v hlavnej aplikácii zruším začiarknutie políčka „Povoliť karanténu aplikácií“, bude to fungovať! Takže je niečo zlé na povolení karantény, po ktorom nechce komunikovať so svojou pomocnou aplikáciou. Potrebujem viac oprávnení? Skúsil som ich všetky pod xcode!

odpovede:

12 pre odpoveď č. 1

Vaša pomocná aplikácia je v karanténe. Preto nemôže dynamicky registrovať službu mach, aj keď ju Xcode umožňuje na účely ladenia.

Keď však pridáte svoju pomocnú aplikáciu do prihlasovacích položiek (pomocou SMLoginItemSetEnabled ()), launchd automaticky zaregistruje službu mach pre vás pomenovanú s jej identifikátorom zväzku.

Teraz je vaša hlavná aplikácia izolovaná. Preto nie je povolená náhodná mach komunikácia. Jediným spôsobom, ako to fungovať, bolo pridať dočasné oprávnenie na vyhľadávanie strojov.

Od 10.7.4. Spoločnosť Apple predstavila oprávnenia skupín aplikácií ako riešenie pre tento prípad, keď aplikácia potrebuje komunikovať s pomocnou aplikáciou.

Obe aplikácie musia zdieľať to isténárok skupín aplikácií. Môže to byť ľubovoľná hodnota, ale spoločnosť Apple vyžaduje, aby táto hodnota začínala vaším ID tímu (napr .: Team-id.myApp). Potom musí váš identifikátor balíka pomocných aplikácií začínať rovnakým oprávnením (napr. Team-id.myApp.myHelperApp). Potom môže vaša hlavná aplikácia voľne komunikovať s pomocnou aplikáciou pomocou komunikácie XPC so službou pomenovanou s identifikátorom zväzku pomocných aplikácií (t. J. Team-id.myApp.myHelperApp). Obe aplikácie budú tiež zdieľať prístup do priečinka skupinových kontajnerov s názvom s oprávnením skupiny aplikácií (napr. ~ / Library / Group Containers / Team-id.myApp), ktoré musíte vytvoriť ručne, ak ho budete potrebovať.


4 pre odpoveď č. 2

Dobre, tak som sa naučil tvrdo - existujúveľa problémov s aplikáciou Sandboxing a XPC, nehovoriac o pomocných aplikáciách a zdieľaní databáz pomocou takzvaného „zdieľaného skupinového adresára“, ktorý sa nevytvorí automaticky (ako sa uvádza v dokumentácii nesprávne), ani NSURL ponúknuť metódu, ktorú požaduje v dokumentácii.

Hoci dokumentácia hovorí, že v oprávneniach môžete vo formáte zadať ľubovoľný reťazec ako „identifikátor zdieľanej aplikácie“ <TEAM_ID>.whatever, zrejme to bude fungovať IBA, ak použijete formát: <TEAM_ID>.com.yourcompany

Čokoľvek iné a nevyšlo to. Bude to kompilovať, bude to archív, bude to bežať, ale nevyhrá sa vám to umožní hovoriť s pomocnou aplikáciou. Po strávení asi 30 hodín som si myslel, že sakra skúsim poslednú zmenu a zrejme to bolo ono! Radar na strašne napísanú dokumentáciu karantény (na ktorú sa veľa na fóre vývojárov spoločnosti Apple sťažuje) ďalej ...