Справочная информация: у меня есть два приложения для 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);
});