IOS App開啓iTunes文件共享

關於IOS文件目錄的一點記錄

      IOS的文件系統面向的是設備上的每一個運行的應用程序。爲了保證IOS系統的可用性和簡單性,IOS設備的終端用戶是沒法直接訪問文件系統的,同時設備上的app與用戶同樣也是不能隨便直接訪問文件系統的。IOS的app與文件系統之間的交互被限定在了一個指定的空間或者說是一個目錄裏,該目錄存在於每一個App自身沙箱(sandbox)內部。每當在IOS設備上安裝一個新的app,IOS的設備上的程序安裝器會自動爲這個新app提供一個主目錄(Home Directory),並將app安裝在爲其建立的主目錄下,此外安裝器還會建立爲app建立其它幾個關鍵性的目錄。全部這些建立的目錄組合起來就組成了app的文件系統主視圖。所以app對文件系統的操做也僅限定在了以上目錄的組合,app能夠直接讀取這些目錄及目錄下的任何文件,同時app也能夠在指定的任何目錄建立本身的文件或寫入本身的數據。翻過來講,在這個指定範圍以外app不能再訪問或建立任何目錄和文件。比較特殊的狀況是,IOS系統會提供系統接口來容許app訪問,例如訪問用戶存儲在設備上的聯繫方式,相冊。但訪問這些內容背後所對應的文件操做都是由底層的系統框架來完成。這也是app被稱爲是一個「沙箱」的緣由,在本身的沙箱內,app擁有全面的操做控制權;沙箱以外的東西,在有悖訪問規則的前提下,app不能作任何事情。

開啓iTunes文件共享
       以前對Linux/Unix系統不熟悉(如今其實也不熟悉),對蘋果的設備環境,開發體系,硬件特色基本上也處於無知狀態,記得起初拿到iPad的時候,一直覺得做爲移動設備,既然iPad可以與PC端鏈接,那麼就能夠把它同時當作是一個移動硬盤來用,能夠在PC可iPad之間進行文件的傳輸,存儲,共享。我能夠想任意App中放置文件,也能夠在PC端像瀏覽Mac上的文件系統同樣,去查看App目錄下的內容。後來我發現我錯了,根本不是想象中的那樣。當iPad鏈接PC以後,並無一個設備目錄瀏覽管理界面。其實這也比較蘋果系統封閉的風格,蘋果但願將用戶在蘋果設備上的文件都能上傳到雲端,從而實現能夠在多臺蘋果設備上同步用戶數據。

       經過在app工程的Info.plist文件中指定UIFileSharingEnabled關鍵字,並將其值設置爲YES。咱們能夠很方便的打開app與iTunes之間的文件共享。但這種共享有一個前提:App必須將任何所須要共享給用戶的文件,都要存放在<Application_Home>/Documents目錄下,<Application_Home>即在app安裝時自動建立的app的主目錄。下面咱們簡單說明

在MAC上打開iTunes,在應用程序一欄,默認界面爲:


當連接iPad設備後,iTunes界面以下,在面板工具條的右側會顯示iPad當前已鏈接到Mac上

app

      點擊工具條的"iPad"按鈕,顯示具體的iPad設備信息,以下:



     被黃色塊蓋住的是iPad的設備名稱,點擊「應用程序按鈕」,以後在界面上咱們能夠看到當前iPad設備的一些相關分類信息,包括存儲空間大小,iPad上所安裝的IOS版本,是否存在可升級的更高版本的IOS;以及一些iPad設備的備份方式。繼續下滾屏,以下界面:



      咱們看到出現了一個名爲「文件共享」的分類。上面很清楚的標明瞭這個分類的做用是什麼,左側的列表是iPad設備上安裝的全部應用程序,右側列表則是支持iTunes文件共享的App的Documents目錄。以蘋果的Keynote爲例,當咱們保存一個文檔到iTunes時,Keynotye會講文件寫入到本身的Documents目錄下,也就是咱們在面板上看到的右側列表。咱們能夠直接從MAC上拖文件到該右側列表,或者從右側列表選中文件直接拖到MAC上,這樣便簡單的完成了所謂的iTunes與App的文件共享。能夠經過兩個按鈕完成一樣的功能。如圖:



      咱們新建一個簡單的DEMO工程來把整個流程走一遍,工程名爲FileShareWithITunesDemo



     在工程的Info.plist文件中添加支持iTunes文件共享的Key,並將值設爲YES,



     以後將DEMO工工程發佈到iPad設備上,在iTunes的面板上咱們能夠看到以下圖:



       如今左側列表中有了咱們的工程對應的APP,接下來在mainStoryboard中添加簡單的描述和兩個按鈕:



      以後爲兩個按鈕創建action的outline,代碼以下 框架

// 對應第一個按鈕
- (IBAction)logFilePathInDocumentsDir:(id)sender
{
    NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:  @"Documents"];
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:docsDir];
    
    NSString *fileName;
    
    while (fileName = [dirEnum nextObject]) {
        NSLog(@"FielName : %@" , fileName);
        NSLog(@"FileFullPath : %@" , [docsDir stringByAppendingPathComponent:fileName]) ;
    }

}
// 對應第二個按鈕
- (IBAction)createImageFieldToDocuments:(id)sender
{
    NSFileManager *fileManager=[[NSFileManager alloc] init];
    
    NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent: @"Documents"];
    
    NSString *imageFileName = [docsDir stringByAppendingPathComponent:@"myImage.png"] ;
    
    UIImage *image = [self generateImage];
    
    [fileManager createFileAtPath:imageFileName contents:UIImagePNGRepresentation(image) attributes:nil] ;
    
}
// 建立一個簡單的UIImage對象並做爲圖片文件內容
- (UIImage*)generateImage
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(320, 200), NO, 0.0) ;
    
    CGContextRef ctx = UIGraphicsGetCurrentContext() ;
    
    CGRect imageRect = CGRectMake(0.0, 0.0, 320, 200) ;
    
    [[UIColor redColor] setFill] ;
    
    CGContextFillRect(ctx, imageRect) ;
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext() ;
    
    UIGraphicsEndImageContext() ;
    
    return image ;
}

       咱們先從MAC簡單的拖張圖片文件到右側列表,如圖示:



     以後點擊第一個按鈕,輸出Documents路徑下的全部文件名到控制檯 工具



      完成以後,點擊第二個按鈕完成向Documents目錄保存文件的功能(即共享文件到iTunes)



至此,簡單的流程完畢。

注:描述於IOS6.1下
相關文章
相關標籤/搜索