Tôi đang làm việc trên ứng dụng iPhone cho phép kết nối ngang hàng. Từ những gì tôi hiểu, tôi có sự lựa chọn giữa việc sử dụng GKPeerPicker hoặc GKSession. Tôi không thích ý tưởng sử dụng PeerPicker vì tôi muốn hiển thị một giao diện tùy chỉnh, vì vậy tôi quyết định đi với GKSession, và hey, THƯỞNG là nó cũng hoạt động qua Wi-Fi, trong khi Peer Picker thì không.GKSession - điều gì xảy ra nếu tôi đã tắt Bluetooth và Wi-Fi?
OK, vậy vấn đề là ... nếu người dùng đã tắt cả Bluetooth và Wi-Fi thì sao? Trong Công cụ chọn ngang hàng, có lời nhắc bật Bluetooth khi rời khỏi ứng dụng. GKSession không có nó ... nhưng woah chờ một chút, có vẻ như tôi thậm chí không thể kiểm tra xem Bluetooth có bật hay không lập trình!
Carpe Cocoa claims no problem, chỉ cần sử dụng phương thức session:didFailWithError:
của Đại biểu. Nhưng, như nó giải thích trong các ý kiến ... mà dường như không hoạt động nữa! Và theo kinh nghiệm của tôi, tôi đồng ý.
Có cách nào khác để kiểm tra theo chương trình nếu Bluetooth đang bật không? Đây có phải là điều tôi nên tận dụng Khả năng hiển thị không? Hay đó chỉ là một lỗi mà Apple chưa sửa?
Để cụ thể hơn, tôi là tạo ra phiên của tôi như thế này:
GKSession *aSession = [[GKSession alloc] initWithSessionID:nil
displayName:user.displayName
sessionMode:GKSessionModePeer];
self.gkSession = aSession;
[aSession release];
self.gkSession.delegate = self;
self.gkSession.available = YES;
[self.gkSession setDataReceiveHandler:self withContext:NULL];
Lớp thực hiện các GKSessionDelegate, và tôi biết rằng nó đang làm việc bởi vì khi tôi có bluetooth bật, các phương pháp đại biểu được mời gọi không vấn đề gì. Tôi đã thực hiện đối tượng này như:
#pragma mark -
#pragma mark GKSessionDelegate methods
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
if (GKPeerStateAvailable == state) {
[session connectToPeer:peerID withTimeout:10];
} else if (GKPeerStateConnected == state) {
// gets user
NSError *error = nil;
[session sendData:user.connectionData
toPeers:[NSArray arrayWithObjects:peerID,nil]
withDataMode:GKSendDataReliable error:&error];
if (error)
NSLog(@"%@",error);
}
}
- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
NSError *error = nil;
[session acceptConnectionFromPeer:peerID error:&error];
if (error)
NSLog(@"%@",error);
}
- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error {
NSLog(@"%@",error);
}
- (void)session:(GKSession *)session didFailWithError:(NSError *)error {
NSLog(@"%@",error);
}
Không ai trong số những điều khoản đăng nhập được in và tôi đặt breakpoint trong mỗi phương pháp, nhưng không ai trong số họ được nhấn khi người dùng có cả Bluetooth và Wi-Fi tắt. Tôi đã hy vọng rằng điều gì đó sẽ xảy ra để kích hoạt phiên làm việc: didFailWithError: để tôi có thể nhắc người dùng bật Bluetooth hoặc kết nối với mạng Wi-Fi.
Âm thanh như lỗi hoặc có thể là yêu cầu nâng cao. Bạn nên ghi một radar. –