NSString
。请问有谁可以帮我了解如何通过蓝牙传输NSString
?我搜索了特定的答案和样例代码,但是没有找到。请指导一下我。先感谢您!
NSString
。请问有谁可以帮我了解如何通过蓝牙传输NSString
?我搜索了特定的答案和样例代码,但是没有找到。请指导一下我。我将更详细地介绍如何在不添加额外层的MCBrowserViewController
的情况下,使用MCSession
来完成简单的任务。当我第一次熟悉MCSession
时,我惊讶于几乎没有关于如何使用简单的MCSession
的信息。
在你的.h文件中,添加以下代理:MCSessionDelegate
、MCNearbyServiceAdvertiserDelegate
和MCNearbyServiceBrowserDelegate
。另外声明类实例变量MCPeerID *devicePeerID
、MCSession *session
、MCNearbyServiceAdvertiser *serviceAdvertiser
和MCNearbyServiceBrowser *nearbyServiceBrowser
。
在你的.m文件中,在viewDidLoad
或其他任何想要启动MCSession
之前的时间内,初始化你的MCPeerID
:
devicePeerId = [[MCPeerID alloc] initWithDisplayName:DISPLAY_NAME];
然后使用那个MCPeerID
初始化MCSession
:
session = [[MCSession alloc] initWithPeer:devicePeerId securityIdentity:nil encryptionPreference:MCEncryptionNone];
session.delegate = self;
为了避免使用MCBrowserViewController
,你需要初始化自己的MCNearbyServiceAdvertiser
来允许你的设备广告一个会话,并且初始化MCNearbyServiceBrowser
来允许你的设备查找一个会话。你甚至可以在同一设备上同时初始化两者,以允许同时进行广告和浏览:
serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:myDevicePeerId discoveryInfo:nil serviceType:SERVICE_TYPE];
serviceAdvertiser.delegate = self;
// (I've set discoveryInfo to nil here, but it can also contain an NSDictionary of data to pass along to browsers who find this advertiser via the browser:foundPeer:withDiscoveryInfo method)
nearbyServiceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:myDevicePeerId serviceType:SERVICE_TYPE];
nearbyServiceBrowser.delegate = self;
接下来,如果您将设备设置为广告商,则需要实现MCNearbyServiceAdvertiserDelegate
方法。
接收浏览对等设备的邀请:
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
NSLog(@"invitation received");
if (want_to_accept_invitation)
invitationHandler(YES, session);
else
invitationHandler(NO, session);
}
如果由于某种原因设备尚未开始广告,您可以收到一个错误:
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error {
NSLog(@"Did not start advertising error: %@", error);
}
MCNearbyServiceBrowserDelegate
方法:// Peer found
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {
NSLog(@"Session Manager found peer: %@", peerID);
if (want_to_connect)
[serviceBrowser invitePeer:peerID toSession:session withContext:nil timeout:CONNECTION_TIMEOUT];
}
// Peer lost, ex. out of range
- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID {
NSLog(@"Session Manager lost peer: %@", peerID);
}
- (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error {
NSLog(@"Did not start browsing for peers: %@", error);
}
那么您需要使用MCSessionDelegate
方法来帮助通知用户连接状态的更改,以及方便地发送和接收数据:
- (void)session:(MCSession *)session didReceiveCertificate:(NSArray *)certificate fromPeer:(MCPeerID *)peerID certificateHandler:(void (^)(BOOL accept))certificateHandler {
NSLog(@"Did receive certificate");
certificateHandler(true);
}
// To detect changes in the state of your connections with your peers….
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {
switch (state) {
case MCSessionStateConnected: {
NSLog(@"Connected to %@", peerID);
// If you'd like to send your text string as soon as you're connected...
NSError *error;
[session sendData:[@"text" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[NSArray arrayWithObject:peerID] withMode:MCSessionSendDataReliable error:&error];
break;
} case MCSessionStateConnecting: {
NSLog(@"Connecting to %@", peerID);
break;
} case MCSessionStateNotConnected: {
break;
}
}
}
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
NSLog(@"Did receive data.");
/// Receive the string here.
NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
注意,为了发送数据,我使用了:
[session sendData:[@"text" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[NSArray arrayWithObject:peerID] withMode:MCSessionSendDataReliable error:&error];
当用户连接到其同行时,尽快传输数据。但是此行可以用于将数据发送到代码中的其他位置,例如:
- (void)sendMessageToAllPeers:(NSString *)message {
[session sendData:[message dataUsingEncoding:NSUTF8StringEncoding] toPeers:session.connectedPeers withMode:MCSessionSendDataReliable error:&error];
}
- (void)sendMessage:(NSString *)message toPeerIDs:(NSArray *)peerIDs {
[session sendData:[message dataUsingEncoding:NSUTF8StringEncoding] toPeers:peerIDs withMode:MCSessionSendDataReliable error:&error];
}
最后,要开始/停止广告您的广告商和/或浏览器,您可以调用[_serviceAdvertiser start/stopAdvertisingPeer]
,[_nearbyServiceBrowser start/stopBrowsingForPeers]
:
- (void)start {
[serviceAdvertiser startAdvertisingPeer];
[nearbyServiceBrowser startBrowsingForPeers];
}
- (void)stop {
[serviceAdvertiser stopAdvertisingPeer];
[nearbyServiceBrowser stopBrowsingForPeers];
}
还有其他方法,但这是基础知识。我写得比较快,所以任何人都可以随意修改!