背景:我有两个iOS应用程序,它们需要彼此本地交换数据。理想的情况是,应用程序A使用URL方案将应用程序B调用到前台,而应用程序A在后台,则这两个应用程序可以相互交换数据。我可以声明App A可以在后台运行(我有充分的理由这样做),因此A的后台执行不是问题。我不想继续对两个应用程序之间的数据交换部分使用URL方案,因为使用URL方案将打开另一个应用程序,这意味着如果进行多轮数据交换,这两个应用程序将被多次打开。
还请注意,这两个iOS应用程序不属于同一开发人员,因此在这种情况下,任何依赖应用程序组共享数据的操作都将无法工作...
目前,我已经找到了使用 Unix Internet Domain套接字的解决方案,该解决方案绑定到本地环回接口。从技术上讲,它可以正常工作,但我不知道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);
});