2013-09-04 8 views
9

Ich habe diese Playlist der Songs in meiner App.Ich möchte ein Lied aus dieser Playlist auf Anthere Gerät (iPhone) mit Bluetooth spielen.Abspielen eines Songs auf einem anderen Gerät mit Bluetooth

Das ist, was ich so für

#import "BrowseStationsViewController.h" 

@interface BrowseStationsViewController(){ 
GKSession *gkSession; 
} 

@end 

@implementation BrowseStationsViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

#pragma mark - 
    - (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view 

    [self setupSession]; 

NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; 

// Register for notifications when the application leaves the background state 
// on its way to becoming the active application. 
[defaultCenter addObserver:self 
        selector:@selector(setupSession) 
         name:UIApplicationWillEnterForegroundNotification 
        object:nil]; 

// Register for notifications when when the application enters the background. 
[defaultCenter addObserver:self 
        selector:@selector(teardownSession) 
         name:UIApplicationDidEnterBackgroundNotification 
        object:nil]; 


     } 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
    } 



    #pragma mark - GKSession setup and teardown 

    - (void)setupSession 
{ 
gkSession = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer]; 
gkSession.delegate = self; 
gkSession.disconnectTimeout = kDisconnectTimeout; 
gkSession.available = YES; 

self.title = [NSString stringWithFormat:@"GKSession: %@", gkSession.displayName]; 
    } 

- (void)teardownSession 
{ 
[gkSession disconnectFromAllPeers]; 
gkSession.available = NO; 
gkSession.delegate = nil; 
} 


#pragma mark - GKSessionDelegate protocol conformance 

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:  (GKPeerConnectionState)state 
{ 
switch (state) 
{ 
    case GKPeerStateAvailable: 
    { 
     NSLog(@"didChangeState: peer %@ available", [session displayNameForPeer:peerID]); 

     [NSThread sleepForTimeInterval:kSleepTimeInterval]; 

     [session connectToPeer:peerID withTimeout:kConnectionTimeout]; 
     break; 
    } 

    case GKPeerStateUnavailable: 
    { 
     NSLog(@"didChangeState: peer %@ unavailable", [session displayNameForPeer:peerID]); 
     break; 
    } 

    case GKPeerStateConnected: 
    { 
     NSLog(@"didChangeState: peer %@ connected", [session displayNameForPeer:peerID]); 
     break; 
    } 

    case GKPeerStateDisconnected: 
    { 
     NSLog(@"didChangeState: peer %@ disconnected", [session displayNameForPeer:peerID]); 
     break; 
    } 

    case GKPeerStateConnecting: 
    { 
     NSLog(@"didChangeState: peer %@ connecting", [session displayNameForPeer:peerID]); 
     break; 
    } 
} 

[self.tableView reloadData]; 
    } 


- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID 
    { 
NSLog(@"didReceiveConnectionRequestFromPeer: %@", [session displayNameForPeer:peerID]); 

[session acceptConnectionFromPeer:peerID error:nil]; 

[self.tableView reloadData]; 
    } 

    - (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error 
    { 
NSLog(@"connectionWithPeerFailed: peer: %@, error: %@", [session displayNameForPeer:peerID], error); 

[self.tableView reloadData]; 
    } 

- (void)session:(GKSession *)session didFailWithError:(NSError *)error 
    { 
NSLog(@"didFailWithError: error: %@", error); 

[session disconnectFromAllPeers]; 

[self.tableView reloadData]; 
    } 

#pragma mark - UITableViewDataSource protocol conformance 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    { 
// We have 5 sections in our grouped table view, 
// one for each GKPeerConnectionState 
return 3; 
    } 

    - (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
    { 
NSInteger rows; 

NSInteger peerConnectionState = section; 

switch (peerConnectionState) 
{ 
    case GKPeerStateAvailable: 
    { 
     NSArray *availablePeers = [gkSession peersWithConnectionState:GKPeerStateAvailable]; 
     rows = availablePeers.count; 
     break; 
    } 

    case GKPeerStateConnected: 
    { 
     NSArray *connectedPeers = [gkSession peersWithConnectionState:GKPeerStateConnected]; 
     rows = connectedPeers.count; 
     break; 
    } 

    case GKPeerStateUnavailable: 
    { 
     NSArray *unavailablePeers = [gkSession peersWithConnectionState:GKPeerStateUnavailable]; 
     rows = unavailablePeers.count; 
     break; 
    } 
} 

// Always show at least 1 row for each GKPeerConnectionState. 
if (rows < 1) 
{ 
    rows = 1; 
} 

return rows; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *headerTitle = nil; 

NSInteger peerConnectionState = section; 

switch (peerConnectionState) 
{ 
    case GKPeerStateAvailable: 
    { 
     headerTitle = @"Available Peers"; 
     break; 
    } 


    case GKPeerStateConnected: 
    { 
     headerTitle = @"Connected Peers"; 
     break; 
    } 


    case GKPeerStateUnavailable: 
    { 
     headerTitle = @"Unavailable Peers"; 
     break; 
    } 
} 

return headerTitle; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSString * cellId = @"Cell"; 
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 
if(!cell){ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId]; 
} 


NSInteger peerConnectionState = indexPath.section; 

NSArray *peers = nil; 

switch (peerConnectionState) 
{ 
    case GKPeerStateAvailable: 
    { 
     peers = [gkSession peersWithConnectionState:GKPeerStateAvailable]; 
     break; 
    } 

    case GKPeerStateConnected: 
    { 
     peers = [gkSession peersWithConnectionState:GKPeerStateConnected]; 
     break; 
    } 


    case GKPeerStateUnavailable: 
    { 
     peers = [gkSession peersWithConnectionState:GKPeerStateUnavailable]; 
     break; 
    } 
} 

NSInteger peerIndex = indexPath.row; 

if ((peers.count > 0) && (peerIndex < peers.count)) 
{ 
    NSString *peerID = [peers objectAtIndex:peerIndex]; 

    if (peerID) 
    { 
     cell.textLabel.text = [gkSession displayNameForPeer:peerID]; 
    } 
} 

return cell; 
} 

    @end 

