Transfer NSString between two devices via bluetooth in iOS

旧巷老猫 提交于 2020-01-22 06:53:46

问题


I want to transfer NSString between two iOS device, via bluetooth. Can anybody please help how to do transfer NSString via bluetooth? I searched for specific answer and for sample code, but couldn't find it. Please guide me.

Thanks in Advance.!!


回答1:


I'm going to comment more extensively on how you can use MCSession for this sort of simple case since when I was first familiarizing myself with MCSession, I was amazed at how little information was available on how to utilize a simple MCSession without adding the extra layer of an MCBrowserViewController.

In your .h, add the following delegates: MCSessionDelegate, MCNearbyServiceAdvertiserDelegate, and MCNearbyServiceBrowserDelegate. Also declare class instance variables for MCPeerID *devicePeerID, MCSession *session, MCNearbyServiceAdvertiser *serviceAdvertiser, and MCNearbyServiceBrowser *nearbyServiceBrowser.

In your .m, during viewDidLoad or any other time before you wish to start your MCSession, initialize your MCPeerID:

devicePeerId = [[MCPeerID alloc] initWithDisplayName:DISPLAY_NAME];

Then use that MCPeerID to initialize the MCSession:

session = [[MCSession alloc] initWithPeer:devicePeerId securityIdentity:nil encryptionPreference:MCEncryptionNone];
session.delegate = self;

Now, in order to avoid using the MCBrowserViewController, you have to init your own MCNearbyServiceAdvertiser to allow your device to advertise a session, MCNearbyServiceBrowser to allow your device to find a session, or you can even init BOTH on the same device to allow for simultaneous advertising and browsing:

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;

Next, if you've set the device as an advertiser, you need to implement the MCNearbyServiceAdvertiserDelegate methods.

To field invitations from browsing peers:

- (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);

}

To receive an error if the device has yet to start advertising for some reason:

- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error {
    NSLog(@"Did not start advertising error: %@", error);
}

Likewise, if you've set the device as a browser, you need to implement the MCNearbyServiceBrowserDelegate Methods:

// 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);
}

Then you need the MCSessionDelegate Methods to help notify the user of changing connection states and facilitate the sending and receiving of data:

- (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];

}

Note that to send the data, I've used:

[session sendData:[@"text" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[NSArray arrayWithObject:peerID] withMode:MCSessionSendDataReliable error:&error];

to transmit the data as soon as the user's connected with his peers. But this line can be used to send data elsewhere in the code, ex:

- (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];
}

Finally, to start/stop advertising your advertiser and/or browser, you can call [_serviceAdvertiser start/stopAdvertisingPeer], [_nearbyServiceBrowser start/stopBrowsingForPeers]:

- (void)start {
    [serviceAdvertiser startAdvertisingPeer];
    [nearbyServiceBrowser startBrowsingForPeers];
}

- (void)stop {
    [serviceAdvertiser stopAdvertisingPeer];
    [nearbyServiceBrowser stopBrowsingForPeers];
}

There are other methods, but these are the basics. Wrote this out fairly quickly though, so anyone should feel free to amend!




回答2:


Check the source code of Apple developer forum for BTLE Transfer

I hope this will helps you to transfer string or any data from one device to another using bluetooth.



来源:https://stackoverflow.com/questions/20625588/transfer-nsstring-between-two-devices-via-bluetooth-in-ios

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!