今日は「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