XPC serviços em macOS app
>
Antes de XPC usávamos para pegar Tomadas e Mensagens de Máquinas (Mach Ports).
O mecanismo XPC oferece uma alternativa aos soquetes (ou Mach Services usando MIG) para IPC. Poderíamos ter, por exemplo, um processo que atua como “servidor” esperando que os clientes acessem sua API e forneçam algum serviço.
XPC Services on applications
Quando falamos de XPC Services (S maiúsculo), estamos nos referindo ao pacote chamado XPC Service. Bundles no ecossistema Apple refere-se a entidades representadas por uma estrutura de directórios específica. O Bundle mais comum que você encontra são os Application Bundles. Se você clicar com o botão direito em qualquer aplicação (por exemplo Chess.app) e selecionar Mostrar conteúdo, o que você encontrará é uma estrutura de diretórios. De volta ao XPC, as aplicações podem ter pacotes de serviços XPC. Você vai encontrá-los dentro do diretório Content/XPCServices/ dentro do pacote de aplicações. Você pode procurar em seu diretório /Applications e ver quantas das aplicações dependem do XPC Services.
Você também pode ter XPC Services dentro do Frameworks (Que são outro tipo de pacote).
Benefícios Adicionais do XPC Services
Usar XPC Services em nossas aplicações nos permite quebrar algumas funcionalidades em módulos separados (The XPC Service). Podemos criar um Serviço XPC que pode ser encarregado de executar algumas tarefas dispendiosas, mas pouco freqüentes. Por exemplo, alguma tarefa criptográfica para gerar números aleatórios.
Outro benefício adicional é que o Serviço XPC roda em seu próprio processo. Se esse processo falhar ou morrer, ele não afeta nossa aplicação principal. Imagine que a sua aplicação suporta plugins definidos pelo usuário. E os plugins são construídos usando o XPC Services. Se eles estiverem mal codificados e travarem, eles não afetarão a integridade da sua aplicação principal.
Um benefício adicional para o Serviço XPC é que eles podem ter seus próprios direitos. A aplicação só exigirá o direito quando fizer uso de um serviço fornecido pelo Serviço XPC que exija o direito. Imagine que você tem um aplicativo que utiliza localização, mas apenas para características específicas. O usuário poderia mover esses recursos para um Serviço XPC e adicionar o direito de localização apenas a esse Serviço XPC. Se o seu usuário nunca precisar do recurso que usa a localização, ele não será solicitado por permissões, tornando o uso do seu aplicativo mais confiável.
XPC e nosso amigo launchd
launchd é o primeiro processo a ser executado em nosso sistema. Ele está encarregado de lançar e gerenciar outros processos, serviços e daemons. launchd também está encarregado de agendar tarefas. Portanto, faz sentido que o launchd também seja responsável pelo gerenciamento do XPC Services.
XPC Service pode ser interrompido se ele estiver ocioso por um longo tempo, ou ser gerado sob demanda. Todo o gerenciamento é feito pelo launchd, e não precisamos fazer nada para que ele funcione.
launchd tem informações sobre disponibilidade de recursos em todo o sistema e pressão de memória, quem melhor para tomar decisões sobre como usar os recursos do nosso sistema da forma mais eficaz do que lançard
Implement XPC Services
Um serviço XPC é um pacote no diretório Content/XPCServices do pacote principal de aplicações; o pacote de serviços XPC contém um arquivo Info.plist, um executável, e quaisquer recursos necessários ao serviço. O serviço XPC indica qual função chamar quando o serviço recebe mensagens chamando xpc_main(3) Mac OS X Developer Tools Manual Page da sua função principal.
Para criar um serviço XPC em Xcode, faça o seguinte:
- Adicionar um novo alvo ao seu projeto, usando o modelo de serviço XPC.
- Adicionar uma fase Copy Files às configurações de compilação da sua aplicação, que copia o serviço XPC no diretório Contents/XPCServices do pacote principal da aplicação.
- Adicionar uma dependência às configurações de compilação da sua aplicação, para indicar que depende do pacote de serviços XPC.
- Se você está escrevendo um serviço XPC de baixo nível (baseado em C), implemente uma função principal mínima para registrar seu gerenciador de eventos, como mostrado na lista de códigos a seguir. Substitua my_event_handler pelo nome da sua função event handler.
int main(int argc, const char *argv) {
xpc_main(my_event_handler);
// The xpc_main() function never returns.
exit(EXIT_FAILURE);
}
Se você está escrevendo um serviço de alto nível (baseado em Objective-C) usando NSXPCConnection, primeiro crie uma classe de delegado de conexão que esteja de acordo com o protocolo NSXPCListenerDelegate. Depois, implemente uma função principal mínima que cria e configura um objeto ouvinte, como mostrado na seguinte listagem de código.
int main(int argc, const char *argv) {
MyDelegateClass *myDelegate = ...
NSXPCListener *listener =
;
listener.delegate = myDelegate;
;
// The resume method never returns.
exit(EXIT_FAILURE);
}
Usando o serviço
A forma como você usa um serviço XPC depende se você está trabalhando com a API C (XPC Services) ou com a API Objective-C (NSXPCConnection).
Para usar a API NSXPCConnection, você deve criar o seguinte:
- Uma interface. Isto consiste principalmente de um protocolo que descreve quais métodos devem ser chamáveis a partir do processo remoto. Isto é descrito em Projetando uma Interface
- Um objeto de conexão em ambos os lados. No lado do serviço, isto foi descrito anteriormente em Criando o Serviço. No lado do cliente, isto é descrito em Conectando e Usando uma Interface.
- Um ouvinte. Este código no serviço XPC aceita conexões. Isto está descrito em Aceitando uma conexão no helpper. Messages.