2009-06-26 39 views
7

Tôi có cần để sử dụng số Peer Picker để tìm các đồng nghiệp trong iPhone SDK 3.0 mới không?GameKit trong iPhone SDK 3.0

Tôi thực sự không muốn sử dụng, nhưng tôi muốn sử dụng kết nối Bluetooth ngang hàng. Có bất kỳ mã mẫu nào thể hiện kết nối Bluetooth mà không sử dụng Bộ chọn ngang hàng không? Các trò chơi GKTank mà Apple cung cấp sử dụng Peer Picker, vì vậy tôi không thể sử dụng nó.

Trả lời

12

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.

+0

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? –

+0

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

+0

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

-2

Tại sao bạn không muốn sử dụng?

Tôi không biết có cách nào để tự mình thực hiện kết nối bluetooth trực tiếp và trình bày thay thế cho việc tìm kết nối bằng các phương tiện khác. Nó cung cấp một hệ thống khá đẹp để thiết lập một mạng giữa một số iPod/Touch, và cho phép bạn xác định xem mối quan hệ thực sự là ngang hàng hay master/slave ...

+0

Vâng, tôi đang thiết kế một mạng bluetooth đặc biệt trên thiết bị di động, trong đó tôi sẽ thực hiện nhiệm vụ tính toán phân tán bằng các kỹ thuật khai phá dữ liệu. Tôi không muốn người dùng (tôi) lo lắng về việc chọn một người ngang hàng để kết nối. Tôi dự định thiết lập nó để tất cả iPod Touch chỉ quét tất cả các thiết bị iPhones/iPod Touch có sẵn và sau đó tắt nhiệm vụ cho từng thiết bị. Khi nói đến một đồng đẳng, nếu người ngang hàng "bận" đã làm một công việc, thì nó sẽ tự động chuyển sang đồng đẳng tiếp theo. –

+2

Trong trường hợp đó, hãy xây dựng khách hàng để tự động chấp nhận lời mời và xử lý toàn bộ điều như một mối quan hệ chủ-nô lệ. Mọi người đều phải chạy ứng dụng này để làm việc, bluetooth hoặc WiFi (mặc dù thực tế bạn có thể dựa trên thông báo, mặc dù không có cách nào để tự động chấp nhận khởi chạy ứng dụng của bạn từ thông báo nếu ứng dụng chưa chạy) . –

+0

Vâng, đó là ý tưởng ... để tự động chấp nhận kết nối, đó sẽ là bước tiếp theo của tôi sau khi tôi thiết lập kết nối lần đầu tiên giữa hai lần chạm iPod. Tôi sẽ có tổng cộng tám để làm việc với một khi tất cả mọi thứ được và chạy. –

Các vấn đề liên quan