2013-12-17 99 views
4

我想通過藍牙在兩個iOS設備之間傳輸NSString。任何人都可以請幫助如何通過藍牙轉移NSString?我搜索了特定的答案和示例代碼,但找不到它。請指導我。通過藍牙在iOS中傳輸兩個設備之間的NSString

在此先感謝。

+1

使用MCSession:https://developer.apple.com/library/IOs/documentation/MultipeerConnectivity/Reference/MCSessionClassRef/Reference/Reference.html –

+0

http://stackoverflow.com/questions/14406063/how-to-通過bluetooth-in-iphone-app傳輸數據在二進制形式 – iPatel

+3

@ user523234 GKSession已被棄用的iOS7 –

回答

1

檢查蘋果開發者論壇爲BTLE Transfer

我希望這將幫助你從一個設備轉移字符串或任何數據到另一個使用藍牙的源代碼。

12

我會更廣泛地發表評論,您如何使用MCSession對於這種簡單的情況,因爲當我第一次與MCSession熟悉自己,我怎麼一點信息很驚訝提供瞭如何利用一個簡單的MCSession而無需添加MCBrowserViewController的額外層。

在您的.h中,添加以下代表:MCSessionDelegate,MCNearbyServiceAdvertiserDelegateMCNearbyServiceBrowserDelegate。還要聲明MCPeerID *devicePeerID,MCSession *session,MCNearbyServiceAdvertiser *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 t o允許您的設備找到一個會話,或者你甚至可以初始化這兩個相同的設備,允許同時進行廣告和瀏覽上:

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

還有其他方法,但這些是基礎知識。儘管寫得很快,所以任何人都應該隨時修改!

+0

哇,並沒有意識到這篇文章多久......抱歉佔用這麼多的屏幕:P –

+1

非常感謝@Lydsey Scott ......你徹底的漫步和見解爲我節省了一堆時間。非常感謝! – CodenameDuchess

相關問題