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

2023-11-24

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

  • 多点连接 - 最多仅支持 8 个客户端。如果有办法解决这个问题,这正是我所寻找的
  • GameKit - 我读到在处理多个客户端时蓝牙连接可能会出现问题
  • BLE - 蓝牙的特征值限制为 512 个八位位组。我假设动物列表在存档后可能会变得大于最大特征值。
  • 套接字 - 我不想依赖外部服务器

我愿意接受“hacky”解决方案。我正在考虑将每种动物作为单独的特征进行广播,但这可能会减慢发现速度,而且我有一种感觉,这会导致其他一些令人头痛的问题。任何帮助将不胜感激


多点连接仅支持每个会话 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;
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iPhone 之间传输数据的最佳选择 的相关文章

随机推荐