please see the screen shot

Jetzt habe ich keine Ahnung, getan haben, wie jemand bitte mir proceed.Could ?? helfen Durch Auswahl eines Songs kann es auf abgespielt werden ein anderes Gerät ??

+0

Apple wird Ihre App höchstwahrscheinlich ablehnen, wenn Sie GameKit verwenden, aber Ihre App kein echtes Spiel ist. – Wain

+0

Einige Details bitte, weil ich Gamekit verwende.Danke – Machete

+0

GameKit ist für Spiele. Apple lässt es nicht zu, wenn deine App kein Spiel ist. Auch wenn die App spielähnliche Funktionen hat, aber nicht wirklich ein Spiel ist, werden sie es normalerweise ablehnen. – Wain

Antwort

1

GameKit ist für Inter-Geräte-Spiele gedacht. Vielleicht möchten Sie sich dazu CBPeripheralManager oder CBCentralManager ansehen, abhängig von dem Gerät, mit dem Sie interagieren. Da es sich um eine niedrigere Ebene handelt, müssen Sie mehr tun, um die Verbindung einzurichten, aber es gibt Unmengen von Lernprogrammen und Beispielcode, die Ihnen helfen.

+0

Was passiert, wenn eine Plattform Bluetooth Low Energy nicht unterstützt? Ich kann es dann nicht richtig nutzen ?? – Machete

+0

Ja, das funktioniert nur mit BLE. – Mark

+0

Also muss ich mit Gamekit.Framework oder einem anderen Framework gehen, aber ich habe keine Ahnung, wie es weitergeht :( – Machete

0

Ok, lass uns zu dem Punkt kommen, an dem du feststeckst .. Du kannst die gleiche Logik mit einigen anderen Bibliotheken verwenden, aber so sollte es gehen. Sie müssen die Songdaten in Chunks senden und mit dem anderen Gerät synchronisieren, während der vorherige Chunk am anderen Ende empfangen wird. Da wir klar sind, dass Bluetooth keine große Bandbreite hat, müssen Sie Ihre Übertragungsrate speziell auf das andere Gerät abstimmen. Sobald ein Chunk auf dem Gerät empfangen wird, das an Ihre App-Instanz gesendet wird, die auf diesem Gerät ausgeführt wird, sollten Sie es abspielen und parallel nach den neueren Chunks suchen, die vom sendenden Gerät kommen. Auf der Empfängerseite können Sie einfach die FIFO-Methode zur Verarbeitung verwenden die eingehenden Stücke deiner Lieddaten.

+0

GameKit ist für Spiele. Apple nicht zulassen, dass es verwendet wird, wenn Ihre App kein Spiel ist App hat Spiel wie Features, aber ist nicht wirklich ein Spiel, das sie normalerweise ablehnen wird. - Wain – Machete

+0

Irgendwie habe ich es funktioniert mit der gleichen Logik in diesem http://www.raywenderlich.com/12865/how-to-make- a-simple-playing-card-game-with-multiplayer-und-bluetooth-part-2 ... Aber jetzt bin ich wieder fest :( – Machete

+0

Der Ansatz ist richtig, ich habe den Link, den Sie erwähnt .. aber nur versuche, ein anderes verfügbares Kit als ein Gamekit zu verwenden, da Apple einen Filter macht .. –