我可以使用Unix套接字在两个iOS应用程序之间进行本地通信吗?

时间:2019-05-16 13:34:27

标签: ios sockets ipc tcpsocket

背景:我有两个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);
});

0 个答案:

没有答案