2013-09-04 57 views
9

tôi có danh sách phát bài hát này trong ứng dụng của mình. Tôi muốn phát một bài hát từ danh sách phát này trên thiết bị anther (iphone) bằng bluetooth.phát một bài hát trên một thiết bị khác bằng bluetooth

Đây là những gì tôi đã làm như vậy cho

#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

Bây giờ tôi không có ý tưởng làm thế nào để proceed.Could ai đó hãy giúp tôi ra ?? Bằng cách chọn một bài hát nó có thể được chơi trên thiết bị khác ??

+0

Apple sẽ rất có thể từ chối ứng dụng của bạn nếu bạn sử dụng GameKit nhưng ứng dụng của bạn không phải là trò chơi thực sự. – Wain

+0

Một số chi tiết xin vui lòng? Vì tôi đang sử dụng Gamekit.Thanks – Machete

+0

GameKit dành cho trò chơi. Apple không cho phép nó được sử dụng nếu ứng dụng của bạn không phải là trò chơi. Ngay cả khi ứng dụng có trò chơi như các tính năng nhưng thực sự không phải là trò chơi, chúng thường sẽ từ chối trò chơi đó. – Wain

Trả lời

1

GameKit dành cho trò chơi liên thiết bị. Đối với điều này, bạn có thể muốn xem CBPeripheralManager hoặc CBCentralManager tùy thuộc vào thiết bị bạn đang tương tác. Đó là cấp thấp hơn, vì vậy bạn sẽ phải làm nhiều việc hơn để thiết lập kết nối, nhưng có rất nhiều hướng dẫn và mã mẫu để giúp bạn.

+0

Điều gì sẽ xảy ra nếu một nền tảng không hỗ trợ Bluetooth Low Energy? Tôi không thể sử dụng nó sau đó phải không ?? – Machete

+0

Có, tính năng này chỉ hoạt động với BLE. – Mark

+0

Vì vậy, tôi phải đi với Gamekit.Framework hoặc một số khung khác nhưng tôi không có ý tưởng làm thế nào để tiến hành: ( – Machete

0

Ok cho phép đến điểm mà bạn đang mắc kẹt .. Bạn có thể sử dụng cùng một logic với một số thư viện khác nhưng đây là cách nó nên đi. Bạn sẽ phải gửi dữ liệu bài hát theo khối và đồng bộ hóa với thiết bị kia trong khi đoạn trước đó được nhận ở đầu kia. Vì chúng tôi rõ ràng rằng bluetooth không có độ rộng băng tần tuyệt vời nên bạn sẽ phải điều chỉnh tốc độ truyền của mình cho thiết bị khác. một khi một đoạn được nhận trên thiết bị được gửi đến thể hiện ứng dụng của bạn đang chạy trên thiết bị đó sẽ phát nó .. và trong đầu dò song song cho các khối mới hơn đến từ thiết bị gửi .. Trên đầu nhận, bạn có thể sử dụng phương thức FIFO để xử lý các phần dữ liệu bài hát của bạn.

+0

GameKit là dành cho trò chơi. Apple không cho phép nó được sử dụng nếu ứng dụng của bạn không phải là một trò chơi. ứng dụng có trò chơi như các tính năng nhưng thực sự không phải là trò chơi mà họ thường từ chối - Wain – Machete

+0

Bằng cách nào đó tôi đã làm việc đó bằng cách sử dụng cùng một logic trong http://www.raywenderlich.com/12865/how-to-make- a-simple-playing-card-game-với-nhiều-và-bluetooth-part-2 ... Nhưng bây giờ tôi đang bị mắc kẹt một lần nữa: ( – Machete

+0

Cách tiếp cận là chính xác, tôi đã kiểm tra liên kết mà bạn đã đề cập .. nhưng chỉ cố gắng sử dụng một số bộ công cụ có sẵn khác ngoài bộ trò chơi kể từ khi Apple đang thực hiện bộ lọc .. –