Có hai cách để thực hiện việc này.
Cách đầu tiên sử dụng API GameKit. Bạn bắt đầu bằng việc có hai lớp riêng biệt, một lớp thực hiện giao thức GKSessionDelegate
và hoạt động như trình xử lý "GameKit/Bluetooth" và giao diện người dùng khác dưới dạng giao diện người dùng bản trình bày (rất có thể là một loại chế độ xem với bảng nhìn). Cách bạn sẽ kết nối nó là trình xử lý quản lý các thông báo GameKit vv và sau đó gọi các phương thức ủy nhiệm trên giao diện người dùng để cập nhật chế độ xem bảng khi một kết nối ngang hàng/bỏ đi, v.v. Theo cách đó, khi thiết bị đến và đi, danh sách bộ chọn của bạn nên cập nhật để hiển thị những người xung quanh.
Dưới đây là một số mã để giúp bạn bắt đầu:
- (BOOL) startPeer
{
BOOL result = NO;
if (!_session) {
_session = [[GKSession alloc] initWithSessionID:BLUETOOTHSESSION
displayName:nil
sessionMode:GKSessionModePeer];
_session.delegate = self;
[_session setDataReceiveHandler:self withContext:nil];
_session.available = YES;
result = YES;
}
return result;
}
- (void) stopPeer
{
// Set up the session for the next connection
//
[_session disconnectFromAllPeers];
_session.available = YES;
[self cleanupProgressWindow];
}
- (void) loadPeerList
{
self.peerList = [[NSMutableArray alloc] initWithArray:[_session peersWithConnectionState:GKPeerStateAvailable]];
}
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
BOOL peerChanged = NO;
switch(state) {
// When peer list changes, we adjust the available list
//
case GKPeerStateAvailable:
if (_peerList) {
[_peerList addObject:peerID];
peerChanged = YES;
}
break;
// When peer list changes, we adjust the available list
//
case GKPeerStateUnavailable:
if (_peerList) {
[_peerList removeObject:peerID];
peerChanged = YES;
}
break;
// Called when the peer has connected to us.
//
case GKPeerStateConnected:
// start reading and writing
break;
case GKPeerStateDisconnected:
{
if (_isWriter) {
_isConnected = NO;
_deviceToSend = nil;
[self cleanupProgressWindow];
} else {
// Other side dropped, clean up local data and reset for next connection
self.dataRead = nil;
}
}
break;
}
// Notify peer list delegate that the list has changed so they can update the UI
//
if (peerChanged)
CALLDELEGATE(_peerListDelegate, peerListChanged);
}
Cách thứ hai để làm điều đó là sử dụng cơ chế lựa chọn dịch vụ tiêu chuẩn Bonjour. GameKit được cài đặt trên đầu Bonjour (nhưng qua Bluetooth thay vì WiFi) nên một khi hai bên đã trải qua khả năng kết nối mạng với nhau và kết nối chúng được đăng ký theo Bonjour và hành động giống như bất kỳ dịch vụ Bonjour nào. Cách GameKit có thể dễ dàng hơn một chút, nhưng nếu bạn đã có mã cho WiFi, nó có thể được sử dụng lại cho Bluetooth.
Xin cảm ơn rất nhiều vì mẫu này đã được xây dựng. Một câu hỏi nữa, tôi có thể xem cách phiên làm việc: phương thức peer: didChangeState sẽ đi trong tệp delegate.h/.m, nhưng còn các phương thức khác thì sao? Liệu startPeer và stopPeer có đi trong các tệp viewcontroller.h/.m của tôi hay toàn bộ khuôn mẫu sẽ đi trong tệp ủy nhiệm? –
Trong trường hợp này, tất cả đều được giả định là trong trình xử lý ủy nhiệm vì chúng xử lý hệ thống ống nước GameKit cơ bản. Không có lý do gì bạn không thể đặt tất cả trong bộ điều khiển xem nhưng bạn nên giữ mã UI tách riêng khỏi mã mạng.Sau khi cập nhật mảng của các đồng nghiệp, đối tượng 'handler' gọi phương thức ủy nhiệm tùy chỉnh của riêng nó là "peerListChanged" để thông báo cho viewcontroller rằng danh sách đã thay đổi để nó có thể gọi lại bảng và hiển thị danh sách mới cho người dùng. – Ramin
Tính năng này chỉ hoạt động qua Wifi hay nó cũng sẽ tìm thấy các đồng nghiệp trên bluetooth? Bạn có phải sử dụng bộ chọn ngang hàng để sử dụng bluetooth không? – typeoneerror