国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

iOS7新技術:如何使用Multipeer Connectivity

移動開發 iOS
Multipeer connectivity是一個使附近設備通過Wi-Fi網絡、P2P Wi-Fi以及藍牙個人局域網進行通信的框架。互相鏈接的節點可以安全地傳遞信息、流或是其他文件資源,而不用通過網絡服務。

[[111258]]

Multipeer connectivity是一個使附近設備通過Wi-Fi網絡、P2P Wi-Fi以及藍牙個人局域網進行通信的框架。互相鏈接的節點可以安全地傳遞信息、流或是其他文件資源,而不用通過網絡服務。

Advertising & Discovering

通信的第一步是讓大家互相知道彼此,我們通過廣播(Advertising)和發現(discovering)服務來實現。

廣播作為服務器搜索附近的節點,而節點同時也去搜索附近的廣播。在許多情況下,客戶端同時廣播并發現同一個服務,這將導致一些混亂,尤其是在client-server模式中。

所以,每一個服務都應有一個類型(標示符),它是由ASCII字母、數字和“-”組成的短文本串,最多15個字符。通常,一個服務的名字應該由應用程序的名字開始,后邊跟“-”和一個獨特的描述符號。(作者認為這和 com.apple.*標示符很像),就像下邊:

  1. static NSString * const XXServiceType = @"xx-service";

一個節點有一個唯一標示MCPeerID對象,使用展示名稱進行初始化,它可能是用戶指定的昵稱,或是單純的設備名稱。

  1. MCPeerID *localPeerID = [[MCPeerID alloc] initWithDisplayName:[[UIDevice currentDevice] name]];

節點使用NSNetService或者Bonjour C API進行手動廣播和發現,但這是一個特別深入的問題,關于手動節點管理可具體參見MCSession文檔。

Advertising

服務的廣播通過MCNearbyServiceAdvertiser來操作,初始化時帶著本地節點、服務類型以及任何可與發現該服務的節點進行通信的可選信息。

發現信息使用Bonjour TXT records encoded(according to RFC 6763)發送。

  1. MCNearbyServiceAdvertiser *advertiser = 
  2.     [[MCNearbyServiceAdvertiser alloc] initWithPeer:localPeerID 
  3.                                       discoveryInfo:nil 
  4.                                         serviceType:XXServiceType]; 
  5. advertiser.delegate = self; 
  6. [advertiser startAdvertisingPeer]; 

相關事件由advertiser的代理來處理,需遵從MCNearbyServiceAdvertiserDelegate協議。

在下例中,考慮到用戶可以選擇是否接受或拒絕傳入連接請求,并有權以拒絕或屏蔽任何來自該節點的后續請求選項。

  1. #pragma mark - MCNearbyServiceAdvertiserDelegate 
  2.  
  3. - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser 
  4. didReceiveInvitationFromPeer:(MCPeerID *)peerID 
  5.        withContext:(NSData *)context 
  6.  invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler 
  7.     if ([self.mutableBlockedPeers containsObject:peerID]) { 
  8.         invitationHandler(NO, nil); 
  9.         return
  10.     } 
  11.  
  12.     [[UIActionSheet actionSheetWithTitle:[NSString stringWithFormat:NSLocalizedString(@"Received Invitation from %@", @"Received Invitation from {Peer}"), peerID.displayName] 
  13.                        cancelButtonTitle:NSLocalizedString(@"Reject", nil) 
  14.                   destructiveButtonTitle:NSLocalizedString(@"Block", nil) 
  15.                        otherButtonTitles:@[NSLocalizedString(@"Accept", nil)] 
  16.                                    block:^(UIActionSheet *actionSheet, NSInteger buttonIndex) 
  17.     { 
  18.         BOOL acceptedInvitation = (buttonIndex == [actionSheet firstOtherButtonIndex]); 
  19.  
  20.         if (buttonIndex == [actionSheet destructiveButtonIndex]) { 
  21.             [self.mutableBlockedPeers addObject:peerID]; 
  22.         } 
  23.  
  24.         MCSession *session = [[MCSession alloc] initWithPeer:localPeerID 
  25.                                             securityIdentity:nil 
  26.                                         encryptionPreference:MCEncryptionNone]; 
  27.         session.delegate = self; 
  28.  
  29.         invitationHandler(acceptedInvitation, (acceptedInvitation ? session : nil)); 
  30.     }] showInView:self.view]; 
  31. }

