2011-08-29 6 views
0

Je suis en train de lire "début de développement d'applications iPad", et au chapitre bluetooth je teste le code exactement comme il apparaît dans le livre. La seule différence est que le livre était pour 3.2 et j'utilise XCODE 4 pour iOS> 4.0. XCODE ne jette aucune erreur ou avertissement, il construit correctement, mais lors de tests sur l'iPhone, il ne découvre pas d'autres périphériques.iOS 4 découverte bluetooth ne fonctionne pas

Qu'est-ce qui ne va pas?

Le viewController.h ressemble:

#import <UIKit/UIKit.h> 
#import <GameKit/GameKit.h> 

@interface pruebaBluetoothViewController : UIViewController 
<GKSessionDelegate, GKPeerPickerControllerDelegate> { 
GKSession *currentSession; 
IBOutlet UITextField *txtMessage; 
IBOutlet UIButton *connect; 
IBOutlet UIButton *disconnect; 
GKPeerPickerController *picker; 
} 
@property (nonatomic, retain) GKSession *currentSession; 
@property (nonatomic, retain) UITextField *txtMessage; 
@property (nonatomic, retain) UIButton *connect; 
@property (nonatomic, retain) UIButton *disconnect; 
-(IBAction) btnSend:(id) sender; 
-(IBAction) btnConnect:(id) sender; 
-(IBAction) btnDisconnect:(id) sender; 
@end 

Alors que le .m ressemble:

#import "pruebaBluetoothViewController.h" 

@implementation pruebaBluetoothViewController 

@synthesize currentSession; 
@synthesize txtMessage; 
@synthesize connect; 
@synthesize disconnect; 

- (void)viewDidLoad { 
[connect setHidden:NO]; 
[disconnect setHidden:YES]; 
[super viewDidLoad]; 
} 
-(IBAction) btnConnect:(id) sender { 
picker = [[GKPeerPickerController alloc] init]; 
picker.delegate = self; 
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; 
[connect setHidden:YES]; 
[disconnect setHidden:NO]; 
[picker show]; 
} 
- (void)peerPickerController:(GKPeerPickerController *)pk 
didConnectPeer:(NSString *)peerID 
toSession:(GKSession *) session { 
self.currentSession = session; 
session.delegate = self; 
[session setDataReceiveHandler:self withContext:nil]; 
picker.delegate = nil; 
[picker dismiss]; 
[picker autorelease]; 
} 
- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)pk { 
picker.delegate = nil; 
[picker autorelease]; 
[connect setHidden:NO]; 
[disconnect setHidden:YES]; 
} 
-(IBAction) btnDisconnect:(id) sender { 
[self.currentSession disconnectFromAllPeers]; 
[self.currentSession release]; 
currentSession = nil; 
[connect setHidden:NO]; 
[disconnect setHidden:YES]; 
} 
- (void)session:(GKSession *)session 
peer:(NSString *)peerID 
didChangeState:(GKPeerConnectionState)state { 
switch (state) { 
case GKPeerStateConnected: 
NSLog(@"connected"); 
break; 
case GKPeerStateDisconnected: 
NSLog(@"disconnected"); 
[self.currentSession release]; 
currentSession = nil; 
[connect setHidden:NO]; 
[disconnect setHidden:YES]; 
break; 
} 
} 
- (void)dealloc { 
[txtMessage release]; 
[currentSession release]; 
[super dealloc]; 
} 

- (void) mySendDataToPeers:(NSData *) data { 
if (currentSession) 
[self.currentSession sendDataToAllPeers:data 
withDataMode:GKSendDataReliable 
error:nil]; 
} 
-(IBAction) btnSend:(id) sender { 
//---convert an NSString object to NSData--- 
NSData* data; 
NSString *str = [NSString stringWithString:txtMessage.text]; 
data = [str dataUsingEncoding: NSASCIIStringEncoding]; 
[self mySendDataToPeers:data]; 
} 
- (void) receiveData:(NSData *)data 
fromPeer:(NSString *)peer 
inSession:(GKSession *)session 
context:(void *)context { 
//---convert the NSData to NSString--- 
NSString* str; 
str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data received" 
message:str 
delegate:self 
cancelButtonTitle:@"OK" 
otherButtonTitles:nil]; 
[alert show]; 
[alert release]; 
} 
+0

Avez-vous d'autres appareils sur votre application et en cours d'exécution? –

Répondre

1

ressemble vous avez manqué la méthode délégué suivante:

- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type { 
    GKSession *session = [[GKSession alloc] initWithSessionID:kTankSessionID displayName:nil sessionMode:GKSessionModePeer]; 
    return [session autorelease]; // peer picker retains a reference, so autorelease ours so we don't leak. 
} 

Hope this aide.

Questions connexes