2010-02-19 34 views
6

Tôi muốn kết nối hai thiết bị bằng GKSession, bắt đầu từ một máy chủ và máy còn lại là máy khách. Sử dụng cấu hình này tôi không thể sử dụng GKPeerPickerController.GameKit: Hướng dẫn sử dụng GKSession

tôi đang gặp vấn đề để kết nối hai thiết bị:

  • Chỉ sử dụng bluetooth: không thể
  • sử dụng WiFi: ít nhất có một số trao đổi dữ liệu giữa các thiết bị nhưng conection không thành công.

Trong tập tin giao diện Tôi có

GKSessionDelegate 
GKSession *session; 

Trong việc thực hiện, tôi bắt đầu máy chủ sử dụng mã này:

session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeClient]; 
session.delegate = self; 
session.available = YES; 

Các khách hàng bắt đầu sử dụng mã này:

session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeServer]; 
session.delegate = self; 
session.available = YES; 

Cách tôi có thể buộc sử dụng Bluetooth thay vì t anh ta có WiFi không?

Ngoài ra tôi đã thực hiện những cuộc gọi:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
NSLog(@"Someone is trying to connect"); 
} 

- (BOOL)acceptConnectionFromPeer:(NSString *)peerID error:(NSError **)error { 
NSLog(@"acceptConnectionFromPeer"); 
} 

Khi tôi bắt đầu, tôi có được điều này vào debugger:

Listening on port 50775 
2010-02-19 14:55:02.547 iFood[3009:5103] handleEvents started (2) 

Và khi thiết bị khác bắt đầu để tìm, tôi có được điều này:

~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00eGs1R1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500 
** peer 1527211048: oldbusy=0, newbusy=0 
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
GKPeer[186960] 1527211048 service count old=1 new=2 
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00egs1r1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200 
** peer 1527211048: oldbusy=0, newbusy=0 
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00TF5kc1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00tf5kc1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200 
** peer 1723356125: oldbusy=0, newbusy=0 
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00TF5kc1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500 
** peer 1723356125: oldbusy=0, newbusy=0 

Tôi đang thiếu gì ở đây?

Tôi chắc chắn rằng cả hai thiết bị đều đã bật Bluetooth và được kết nối vào cùng một mạng WiFi.

cảm ơn,

r.

+1

FYI, GKSessionModeClient và GKSessionModeServer của bạn được hoán đổi. – Jeff

Trả lời

-1

Tôi đã có vấn đề tương tự, nhưng từ mô tả ở trên tôi nghĩ rằng bạn đang làm cho một số lỗi:

GKSession chỉ thực hiện BT; nếu bạn sử dụng bộ chọn, bạn có thể cung cấp các phương pháp riêng để xử lý kết nối WiFi.

Các "didReceiveConnectionRequestFromPeer" phương pháp nên gọi các "acceptConnectionFromPeer" phương pháp trên đối tượng phiên - bạn không thực hiện "acceptConnectionFromPeer" trên đại biểu của mình.

Để gỡ lỗi, bạn nên ghi nhật ký thay đổi trạng thái theo phương thức ủy nhiệm "phiên: peer: didChangeState:" (xem http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html). Khi một người ngang hàng là "Có sẵn", bạn có thể gọi "connectToPeer:"; khi "Đã kết nối", bạn có thể sử dụng "sendData: toPeers:".

Đối với IO sau khi bạn đã thiết lập kết nối, bạn muốn gọi phương thức "setDataReceiveHandler: withContext:" trong phiên làm việc đó là .

Trước đó tôi đã có một số lỗi chính tả trong mã của tôi nhưng nó hiện đang hoạt động.

Chúc may mắn.

+0

Xin chào, Tôi có các phương thức đại biểu được triển khai, nhưng tôi đã không viết chúng vào mã. Ngoài ra phiên của tôi: peer: didChangeState không bao giờ nhận cuộc gọi khi sử dụng GKSession, nhưng nó được gọi khi tôi sử dụng bộ chọn. Cho đến khi tôi tìm thấy thêm thông tin về những gì có thể sai hoặc tại sao nó không hoạt động, tôi đang sử dụng GKPicker ... cảm ơn, ít nhất tôi biết tôi không phải là người duy nhất ... :-) liên quan, r. – mongeta

+3

"GKSession chỉ thực hiện BT" ... điều này không đúng. – typeoneerror

+0

@type Trong khi điều này là đúng bây giờ, tôi tin vào thời điểm câu trả lời này được cho là 'GameKit' chỉ hỗ trợ kết nối bluetooth và bạn phải sử dụng' CFNetwork' để kết nối các thiết bị qua WiFi. Sẽ chính xác hơn khi nói "Điều này không còn đúng như' GameKit' bây giờ hỗ trợ kết nối WiFi. " –

1

Tôi nghĩ bạn bỏ lỡ chấp nhận kết nối với khách hàng. Sau khi nhận được "didReceiveConnectionRequestFromPeer" gọi lại, bạn cần phải chấp nhận kết nối với khách hàng như thế này:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
    NSLog(@"Someone is trying to connect"); 
    NSError *error; 
    [gkSession acceptConnectionFromPeer:peerID error:&error]; 
    if(error) 
    NSLog(@"Error on accept connection with peer: ", error); 
} 

Sau đó bạn sẽ nhận được "GKPeerStateConnected" ở đây:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{} 

Tôi hy vọng điều này giúp bạn.

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