為了簡單起見,本例中使用了一個帶有block的actionsheet來作為操作框,它可以直接給invitationHandler傳遞信 息,用以避免創建和管理delegate造成的過于凌亂的業務邏輯,以避免創建和管理自定義delegate object造成的過于凌亂的業務邏輯。這種方法可以用category來實現,或者改編任何一CocoaPods里有效的實現

Creating a Session

在上面的例子中,我們創建了session,并在接受邀請連接時傳遞到節點。一個MCSession對象跟本地節點標識符、securityIdentity以及encryptionPreference參數一起進行初始化。

  1. MCSession *session = [[MCSession alloc] initWithPeer:localPeerID 
  2.                                     securityIdentity:nil 
  3.                                 encryptionPreference:MCEncryptionNone]; 
  4. session.delegate = self; 

securityIdentity是一個可選參數。通過X.509證書,它允許節點安全識別并連接其他節點。當設置了該參數時,第一個對象應該 是識別客戶端的SecIdentityRef,接著是一個或更多個用以核實本地節點身份的SecCertificateRef objects。

encryptionPreference參數指定是否加密節點之間的通信。MCEncryptionPreference枚舉提供的三種值是:

MCEncryptionOptional:會話更喜歡使用加密,但會接受未加密的連接。

MCEncryptionRequired:會話需要加密。

MCEncryptionNone:會話不應該加密。

啟用加密會顯著降低傳輸速率,所以除非你的應用程序很特別,需要對用戶敏感信息的處理,否則建議使用MCEncryptionNone。

MCSessionDelegate協議將會在發送和接受信息的部分被覆蓋.

Discovering

客戶端使用MCNearbyServiceBrowser來發現廣播,它需要local peer標識符,以及非常類似MCNearbyServiceAdvertiser的服務類型來初始化:

  1. MCNearbyServiceBrowser *browser = [[MCNearbyServiceBrowser alloc] initWithPeer:localPeerID serviceType:XXServiceType]; 
  2. browser.delegate = self;

可能會有很多節點廣播一個特定的服務,所以為了方便用戶(或開發者),MCBrowserViewController將提供一個內置的、標準的方式來呈現鏈接到廣播節點:

  1. MCBrowserViewController *browserViewController = 
  2.     [[MCBrowserViewController alloc] initWithBrowser:browser 
  3.                                              session:session]; 
  4. browserViewController.delegate = self; 
  5. [self presentViewController:browserViewController 
  6.                    animated:YES 
  7.                  completion: 
  8. ^{ 
  9.     [browser startBrowsingForPeers]; 
  10. }]; 

當browser完成節點連接后,它將使用它的delegate調用browserViewControllerDidFinish:,以通知展示視圖控制器--它應該更新UI以適應新連接的客戶端。

Sending & Receiving Information

一旦節點彼此相連,它們將能互傳信息。Multipeer Connectivity框架區分三種不同形式的數據傳輸:

Messages是定義明確的信息,比如端文本或者小序列化對象。

Streams 流是可連續傳輸數據(如音頻,視頻或實時傳感器事件)的信息公開渠道。

Resources是圖片、電影以及文檔的文件。

Messages

Messages使用-sendData:toPeers:withMode:error::方法發送。

  1. NSString *message = @"Hello, World!"
  2. NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding]; 
  3. NSError *error = nil; 
  4. if (![self.session sendData:data 
  5.                     toPeers:peers 
  6.                    withMode:MCSessionSendDataReliable 
  7.                       error:&error]) { 
  8.     NSLog(@"[Error] %@", error); 
  9. }

通過MCSessionDelegate方法 -sessionDidReceiveData:fromPeer:收取信息。以下是如何解碼先前示例代碼中發送的消息:

  1. #pragma mark - MCSessionDelegate 
  2.   
  3. - (void)session:(MCSession *)session 
  4.  didReceiveData:(NSData *)data 
  5.        fromPeer:(MCPeerID *)peerID 
  6.     NSString *message = 
  7.         [[NSString alloc] initWithData:data 
  8.                               encoding:NSUTF8StringEncoding]; 
  9.     NSLog(@"%@", message); 
  10. }

