iOS網絡編程-iCloud文檔存儲編程實例
iCloud文檔存儲編程相對鍵值數據存儲而言比較複雜,涉及到自定義文檔類、獲得iCloud文檔目錄、查找Ubiquity容器中的文檔、保存文檔和解決文檔衝突等內容。
實例:iCloud文檔存儲編程設計
實例介紹一下iCloud文檔存儲編程過程,畫麵中有一個文本框和一個按鈕控件,在設備1輸入內容,點擊“保存數據”按鈕,將數據保存iCloud服務器。右圖是設備2畫麵,過幾秒鍾後設備2上會讀取iCloud服務器端數據,並顯示在文本框中。
配置Xcode工程
編寫iCloud文檔存儲編應用程序也需要在Xcode工程中進行一些配置,選擇TAGETS→MyNotes→Summary→Entitlements
在圖中Ubiquity Contrainers添加com.51work6.MyNotes,這是Ubiquity容器標識,可以有多個Ubiquity容器標識,這個容器標識代表著不同的目錄。com.51work6.MyNotes代表目錄如下所示:
/var/mobile/Library/Mobile Documents/98Z3R5XU29~com~51work6~MyNotes/
其中的98Z3R5XU29是在iOS開發者配置門戶網站創建App ID時候生成的,它被稱為Team ID。
如果應用中沒有使用iCloud鍵值數據存儲key-Value Store可以不用配置。
自定義文檔類
我們需要自己封裝一個文檔類,它繼承抽象類UIDocument,而UIDocument實現NSFilePresenter協議。實現NSFilePresenter協議的類,它所代表的文件和目錄可以被查看和編輯,這些NSFilePresenter實現類與文件協調者類NSFileCoordinator結合使用,可以協調管理文件或目錄。
這個類我們命名為MyCloudDocument, MyCloudDocument的代碼如下:
#import <UIKit/UIKit.h> @interface MyCloudDocument : UIDocument ① @property (strong, nonatomic) NSString *contents; @end #import ”MyCloudDocument.h” @implementation MyCloudDocument //加載數據 - (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError ② { if ([contents length] > 0) { self.contents = [[NSString alloc] initWithData:contents encoding:NSUTF8StringEncoding]; ③ } return YES; } //保存數據 - (id)contentsForType:(NSString *)typeName error:(NSError **)outError ④ { return [self.contents dataUsingEncoding:NSUTF8StringEncoding]; ⑤ } @end
獲得iCloud文檔目錄
iCloud文檔目錄是指在Ubiquity容器下的Document目錄,因此獲得了Ubiquity容器的根目錄,就可以獲得的iCloud文檔目錄了。
ViewController.m中的 ubiquitousDocumentsURL方法可以iCloud文檔目錄:
//請求本地Ubiquity容器,從容器中獲得Document目錄URL - (NSURL *)ubiquitousDocumentsURL { NSFileManager* fileManager = [NSFileManager defaultManager]; ① NSURL* containerURL = [fileManager URLForUbiquityContainerIdentifier:@"98Z3R5XU29.com.51work6.MyNotes"]; ② containerURL = [containerURL URLByAppendingPathComponent:@"Documents"]; ③ return containerURL; }
查找Ubiquity容器中的文檔
獲得iCloud文檔目錄後,我們需要找到容器中的文件。查詢容器中的文件需要注冊兩個廣播通知:
NSMetadataQueryDidFinishGatheringNotification 查詢結束發出通知;
NSMetadataQueryDidUpdateNotification 查詢結束,進入開始更新階段發出的通知;
ViewController.m中注冊和解除通知代碼如下:
- (void)viewDidLoad { [super viewDidLoad]; //為查詢iCloud文件的變化,注冊通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateUbiquitousDocuments:) name:NSMetadataQueryDidFinishGatheringNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateUbiquitousDocuments:) name:NSMetadataQueryDidUpdateNotification object:nil]; //查詢iCloud文件的變化 [self searchFilesOniCloud]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; [[NSNotificationCenter defaultCenter] removeObserver:self]; }
保存文檔
保存文檔很簡單,它是在ViewController.m中的 saveClick:方法處理的,saveClick:方法是點擊按鈕時候觸發:
- (IBAction)saveClick:(id)sender { _myCloudDocument.contents = _txtContent.text; [_myCloudDocument updateChangeCount:UIDocumentChangeDone]; [_txtContent resignFirstResponder]; }
保存成功之後我們可以在其它設備上看看是否iCloud中已經有abc.txt文檔了。如果使用Mac OS X係統電腦,我們可以在“係統偏好設置”中打開iCloud對話框,點擊“管理”按鈕可以打開iCloud空間管理對話框,其中的MyNotes是我應用名,右邊的abc.txt創建的文件。
如果在iPhone、iPod touch和iPad等iOS設備中查看,可以啟動設置應用程序,也進入到存儲空間管理中,我的iPod touch中查看的情況。
出自《iOS網絡編程與雲端應用最佳實踐》作者:關東升 @tony_關東升
最後更新:2017-04-03 18:51:44