在iPhone之间传输数据的最佳选择

 mobiledu2502899157 发布于 2023-02-06 19:45

我想设置一个客户端 - 服务器架构,用于在多个iPhone之间传输数据.例如,'服务器'iPhone拥有动物的主列表.任意数量的客户端iPhone可以连接到服务器iPhone,然后读取和编辑列表.我试过的一些方法:

多路连接 - 仅支持最多8个客户端.如果有办法解决这个问题,那正是我正在寻找的

GameKit - 我已经读过,当处理多个客户端时,蓝牙连接可能会出错

BLE - 蓝牙的特征值限制为512个八位字节.我假设动物列表在存档时可能会增长到大于最大特征值.

套接字 - 我宁愿不必依赖外部服务器

我愿意接受'hacky'解决方案.我想把每只动物作为一个独立的特征进行广播,但这可能会减慢发现速度,我觉得它会引起一些其他的麻烦.任何帮助将不胜感激

1 个回答
  • Multipeer Connectivity每个会话仅支持8个对等,但它支持多个会话.在您的情况下,如果单个"服务器"设备具有许多客户端,并且客户端不需要彼此看到,则"服务器"可以根据需要创建新会话.

    因此,如果"服务器"对等方充当广告客户并接受邀请,请使用返回现有会话或创建新会话的方法:

    - (MCSession *)availableSession {
    
       //Try and use an existing session (_sessions is a mutable array)
       for (MCSession *session in _sessions)
           if ([session.connectedPeers count]<kMCSessionMaximumNumberOfPeers)
               return session;
    
        //Or create a new session
        MCSession *newSession = [self newSession];
        [_sessions addObject:newSession];
    
        return newSession;
    }
    
    - (MCSession *)newSession {
    
        MCSession *session = [[MCSession alloc] initWithPeer:_myPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];
        session.delegate = self;
    
        return session;
    }
    
    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
    
        MCSession *session = [self availableSession];
        invitationHandler(YES,session);
    }
    

    然后我有这个发送方法:

    - (void)sendData:(NSData *)data toPeers:(NSArray *)peerIDs reliable:(BOOL)reliable error:(NSError *__autoreleasing *)error {
    
        if ([peerIDs count]==0)
            return;
    
        NSPredicate *peerNamePred = [NSPredicate predicateWithFormat:@"displayName in %@", [peerIDs valueForKey:@"displayName"]];
    
        MCSessionSendDataMode mode = (reliable) ? MCSessionSendDataReliable : MCSessionSendDataUnreliable;
    
        //Need to match up peers to their session
        for (MCSession *session in _sessions){
    
            NSError __autoreleasing *currentError = nil;
    
            NSArray *filteredPeerIDs = [session.connectedPeers filteredArrayUsingPredicate:peerNamePred];
    
            [session sendData:data toPeers:filteredPeerIDs withMode:mode error:&currentError];
    
            if (currentError && !error)
                *error = currentError;
        }
    }
    

    当然可以对这种方法进行性能优化,但是对于我向同行发送数据的频率,这已经足够好了.

    2023-02-06 19:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有