另一種方法是發送NSKeyedArchiver編碼的對象:

  1. id <NSSecureCoding> object = // ...; 
  2. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object]; 
  3. NSError *error = nil; 
  4. if (![self.session sendData:data 
  5.                     toPeers:peers 
  6.                    withMode:MCSessionSendDataReliable 
  7.                       error:&error]) { 
  8.     NSLog(@"[Error] %@", error); 
  9. #pragma mark - MCSessionDelegate 
  10.   
  11. - (void)session:(MCSession *)session 
  12.  didReceiveData:(NSData *)data 
  13.        fromPeer:(MCPeerID *)peerID 
  14.     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
  15.     unarchiver.requiresSecureCoding = YES; 
  16.     id object = [unarchiver decodeObject]; 
  17.     [unarchiver finishDecoding]; 
  18.     NSLog(@"%@", object); 
  19. }

為了防范對象替換攻擊,設置requiresSecureCoding為YES是很重要的,這樣如果根對象類沒有遵從<NSSecureCoding>,就會拋出一個異常。欲了解更多信息,請參閱[NSHipster article on NSSecureCoding]。

Streams

Streams 使用 -startStreamWithName:toPeer:創建:

  1. NSOutputStream *outputStream = 
  2.     [session startStreamWithName:name 
  3.                           toPeer:peer]; 
  4.  
  5. stream.delegate = self; 
  6. [stream scheduleInRunLoop:[NSRunLoop mainRunLoop] 
  7.                 forMode:NSDefaultRunLoopMode]; 
  8. [stream open]; 
  9.  
  10. // ...

Streams通過MCSessionDelegate的方法session:didReceiveStream:withName:fromPeer:來接收:

  1. #pragma mark - MCSessionDelegate 
  2.  
  3. - (void)session:(MCSession *)session 
  4. didReceiveStream:(NSInputStream *)stream 
  5.        withName:(NSString *)streamName 
  6.        fromPeer:(MCPeerID *)peerID 
  7.     stream.delegate = self; 
  8.     [stream scheduleInRunLoop:[NSRunLoop mainRunLoop] 
  9.                       forMode:NSDefaultRunLoopMode]; 
  10.     [stream open]; 

輸入和輸出的streams必須安排好并打開,然后才能使用它們。一旦這樣做,streams就可以被讀出和寫入。

Resources

Resources 發送使用 -sendResourceAtURL:withName:toPeer:withCompletionHandler::

  1. NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/resource"]; 
  2. NSProgress *progress = 
  3.     [self.session sendResourceAtURL:fileURL 
  4.                            withName:[fileURL lastPathComponent] 
  5.                              toPeer:peer 
  6.                   withCompletionHandler:^(NSError *error) 
  7.     NSLog(@"[Error] %@", error); 
  8. }]; 

返回的NSProgress對象可以是通過KVO(Key-Value Observed)來監視文件傳輸的進度,并且它提供取消傳輸的方法:-cancel。

接收資源實現MCSessionDelegate兩種方 法:-session:didStartReceivingResourceWithName:fromPeer:withProgress: 和 -session:didFinishReceivingResourceWithName:fromPeer:atURL:withError:

  1. #pragma mark - MCSessionDelegate 
  2.  
  3. - (void)session:(MCSession *)session 
  4. didStartReceivingResourceWithName:(NSString *)resourceName 
  5.        fromPeer:(MCPeerID *)peerID 
  6.    withProgress:(NSProgress *)progress 
  7.     // ... 
  8.  
  9. - (void)session:(MCSession *)session 
  10. didFinishReceivingResourceWithName:(NSString *)resourceName 
  11.        fromPeer:(MCPeerID *)peerID 
  12.           atURL:(NSURL *)localURL 
  13.       withError:(NSError *)error 
  14.     NSURL *destinationURL = [NSURL fileURLWithPath:@"/path/to/destination"]; 
  15.     NSError *error = nil; 
  16.     if (![[NSFileManager defaultManager] moveItemAtURL:localURL 
  17.                                                  toURL:destinationURL 
  18.                                                  error:&error]) { 
  19.         NSLog(@"[Error] %@", error); 
  20.     } 

