Ich arbeite an einer iPhone-App, die Peer-to-Peer-Verbindungen ermöglicht. Soweit ich weiß, habe ich die Wahl zwischen GKPeerPicker oder der GKSession. Ich mag die Idee nicht, den PeerPicker zu verwenden, weil ich ein benutzerdefiniertes Interface zeigen möchte, also entschied ich mich, mit GKSession zu gehen, und hey, BONUS ist, dass es auch über Wi-Fi funktioniert, während der Peer Picker das nicht tut.GKSession - was passiert, wenn Bluetooth und Wi-Fi ausgeschaltet sind?
OK, also Problem ist ... was ist, wenn der Benutzer sowohl Bluetooth und Wi-Fi ausgeschaltet hat? Im Peer Picker gibt es eine Aufforderung, Bluetooth einzuschalten, ohne die App zu verlassen. GKSession hat es nicht ... aber woah warte eine Sekunde, es scheint, dass ich nicht einmal überprüfen kann, ob Bluetooth an ist oder nicht programmatisch!
Carpe Cocoa claims no problem, verwenden Sie einfach die Methode session:didFailWithError:
des Delegierten. Aber, wie es in den Kommentaren erklärt ... das scheint nicht mehr zu funktionieren! Und nach meiner Erfahrung stimme ich zu.
Gibt es eine andere Möglichkeit, programmgesteuert zu prüfen, ob Bluetooth aktiviert ist? Ist das etwas, für das ich die Erreichbarkeit nutzen sollte? Oder ist es nur ein Fehler, den Apple noch beheben muss?
Um genauer zu sein, ich meine Sitzung wie folgt zu erstellen:
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];
Die Klasse implementiert die GKSessionDelegate, und ich weiß, dass es funktioniert, weil, wenn ich Bluetooth eingeschaltet haben, werden die Delegatmethoden genannt kein Problem. Ich habe sie als solche umgesetzt:
#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);
}
Keiner der Protokollanweisungen gedruckt werden, und ich Haltepunkte in jeder Methode, aber keiner von ihnen sind getroffen, wenn der Benutzer sowohl Bluetooth und Wi-Fi ausgeschaltet. Ich hatte gehofft, dass etwas passieren würde, um eine Sitzung auszulösen: didFailWithError: damit ich den Benutzer auffordern könnte, Bluetooth zu aktivieren oder eine Verbindung zu einem Wi-Fi-Netzwerk herzustellen.
Klingt wie ein Fehler oder möglicherweise eine Verbesserungsanfrage. Sie sollten ein Radar einreichen. –