AirDrop概覽
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計、做網(wǎng)站與策劃設(shè)計,奉化網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:奉化等地區(qū)。奉化做網(wǎng)站價格咨詢:18982081108
AirDrop是iOS 7引入的一項新功能,iCloud同步功能允許在用戶的兩臺iOS設(shè)備之間分享照片和文檔,而AirDrop可以在不同用戶的iOS設(shè)備之間進(jìn)行照片和文檔的分享。
在iOS 7之前,iOS用戶主要依靠第三方app實現(xiàn)iOS設(shè)備間的文件和數(shù)據(jù)分享,在iOS 7中,該項新功能適用于所有iPhone 5、iPad 4、iPad mini以及第五代iPod touch設(shè)備。通過AirDrop,你可以與附近其他iOS app分享照片、視頻、通訊錄、URL、Passbook passes、App Store上的app列表、iTunes Store中的媒體列表以及地圖中的位置信息等等。
蘋果在iOS 7 SDK中集成了UIActivityViewController類,可以讓你很簡單地就能把AirDrop功能整合進(jìn)app中。UIActivityViewController類封裝了文件分享功能的細(xì)節(jié)。你所需要的就是告知這個類你希望分享的內(nèi)容,以及處理的結(jié)果。在這個教程中,我們將會演示UIActivityViewController的使用方法,以及你該如何使用AirDrop來分享圖片/文檔。
AirDrop使用藍(lán)牙來掃描周圍的設(shè)備,當(dāng)兩臺設(shè)備通過藍(lán)牙建立起了連接,考慮到更快速的數(shù)據(jù)傳輸,它就會創(chuàng)建點對點的Wi-Fi網(wǎng)絡(luò)來連接兩部iOS 設(shè)備。但并不意味著為了使用AirDrop而需要把設(shè)備連接至Wi-Fi網(wǎng)絡(luò)。
比如你想在iPhone拍照類app中將照片分享給另一位iPhone設(shè)備,假如你在兩臺設(shè)備間啟動了AirDrop,點擊屏幕左下角的分享按鈕就能實現(xiàn)不同用戶iOS 設(shè)備間的文件分享。當(dāng)屏幕處于關(guān)閉狀態(tài)時,AirDrop為不可用,所以要確保文件接收方的設(shè)備處于打開狀態(tài),然后選擇設(shè)備進(jìn)行分享。在另一臺設(shè)備上,你會看到照片預(yù)覽和確認(rèn)要求。接收者可以接受或者拒絕接收文件。如果你選擇了接收,照片會被傳輸至你的iOS設(shè)備,并保存至相冊。
AirDrop并不僅僅適用于拍照類app,你也可以在大部分內(nèi)置的應(yīng)用中看到它,比如Contacts, iTunes, App Store, Safari以及其他應(yīng)用程序中。
下面我們來看看如何把AirDrop整合進(jìn)你的app。
UIActivityViewController簡介快覽
可能有開發(fā)者會覺得在應(yīng)用中整合AirDrop比較麻煩,其實只需要數(shù)行代碼就能實現(xiàn),UIActivityViewController讓這個過程變得非常簡單,因為AirDrop是該類固定的一部分。
UIActivityViewController類是一個標(biāo)準(zhǔn)的view controller,提供了幾項標(biāo)準(zhǔn)的服務(wù),比如復(fù)制項目至剪貼板,把內(nèi)容分享至社交網(wǎng)站,以及通過Messages發(fā)送數(shù)據(jù)等等。在iOS 7 SDK中,UIActivityViewController類提供了內(nèi)置的AirDrop功能。
如果你有一些數(shù)據(jù)一批對象需要通過AirDrop進(jìn)行分享,你所需要的是通過對象數(shù)組初始化UIActivityViewController,并展示在屏幕上:
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
[self presentViewController:controller animated:YES completion:nil];
如上代碼所示,只需要兩行代碼,你就能通過AirDrop選項啟用activity view。當(dāng)檢測到周圍的設(shè)備時,activity controller會自動展示在設(shè)備上,并處理數(shù)據(jù)轉(zhuǎn)換(如果你選擇了該項)。
根據(jù)需要,你可以拒絕特定的分享類型,也就是說,你可以通過排除所有的活動僅展示通過AirDrop進(jìn)行分享。如下代碼所示:
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
UIActivityTypePostToWeibo,
UIActivityTypeMessage, UIActivityTypeMail,
UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
controller.excludedActivityTypes = excludedActivities;
[self presentViewController:controller animated:YES completion:nil];
現(xiàn)在activity view controller僅展示AirDrop選項:
你可以通過UIActivityViewController來分享不同的數(shù)據(jù)類型,包括NSString, UIImage以及NSURL。你不僅可以使用NSURL分享鏈接,也可以通過URL傳遞任何類型的文件。
在接收端,當(dāng)其他設(shè)備接收數(shù)據(jù)時,它會基于數(shù)據(jù)類型自動打來app。也就是說,如果傳送的是UIImage時,被接收的圖片會展示在拍照類app中。當(dāng)傳遞的是PDF文件時,其他設(shè)備會在Safari中打開它。如果你僅僅分享NSString object,數(shù)據(jù)將會被展示在Notes app中。
AirDrop Demo App介紹
現(xiàn)在我們創(chuàng)建一個AirDrop demo app來幫你更好地理解UIActivityViewController和AirDrop。這個示例app非常簡單,當(dāng)首次啟動,你會看到羅列了幾個文件的表格視圖,包括圖片文件、PDF文件以及文本文件,你可以點擊文件并查看內(nèi)容。在content view中,會看到一個屏幕右上角有一個操作按鈕。點擊按鈕將啟用AirDrop選項,并且你可以與周圍設(shè)備分享圖片或者文檔。
你可以從頭開始做這個app,但是為了節(jié)省時間,你可以下載這個項目模板來試驗。打開Xcode project,你會發(fā)現(xiàn)下邊這個Storyboard:
這個示例app已經(jīng)執(zhí)行了ListTableViewController和DocumentViewController。如果編譯并運行這個app,你會發(fā)現(xiàn)一個文件列表。點擊任何一個文件,圖片或者文檔內(nèi)容將會展示出來。但是分享按鈕并沒有被執(zhí)行,這也是我們將要討論的一點。
添加AirDrop功能
在工程模板中,ListTableViewController被用來在表格視圖中展示文件列表,而DocumentViewController則通過web view來展示文檔內(nèi)容。document view中的操作按鈕和DocumentViewController的share: method有關(guān)。該方法的實現(xiàn)如下所示:
- (IBAction)share:(id)sender {
NSURL *url = [self fileToURL:self.documentName];
NSArray *objectsToShare = @[url];
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
// Exclude all activities except AirDrop.
NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
UIActivityTypePostToWeibo,
UIActivityTypeMessage, UIActivityTypeMail,
UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
controller.excludedActivityTypes = excludedActivities;
// Present the controller
[self presentViewController:controller animated:YES completion:nil];
}
這個代碼非常熟悉,我們在最開始的時候已經(jīng)討論過了,它可以用來簡單地創(chuàng)建UIActivityViewController,排除所有分享功能(AirDrop除外),并作為模態(tài)視圖展示出控制器。棘手的部分是如何定義分享的對象。下邊我們將會把分享文件轉(zhuǎn)換成NSURL object,并把文件URL作為數(shù)組傳遞給AirDrop。
頭兩行代碼是關(guān)于file URL轉(zhuǎn)換的。documentName屬性存儲了當(dāng)前文件(比如ios-game-kit-sample.pdf),展示在document view中。我們通過文檔名稱和它返回的相應(yīng)的file URL,來簡單地調(diào)用fileToURL: method。fileToURL: method已經(jīng)在工程模板中,代碼如下:
- (NSURL *) fileToURL:(NSString*)filename
{
NSArray *fileComponents = [filename componentsSeparatedByString:@"."];
NSString *filePath = [[NSBundle mainBundle] pathForResource:[fileComponents objectAtIndex:0] ofType:[fileComponents objectAtIndex:1]];
return [NSURL fileURLWithPath:filePath];
}
這些代碼非常簡潔明了,比如ios-game-kit-sample.pdf將會被轉(zhuǎn)換為
%20Support/iPhone%20Simulator/7.0.3/Applications/A5321493-318A-4A3B-8B37-E56B8B4405FC/AirDropDemo.app/ios-
game-kit-sample.pdf.
file URL依據(jù)你運行的設(shè)備而變化,但是URL應(yīng)該以“file://”協(xié)議開頭。通過file URL object,我們創(chuàng)建了相應(yīng)的數(shù)組,并把它傳遞給UIActivityViewController以用來進(jìn)行AirDrop分享。
編譯并運行AirDrop demo
做完這些后,編譯并在iPhone上運行這個app。
注意:你需要一個真實的設(shè)備來測試AirDrop分享。不能在模擬器上進(jìn)行分享。
Uniform Type Identifiers (UTIs)統(tǒng)一標(biāo)示符(UTIs)
當(dāng)你把圖片分享之其他iOS設(shè)備,接收方會自動打開拍照類app并加載圖片。如果你傳遞的是PDF文件,接收方設(shè)備可能會提示你選擇一個app來打開文件,或者直接在iBooks中打開。iOS是如何知道哪個app適合什么樣的數(shù)據(jù)類型呢?
在系統(tǒng)中,蘋果用UTIs來處理數(shù)據(jù)類型的標(biāo)示。簡單的說,一個uti是用來標(biāo)示特定類型的數(shù)據(jù)或文件。例如,com.adobe.pdf標(biāo)示一個pdf文件,而public.png代表一個PNG圖片。在這里可以查看已經(jīng)在系統(tǒng)中注冊了的完整的UTIs清單。(love cc cat)應(yīng)用程序可以打開在iOS系統(tǒng)中已經(jīng)注冊了的UTI。因此無論文件是否被打開,iOS都會用特定的程序打開這個文件。
系統(tǒng)允許多個程序注冊相同的UTI。在這個教程中,iOS將通過app列表打開文件。比如,當(dāng)你分享PDF文檔時,你可以在接收端設(shè)備上看到如下屏幕:
總結(jié)
AirDrop是iOS 7引入的一個非常酷的功能,它為iOS設(shè)備間數(shù)據(jù)分享提供了一個很好的方法。首先,內(nèi)置的UIActivityViewController類使得開發(fā)者在應(yīng)用中實現(xiàn)該功能變得非常簡單。正如你所看到的demo app,它僅僅需要幾行代碼就能實現(xiàn)。所以推薦開發(fā)者在應(yīng)用中實現(xiàn)該功能。
可以搜索一個叫ShareSDK的組件,整合了幾乎目前所有的分享渠道,直接引入到你的應(yīng)用里配置下就行了,官網(wǎng)上有詳細(xì)說明的。
調(diào)用下面的方法即可實現(xiàn)系統(tǒng)分享功能
//分享
- (IBAction)RespostClick_Action:(id)sender {
UIImage* image = [UIImage imageNamed:@"icon_share.png"];
NSString *text = @"I found an Awesome application software! InstaDown";
//;ls=1mt=8
NSURL *urlToShare = [NSURL URLWithString:[NSString stringWithFormat:@";ls=1mt=8",[HHLADSManager getValueFromjsondata:@"appid"]]];
NSArray *activityItems = @[text,image,urlToShare];
UIActivityViewController *avc = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
[self presentViewController:avc animated:TRUE completion:nil];
// 選中分享類型
[avc setCompletionWithItemsHandler:^(NSString * __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
// 顯示選中的分享類型
NSLog(@"act type %@",activityType);
if (completed) {
NSLog(@"ok");
}else {
NSLog(@"no ok");
}
}];
UIPopoverPresentationController *popover = avc.popoverPresentationController;
if (popover) {
popover.sourceView = self.view;
popover.sourceRect = self.view.bounds;
popover.permittedArrowDirections = UIPopoverArrowDirectionUp;
}
}