なかじまの開発ブログ

アプリ開発における備忘録などなど。

MENU

Bluetooth通信で値を送信する【Objective-C】

今回は、GKPeerPickerControllerを使いません。

まず、GameKitフレームワークをプロジェクトに追加。


『ViewController.h』

#import <GameKit/GameKit.h>

@interface ViewController : UIViewController <GKSessionDelegate> {
  GKSession *_session;

  int num; // 送りたい値
}


『ViewController.m』

- (void)viewDidLoad {
  [super viewDidLoad];

  // GKSessionの生成
  _session = [[GKSession alloc] initWithSessionID:@"GKSessionID" displayName:nil sessionMode:GKSessionModePeer];
    [_session setDataReceiveHandler:self withContext:nil];
    _session.delegate = self;

    // 相手を探す
    _session.available = YES;

    // 値を登録
    num = 123;
}

// 接続許可
- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
    [_session acceptConnectionFromPeer:peerID error:nil];
}

// 接続状況
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
    switch (state) {
        case GKPeerStateAvailable: // 接続要求中
        {
            NSLog(@"接続要求中");
            [_session connectToPeer:peerID withTimeout:5.0f]; // peerIDに対して接続を要求
            break;
        }

        case GKPeerStateUnavailable: // 利用不可
        {
            NSLog(@"利用不可");
            break;
        }

        case GKPeerStateConnecting: // 接続要請中
        {
            NSLog(@"接続要請中");
            break;
        }

        case GKPeerStateConnected: // 接続
        {
            NSLog(@"接続");
           
            // 値を送る
            NSMutableArray *mutablearray = [NSMutableArray array];
            [mutablearray addObject:[NSNumber numberWithInt:num];
            NSError *err = nil;
            NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutablearray];
            [_session sendData:data toPeers:[NSArray arrayWithObject:peerID] withDataMode:GKSendDataReliable error:&err];
            break;
        }

        default:
            break;
    }
}


int型の変数を一度NSNumber型にすることで、NSDataを使って値を送ることができます。


受信する場合は

// 受信
- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context {
    NSMutableArray *ary = [NSKeyedUnarchivar unarchiveObjectWithData:data];
    int receivenum = [[ary objectAtIndex:0] intValue];

    NSLog(@"受信した値:%d", receivenum);
}