在iOS中通过蓝牙在两台设备之间传输NSString字符串

5
我希望能够通过蓝牙在两个iOS设备之间传输NSString。请问有谁可以帮我了解如何通过蓝牙传输NSString?我搜索了特定的答案和样例代码,但是没有找到。请指导一下我。
先感谢您!

1
使用MCSession:https://developer.apple.com/library/IOs/documentation/MultipeerConnectivity/Reference/MCSessionClassRef/Reference/Reference.html - Lyndsey Scott
http://stackoverflow.com/questions/14406063/how-to-transfer-a-data-in-binary-form-via-bluetooth-in-iphone-app - iPatel
3
GKSession已经在iOS7中被弃用。 - Lyndsey Scott
2个回答

13

我将更详细地介绍如何在不添加额外层的MCBrowserViewController的情况下,使用MCSession来完成简单的任务。当我第一次熟悉MCSession时,我惊讶于几乎没有关于如何使用简单的MCSession的信息。

在你的.h文件中,添加以下代理:MCSessionDelegateMCNearbyServiceAdvertiserDelegateMCNearbyServiceBrowserDelegate。另外声明类实例变量MCPeerID *devicePeerIDMCSession *sessionMCNearbyServiceAdvertiser *serviceAdvertiserMCNearbyServiceBrowser *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];
}

还有其他方法,但这是基础知识。我写得比较快,所以任何人都可以随意修改!


哇,没想到这篇文章这么长...抱歉占用了这么多屏幕 :P - Lyndsey Scott
1
非常感谢 @Lydsey Scott ... 您详尽的讲解和见解为我节省了大量时间。非常感激! - CodenameDuchess

1

查看苹果开发者论坛BTLE Transfer的源代码。

我希望这能帮助您使用蓝牙从一个设备传输字符串或任何数据到另一个设备。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接