再次說明,在傳輸期間NSProgress parameter in -session:didStartReceivingResourceWithName:fromPeer:withProgress:允許接收節點來 監控文件傳輸進度。在 -session:didFinishReceivingResourceWithName:fromPeer:atURL:withError: 中,delegate的責任是從臨時localURL移動文件至永久位置。

Multipeer是突破性的API,其價值才剛剛開始被理解。雖然完整的支持功能比如AirDrop目前僅限于最新的設備,你應該會看到它將成為讓所有人盼望的功能。

本文由郭歷成[博客]翻譯自nshipster中的Multipeer Connectivity一節。

【移動開發視頻課程推薦】

責任編輯:閆佳明 來源: cocoachina
相關推薦

2013-09-18 10:46:15

2013-09-26 14:42:28

2013-08-20 15:51:06

iOS7iOS7 Beta6蘋果

2013-09-25 09:50:27

iOS7蘋果

2013-06-12 15:19:05

iOS7WWDC

2013-09-26 16:02:13

2013-07-24 17:45:15

iOS7圖標UI

2013-06-13 08:58:02

iOS7WWDCDesign By C

2013-09-16 10:14:35

iOS7App Store

2013-06-19 09:28:29

2013-12-17 10:02:30

越獄iOS7

2013-06-25 10:13:11

iOS7WWDC蘋果

2013-10-29 14:31:33

移動技術半月刊

2013-07-01 13:41:09

iOS7WWDC姿勢控制

2022-02-07 09:07:38

黑客供應鏈攻擊SolarWinds

2015-09-17 10:23:04

新技術學習

2015-09-17 08:55:47

react學習技術

2013-06-21 13:04:59

iOS7WWDCUI設計

2013-12-20 11:26:01

2024-01-12 16:12:44

Java虛擬線程開發
點贊
收藏

51CTO技術棧公眾號

