iPhone Hello Multipeer

今日は「Multipeer Connectivity Framework」を試してみたiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

#import <MultipeerConnectivity/MultipeerConnectivity.h>

@interface ViewController () <MCSessionDelegate, MCBrowserViewControllerDelegate>

@property (nonatomic, strong) MCPeerID *peerID;

@property (nonatomic, strong) MCSession *session;

@property (nonatomic, strong) MCBrowserViewController *browser;

@property (nonatomic, strong) MCAdvertiserAssistant *advertiser;

@property (nonatomic, weak) UIView *remoteControlView;

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

    // title

    UILabel *title = [[UILabel alloc] init];

    title.text = @”remote control”;

    title.font = [UIFont boldSystemFontOfSize:60];

    [title sizeToFit];

    title.center = CGPointMake(160, 260);

    title.textColor = [UIColor colorWithWhite:0.8 alpha:1.0];

    title.transform = CGAffineTransformMakeRotation(M_PI * 0.3);

    [self.view addSubview:title];

    

    

    // view : remote control

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

    view.center = CGPointMake(CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame));

    view.backgroundColor = [UIColor redColor];

    [self.view addSubview:view];

    self.remoteControlView = view;

    

    

    // peer

    NSString *name = [NSString stringWithFormat:@”name%d”, arc4random() % 10];

    self.peerID = [[MCPeerID alloc] initWithDisplayName:name];

    

    //session

    self.session = [[MCSession alloc] initWithPeer:self.peerID];

    self.session.delegate = self;

    

    // browser

    self.browser = [[MCBrowserViewController alloc] initWithServiceType:@”mytest-connect” session:self.session];

    self.browser.delegate = self;

    

    // advertiser

    self.advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:@”mytest-connect” discoveryInfo:nil session:self.session];

    [self.advertiser start];

    

    

    // button

    UIButton *showBrowser = [UIButton buttonWithType:UIButtonTypeSystem];

    [showBrowser setTitle:@”search” forState:UIControlStateNormal];

    showBrowser.titleLabel.font = [UIFont systemFontOfSize:40];

    [showBrowser sizeToFit];

    showBrowser.center = CGPointMake(160, CGRectGetMaxY(self.view.frame) – 50);

    [self.view addSubview:showBrowser];

    

    [showBrowser addTarget:self action:@selector(showBrowser) forControlEvents:UIControlEventTouchUpInside];

}

– (void)showBrowser

{

    

    [self presentViewController:self.browser animated:YES completion:nil];

}

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    CGPoint p = [[touches anyObject] locationInView:self.view];

    [self sendPosition:p];

    self.remoteControlView.center = p;

}

– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    CGPoint p = [[touches anyObject] locationInView:self.view];

    [self sendPosition:p];

    self.remoteControlView.center = p;

}

// to remote device

– (void)sendPosition:(CGPoint)p

{

    NSMutableData *data = [NSMutableData dataWithCapacity:0];

    float z[2] = {p.x, p.y};

    [data appendBytes:(const void *)z length:sizeof(float) * 2.0];

    

    NSError *err;

    [self.session sendData:data toPeers:self.session.connectedPeers withMode:MCSessionSendDataUnreliable error:&err];

    

    if (err) {

        NSLog(@”%@”, [err localizedDescription]);

    }

}

#pragma mark – browser

– (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController

{

    [self.browser dismissViewControllerAnimated:YES completion:nil];

}

-(void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController

{

    [self.browser dismissViewControllerAnimated:YES completion:nil];

}

#pragma mark – session

-(void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{

    // from remote device

    

    float *points = (float *)[data bytes];

    

    dispatch_async(dispatch_get_main_queue(), ^{

        self.remoteControlView.center = CGPointMake(points[0], points[1]);

    });

}

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{}

-(void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress{}

-(void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error{}

-(void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID{}

@end