閱讀82 返回首頁    go 微軟 go windows


iOS網絡編程-iCloud文檔存儲編程實例

iCloud文檔存儲編程相對鍵值數據存儲而言比較複雜,涉及到自定義文檔類、獲得iCloud文檔目錄、查找Ubiquity容器中的文檔、保存文檔和解決文檔衝突等內容。

實例:iCloud文檔存儲編程設計

實例介紹一下iCloud文檔存儲編程過程,畫麵中有一個文本框和一個按鈕控件,在設備1輸入內容,點擊“保存數據”按鈕,將數據保存iCloud服務器。右圖是設備2畫麵,過幾秒鍾後設備2上會讀取iCloud服務器端數據,並顯示在文本框中。

14

配置Xcode工程

編寫iCloud文檔存儲編應用程序也需要在Xcode工程中進行一些配置,選擇TAGETS→MyNotes→Summary→Entitlements

15

在圖中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創建的文件。

16

如果在iPhone、iPod touch和iPad等iOS設備中查看,可以啟動設置應用程序,也進入到存儲空間管理中,我的iPod touch中查看的情況。

17

出自《iOS網絡編程與雲端應用最佳實踐》作者:關東升 @tony_關東升

最後更新:2017-04-03 18:51:44

  上一篇:go [Android] SurfaceView使用實例
  下一篇:go hdu 1074 Doing Homework 狀態DP+dfs