iOS多点连接的使用(WIFI 蓝牙)
来源:互联网 发布:淘宝王子 解封 编辑:程序博客网 时间:2024/06/08 05:52
多点连接 API 的使用
SDK及版本信息
MultipeerConnectivity.frameworkiOS 7.0OS X 10.10
可以看到基于MC可以做到电脑与手机的通信。 了解了其能力与SDK相关信息后,下面我们看看工作流程: 使设备可被发现--->浏览设备,建立连接--->传输数据 。 关于使用大家可以看看参考资源与 MCDemo, 这里只是做一个代码导读。
1、初始化 MCPeerID 及 MCSession, MCPeerID 用来唯一的标识设备, MCSession 是通信的基础:
1
2
3
4
5
6
-(
void
)setupPeerAndSessionWithDisplayName:(NSString *)displayName{
_peerID = [[MCPeerID alloc] initWithDisplayName:displayName];
_session = [[MCSession alloc] initWithPeer:_peerID];
_session.delegate = self;
}
2、广播设备,使设备可以被发现:
1
2
3
4
5
6
7
8
9
10
11
12
-(
void
)advertiseSelf:(BOOL)shouldAdvertise{
if
(shouldAdvertise) {
_advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:
@chat
-files
discoveryInfo:nil
session:_session];
[_advertiser start];
}
else
{
[_advertiser stop];
_advertiser = nil;
}
}
3、浏览“局域网”中的设备,并建立连接:
1
2
3
-(
void
)setupMCBrowser{
_browser = [[MCBrowserViewController alloc] initWithServiceType:
@chat
-files session:_session];
}
MCBrowserViewController实例化后,直接弹出,这个类内部会负责查找设备并建立连接。 对于有界面定制化需求的,也可以通过相关接口实现类似的功能。
4、发送消息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-(
void
)sendMyMessage{
NSData *dataToSend = [_txtMessage.text dataUsingEncoding:NSUTF8StringEncoding];
NSArray *allPeers = _appDelegate.mcManager.session.connectedPeers;
NSError *error;
[_appDelegate.mcManager.session sendData:dataToSend
toPeers:allPeers
withMode:MCSessionSendDataReliable
error:&error];
if
(error) {
NSLog(@%@, [error localizedDescription]);
}
[_tvChat setText:[_tvChat.text stringByAppendingString:[NSString stringWithFormat:
@I
wrote:
%@
, _txtMessage.text]]];
[_txtMessage setText:@];
[_txtMessage resignFirstResponder];
}
发送消息时有个选项:MCSessionSendDataReliable,MCSessionSendDataUnreliable 但是不管是可靠还是不可靠,数据都是基于 UDP 进行传输的。
5、接收消息:
1
2
3
4
5
6
7
8
9
-(
void
)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{
NSDictionary *dict = @{
@data
: data,
@peerID
: peerID
};
[[NSNotificationCenter defaultCenter] postNotificationName:
@MCDidReceiveDataNotification
object:nil
userInfo:dict];
}
消息的接收是通过 MCSession 的回调方法进行的。 MCSession的回调方法非常重要, 设备状态的改变、消息的接收、资源的接收、流的接收都是通过这个回调进行通知的。
6、发送资源,资源可以是本地的URL,也可以是 Http 链接:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-(
void
)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if
(buttonIndex != [[_appDelegate.mcManager.session connectedPeers] count]) {
NSString *filePath = [_documentsDirectory stringByAppendingPathComponent:_selectedFile];
NSString *modifiedName = [NSString stringWithFormat:@%
@_
%@, _appDelegate.mcManager.peerID.displayName, _selectedFile];
NSURL *resourceURL = [NSURL fileURLWithPath:filePath];
dispatch_async(dispatch_get_main_queue(), ^{
NSProgress *progress = [_appDelegate.mcManager.session sendResourceAtURL:resourceURL
withName:modifiedName
toPeer:[[_appDelegate.mcManager.session connectedPeers] objectAtIndex:buttonIndex]
withCompletionHandler:^(NSError *error) {
if
(error) {
NSLog(
@Error
: %@, [error localizedDescription]);
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:
@MCDemo
message:
@File
was successfully sent.
delegate:self
cancelButtonTitle:nil
otherButtonTitles:
@Great
!, nil];
[alert performSelectorOnMainThread:
@selector
(show) withObject:nil waitUntilDone:NO];
[_arrFiles replaceObjectAtIndex:_selectedRow withObject:_selectedFile];
[_tblFiles performSelectorOnMainThread:
@selector
(reloadData)
withObject:nil
waitUntilDone:NO];
}
}];
//NSLog(@*** %f, progress.fractionCompleted);
[progress addObserver:self
forKeyPath:
@fractionCompleted
options:NSKeyValueObservingOptionNew
context:nil];
});
}
}
可以通过 NSProgress查询相关状态。
7、接收资源:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(
void
)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress{
NSDictionary *dict = @{
@resourceName
: resourceName,
@peerID
: peerID,
@progress
: progress
};
[[NSNotificationCenter defaultCenter] postNotificationName:
@MCDidStartReceivingResourceNotification
object:nil
userInfo:dict];
dispatch_async(dispatch_get_main_queue(), ^{
[progress addObserver:self
forKeyPath:
@fractionCompleted
options:NSKeyValueObservingOptionNew
context:nil];
});
}
0 0
- iOS多点连接的使用(WIFI 蓝牙)
- iOS多点连接的使用、协议逆向、安全性
- iOS多点连接的使用、协议逆向、安全性
- android wifi(WAP/PSK加密)蓝牙设备的连接
- iOS开发MultipeerConnectivity(多点连接)
- iOS近场通信(wifi、蓝牙)
- iOS 蓝牙连接的流程
- iOS关于蓝牙连接的简单介绍与使用
- iOS 蓝牙的使用
- IOS Objective-c 蓝牙开发教程一蓝牙的连接
- ios蓝牙的基本使用
- iOS 蓝牙的简单使用
- iOS蓝牙的简单使用
- 蓝牙连接参数关于IOS的限制
- 蓝牙连接参数关于IOS的限制
- 蓝牙,WiFi(一)
- 蓝牙,WiFi(二)
- 蓝牙,WiFi(三)
- <iOS>关于viewWithTag的一点说明
- oracle的rowid相关
- Lasso
- [老码团队]ttcn3特性介绍
- http://dingbuoyi.iteye.com/blog/1553464
- iOS多点连接的使用(WIFI 蓝牙)
- Motivated Word(5)
- 在 WCF 中使用高效的 BinaryFormatter 序列化
- opencv-3.0.0-alpha+VS2013/2012
- 手把手教你开发模拟按键(开山篇)
- 办公工具档案
- repeater行双击事件 .net
- UITextView placeholder 设置
- Makefile 文件的编写