2013-09-04 4 views
9

내 앱에있는이 재생 목록이 있습니다. 블루투스를 사용하여 다른 기기 (iphone)에서이 재생 목록의 노래를 재생하고 싶습니다. 다른 기기에서 블루투스를 사용하여 노래 재생

내가 누군가가 재생할 수있는 노래를 선택하면? 나 좀 도와주십시오 proceed.Could하는 방법을 몰라 지금

#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

위해 그렇게 한 것입니다 다른 장치 ??

+0

GameKit을 사용하지만 앱이 실제 게임이 아닌 경우 Apple에서 앱을 거부 할 가능성이 가장 높습니다. – Wain

+0

Gamekit을 사용하고 있기 때문에 약간의 세부 사항을 부탁드립니다. 감사합니다. – Machete

+0

GameKit은 게임입니다. 앱이 게임이 아닌 경우 Apple에서 사용하도록 허용하지 않습니다. 앱에 게임과 유사한 기능이 있지만 실제로 게임이 아니더라도 대개 앱을 거부합니다. – Wain

답변

1

GameKit은 기기 간 게임용입니다. 이를 위해 상호 작용하는 기기에 따라 CBPeripheralManager 또는 CBCentralManager을보고 싶을 것입니다. 하위 수준이므로 연결 설정에 더 많은 작업을해야하지만 많은 튜토리얼과 샘플 코드가 도움이됩니다.

+0

플랫폼에서 Bluetooth Low Energy를 지원하지 않는다면 어떻게해야합니까? – Machete

+0

예, BLE에서만 작동합니다. – Mark

+0

그래서 Gamekit.Framework 또는 다른 프레임 워크로 가야하지만 계속 진행하는 방법을 알지 못합니다. ( – Machete

0

좋아요. 당신이 붙어있는 지점에 도달 할 수 있습니다. 다른 라이브러리와 동일한 로직을 사용할 수 있지만 이것이 어떻게 진행되어야하는지입니다. 이전 청크가 상대방에서 수신되는 동안 곡 데이터를 청크로 보내고 다른 장치와 동기화해야합니다. 우리는 블루투스가 넓은 대역 너비를 가지고 있지 않다는 것을 분명히 알기 때문에 다른 장치로 전송 속도를 특별히 조정해야합니다. 청크가 장치에서 수신되면 해당 장치에서 실행중인 앱 인스턴스가 재생됩니다 .. 그리고 병렬 장치에서 수신되는 최신 청크를 검색합니다 .. 수신 측에서는 처리를 위해 FIFO 방법을 사용할 수 있습니다 노래 데이터의 들어오는 덩어리.

+0

GameKit은 게임입니다 .Apple은 게임이 아닌 앱을 사용하도록 허용하지 않습니다. 응용 프로그램은 게임과 같은 기능을 가지고 있지만 실제로 게임을 거부하지는 않습니다. - Wain – Machete

+0

어쨌든 나는이 게임에서 같은 논리를 사용하고 있습니다. http://www.raywenderlich.com/12865/how-to-make- - 단순한 - 카드 놀이 - 멀티 플레이어 -와 - 블루투스 - 부분 - 2 ...하지만 지금은 다시 붙어있다 : ( – Machete

+0

접근 방식이 맞다, 내가 언급 한 링크를 확인 했어 ..하지만 그냥 애플이 필터를하고 있기 때문에 게임 키트가 아닌 다른 사용 가능한 키트를 사용해보십시오 .. –

관련 문제