国产传媒在线播放| 国产美女在线观看| 99国产精品白浆在线观看免费| 精品国产一区二区三区小蝌蚪 | 亚洲丝袜av一区| 国产精品高潮视频| 免费av高清| 九九热hot精品视频在线播放| 国产精品免费网站在线观看| 亚州国产精品久久久| 久久小说免费下载| 99精品国产99久久久久久白柏| 中文字幕亚洲国产| 又色又爽又高潮免费视频国产| 成人黄色91| 最新国产精品久久精品| 亚洲精品欧美日韩| 黑人精品视频| 99精品黄色片免费大全| 成人免费在线视频播放| 国产成人在线免费观看| 欧美精品video| av在线www| 欧美日本一区二区高清播放视频| 欧美大片在线观看| 37pao成人国产永久免费视频| 欧美天天综合| 91精品一区二区三区在线观看| 女同性恋一区二区| 第一区第二区在线| 色久综合一二码| 黄频视频在线观看| 国产成人福利av| 欧美理论片在线观看| 在线免费国产视频| 青青草91视频| 国内免费精品永久在线视频| 韩国精品视频| 国产成人精品午夜视频免费| 欧美中文在线字幕| 久草在线新免费首页资源站| 久久精品在线免费观看| 97在线电影| 亚洲va欧美va人人爽成人影院| 亚洲综合免费观看高清完整版| 国产精品嫩草在线观看| 成人精品三级| 黑人巨大精品欧美一区免费视频 | 午夜精品在线看| 亚洲一区在线免费| 色婷婷久久久| 欧美mv日韩mv国产网站| 成人在色线视频在线观看免费大全| 一区免费在线| 国产+人+亚洲| 91视频精品| 日韩中文字幕免费视频| 在线看的av| 91麻豆精品91久久久久同性| 人人鲁人人莫人人爱精品| 欧美日韩免费在线观看| 国产视频一区二区| 日韩中文字幕在线视频| 第一会所亚洲原创| 日本一区二区在线视频观看| 95在线视频| 国产欧美日韩卡一| 欧美日韩精品一区| 无码国模国产在线观看| 成人欧美一区二区三区在线湿哒哒| 日韩一级二级| 欧美综合在线第二页| 久久久精品麻豆| 日韩成人精品一区| 亚洲综合久久av| 欧美成人性生活视频| 97人人在线视频| 国内自拍中文字幕| 日本精品黄色| 日韩欧美一区二区视频在线播放| 99国内精品久久| 国产乱子伦三级在线播放| 亚洲日本一区二区三区| 91黄色在线看| 久久精品999| 欧美日韩免费观看一区| 国产色产综合产在线视频| 宅男噜噜99国产精品观看免费| 中文精品在线| 国产日韩一区在线| 蜜桃精品噜噜噜成人av| 久久视频在线播放| 毛片无码国产| 亚洲精品国产精品国自产在线| 日本高清在线观看wwwww色| 美女少妇精品视频| 亚洲精品一区三区三区在线观看| 成人夜晚看av| 久久亚洲综合av| 亚洲美免无码中文字幕在线 | 久久精品2019中文字幕| 天堂8中文在线最新版在线| 精品国产乱子伦一区| 成人免费高清在线播放| 欧美日韩免费区域视频在线观看| 国产精品伊人| 一区二区亚洲欧洲国产日韩| 亚洲黄色免费av| 成人av免费看| 国产日韩欧美高清免费| 亚洲 欧美 另类人妖| 中文字幕精品一区| 中文字幕亚洲乱码| 玉足女爽爽91| 亚洲高清成人影院| 午夜激情综合网| 伊人亚洲精品| 久久99精品国产99久久6尤物| 日韩av网站在线观看| 欧洲亚洲在线| 欧美日韩一区不卡| 黑人极品ⅴideos精品欧美棵| 成人黄色免费网站在线观看| 1000精品久久久久久久久| 欧美影院在线| 老头吃奶性行交视频| 久久精品成人动漫| av在线这里只有精品| 日韩av卡一卡二| 精品国产区一区二区三区在线观看| 日韩电影在线一区二区三区| 亚洲国产精品日韩| 国产一区二区在线视频| 少妇高清精品毛片在线视频| 国产视频一区二区在线观看| 亚洲欧洲日韩精品在线| 日本福利视频网站| 国产亚洲精品久| 久久久久久一区二区三区四区别墅| 亚洲天堂电影网| 日韩精品久久久久| 成午夜精品一区二区三区软件| 免费成人午夜视频| 伊人一区二区三区| 天堂成人娱乐在线视频免费播放网站| 992tv在线观看在线播放| 日韩欧美主播在线| 92久久精品| 天天爱天天做天天操| 亚洲午夜女主播在线直播| 精品一区欧美| 夜夜嗨aⅴ免费视频| 91精品婷婷国产综合久久性色| 国产欧美大片| 男女在线观看视频| 精品视频在线观看一区二区| 久久久成人精品视频| 一色屋精品亚洲香蕉网站| 日韩国产专区| 91美女视频在线| 亚洲精品第一区二区三区| 一区二区三区日韩在线| 国产精品乱子久久久久| 色婷婷综合网| bestiality新另类大全| 久久久99精品视频| 久久免费高清视频| 精品毛片三在线观看| 奶水喷射视频一区| 亚洲欧美日韩一级| 国产精品一区=区| 国产成人精品亚洲777人妖| 日韩电影精品| 国产激情美女久久久久久吹潮| 成人aaaa免费全部观看| 日韩在线无毛| 日本精品一区二区三区视频| 亚洲人在线视频| 国产精品久久久久影院亚瑟 | 日本私人影院在线观看| 日韩激情片免费| 99久久国产综合色|国产精品| 亚洲va久久久噜噜噜久久| 干日本少妇视频| 九色精品免费永久在线| 色999日韩国产欧美一区二区| 国产一区二区精品久久99| 亚洲欧美tv| mm视频在线视频| 147欧美人体大胆444| 日韩二区三区在线| 亚洲欧美激情小说另类| 国产精品99| 杨幂一区欧美专区| 欧美激情精品久久久久久黑人 | 久久av色综合| 加勒比日本影视| 欧美久久久精品| 欧美日韩精品高清| 97精品中文字幕|