Можно ли использовать сокет Unix для локальной связи между двумя приложениями iOS - PullRequest
0 голосов
/ 16 мая 2019

Справочная информация: у меня есть два приложения для iOS, которым нужно обмениваться данными локально друг с другом. Идеальным сценарием является то, что приложение A вызывает приложение B на переднем плане по схеме URL, а приложение A в фоновом режиме позволяет двум приложениям обмениваться данными друг с другом несколько раундов. Я могу объявить приложение A способным работать в фоновом режиме (у меня есть веская причина для этого), поэтому фоновое выполнение для A не является проблемой. Я не хочу продолжать использовать схему URL для части обмена данными между двумя приложениями, потому что использование схемы URL откроет другое приложение, и это означает, что эти два приложения будут открываться несколько раз, если происходит несколько раундов обмена данными.

Также обратите внимание, что эти два приложения iOS не принадлежат одному и тому же разработчику, поэтому все, что зависит от группы приложений для обмена данными, в этом случае не будет работать ...

В настоящее время я нашел решение, использующее Unix Internet Domain Socket , который связывается с локальным интерфейсом обратной связи. Технически это работает, но я не знаю, разрешает ли Apple это или нет? Есть ли лучший способ сделать это?

Это код для сокета Unix:

Для серверного приложения (приложение A):

BOOL _listenForConnections = false;
    int listenfd = 0;
    struct sockaddr_in serv_addr;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(8008);
    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    _listenForConnections = true;
    listen(listenfd, 10);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"Waiting for connections...");
        while (_listenForConnections)
        {
            __block int connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
            NSLog(@"Connection accepted");
            char buffer[4096];
            bzero(buffer, 4096);
            NSString *message = @"";
            bool continueReading = true;
            do{
                recv(connfd , buffer , 4096 , 0);
                    continueReading = false;
                NSLog(@"%@", [NSString stringWithFormat: @"%@", [NSString stringWithFormat: @"Received message from client: %@%s", message, buffer]]);
            }while (continueReading);
            char* answer = "Hello World";
            write(connfd, answer, strlen(answer));
            NSLog(@"%@", [NSString stringWithFormat: @"Sent response to client"]);
        }
        NSLog(@"Now stop listening for connections");
        close(listenfd);
});
...