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



