gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:06:55 24 4
gpt4 key购买 nike

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

  • 多点连接 - 最多只支持 8 个客户端。如果有办法解决这个问题,这正是我要找的东西
  • GameKit - 我了解到蓝牙连接在处理多个客户端时可能会出问题
  • BLE - 蓝牙的特征值限制为 512 个八位字节。我假设动物列表在存档时可能会增长到大于最大特征值。
  • 套接字 - 我宁愿不必依赖外部服务器

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

最佳答案

Multipeer Connectivity 仅支持每个 session 8 个对等点,但它支持多个 session 。在您的情况下,只有一个“服务器”设备和许多客户端,并且客户端不需要看到彼此,“服务器”可以根据需要创建新 session 。

因此,对于充当广告商并接受邀请的“服务器”节点,有一个方法可以返回现有 session 或创建一个新 session :

- (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;
}
}

当然可以对这种方法进行性能优化,但就我向对等方发送数据的频率而言,这种方法效果很好。

关于ios - 在 iPhone 之间传输数据的最佳选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20896791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com