iOS項目iCloud及CloudKit Dashboard運用,icloudcloudkit

來源:互聯網
上載者:User

iOS項目iCloud及CloudKit Dashboard運用,icloudcloudkit

CloudKit是蘋果推出的基於iCloud的一個雲端資料存放區服務.其 主要由下面兩部分組成:

一個儀錶web頁面,用於管理公開資料的記錄類型.

一組API介面,用於iCloud和裝置之間的資料傳遞.

 

一:首先在XCode上面開啟關於iCloud功能

1:進入對應的項目Targets 中的Capabilities 選項卡,開啟關於iCloud功能;如果勾選iCloud Documents或CloudKit會自動產生一個帶iCloud.開頭的Containers,要配置認證支援;CloudKit Dashboard則可以直接跳轉到Web配置關於iCloud的內容;而關於Steps則是配置的步驟是否都成功;

 

 

二:關於認證如何配置支援iCloud功能

1:進入蘋果認證管理後台中的Identifiers裡有個iCloud Containers菜單

 

因為執行個體中的Bundle Identifier的名字wjy.com.MobileProject;所以在這邊建立一個iCloud.wjy.com.MobileProject的ID值;都是前面增加一個iCloud為開頭;app的bundle id需要與iCloud容器相對應, iCloud容器名必須是唯一的,因為這是Cloudkit用來訪問資料所使用的全域識別碼。由於iCloud容器名包含bundle id,因此bundle id也必須是唯一的(這就是為何需要修改com.raywendrelich.BabiFud)。 

為了讓entitlements起作用,需要在App的認證、標識符與設定檔中ID的部分列出app/bundle id。這意味著標識的認證使用了設定的team id與app id,從中可得到iCloud容器的id。若已經在一個可用的開發人員帳號中標識了的話Xcode會自動完成這一切。不巧的是,這有時是不同步的,需要更新ID-使用iCloud功能面板修改CloudKit容器ID。否則的話需要修改info.plist檔案或BabiFud.entitlements檔案來確保id values與所設定的bundle id一致。

2:建立完上面的ID後,同樣進行Identifiers裡的App IDs,找到我們當前的App ID然後對它進行編輯

開啟iCloud的功能選擇,並且選擇Include CloudKit support,這邊這時會有一個警告出現,選擇右邊的Edit進行編輯

這時會有剛才建立好的那個iCloud ID可以選擇綁定;選擇好以後外面的警告也會消除;然後產生對應的描述檔案安裝後,XCode上面的步驟報錯也會消除;

 

三:設定iCloud的資料

1:要進入CloudKit Dashboard操作有兩種方式,第一種如上面第一點所說可以直接點CloudKit Dashboard進入,另一種就是進入蘋果帳號後台也有一個相應的菜單;

2:進入CloudKit Dashboard可以看到如下的頁面

 

2.1 SCHEMA :

CloudKit容器的進階類:Record Types, Security Roles, 和Subscription Types,其中主要使用的是Record Types;

一個Record Type用來定義一個單獨的記錄(可以理解為一個資料模型),相當於儲存資料的模板,和資料庫的表結構類似;

2.2 PUBLIC DATA 和 PRIVATE DATA

就是你儲存資料的地方,開發人員可以查看所有的共用資料,但是只能看到自己的私密資料,無法看到使用者的私密資料;這裡沒有顯示PRIBATE DATA,其結構和PUBLIC DATA是一樣的;

User Records 記錄一些當前使用者的資訊;

Default Zone :這裡可以查看資料的詳細資料,也是後面主要使用的;

2.3 ADMIN 主要是管理開發人員團隊許可權的,這裡不做過多介紹;

3:切回Record Type選項,點擊右側邊欄的左上方的 "+ ",新增一個模型:

輸入模型名稱: 預設只有一個StringField的屬性(這裡暫且這麼稱呼吧),可以點擊下面的Add Field... 新增屬性列表;

同樣可以選擇屬性的類型,如:

設定完成後,點擊右下角的 Save按鈕即可儲存!這樣,一個模型就建立好了;儲存類型的資料:

1. NSData (single bytes)  2. NSDate (date and time)  3. NSNumber (both Int and Double)  4. NSString (or String in Swift)  5. NSArray (list)  6. CKReference (used to create relationships between objects)  7. CLLocation (location)  8. CKAsset (file)  

5:回到Default Zone,中間藍色地區的右上方的名稱旁有個倒三角,這裡可以選擇使用(查詢)哪個模型下的資料:

 

6:如果要存是圖片欄位記得選Asset類型

 

注意:1 Public Record ,1 Private Record,意思是:使用模型Note的有一條公用資料,一條隱私資料,由於我登陸的iCloud帳號和開發人員帳號不一樣,相當於是使用者帳號,所以這裡是看不到那個隱私資料的

 

四:代碼操作iCloud功能

1:首先引入CloudKit.framework系統架構,並引入命名空間#import <CloudKit/CloudKit.h> 就可以進行操作

2:首先是判斷手機中的iCloud功能是否開啟,如下面如果有值則表示已經開啟的iCloud功能;

id cloudUrl=[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];

這個方法接受一個參數, 就是要擷取的容器標識。 所謂容器標識, 大多數應用只會用到一個 iCloud 容器,所以我們這裡傳入 nil, 就代表預設擷取第一個可用的容器。這個方法內部會尋找當前應用擁有的 iCloud 容器, 如果找到就會返回這個容器的 URL, 證明當前應用的 iCloud 容器可用。 如果找不到,就會返回 nil, 證明當前應用的 iCloud 不可用。

注意: iCloud 容器和你 App 檔案沙箱, 在 iOS 檔案系統中其實是分別存放在兩個不同的地方的:

iCloud 檔案路徑格式 file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~xxx~aaa/Documents

App 沙箱檔案路徑格式 file:///var/mobile/Containers/Data/Application/3B4376B3-89B5-3342-8057-3450D4224518/Documents/

由此可見, 這也是為什麼 iCloud 和 Sandbox 檔案路徑訪問需要兩套不同的方式的原因了。

3:增加一條記錄,可以給它一個固定的recordID,就像資料表的主鍵一樣,尋找、更新跟刪除有用;

-(void)addCloudDataWithPublic:(BOOL)isPublic recordID:(NSString *)recordID name:(NSString *)name password:(NSString *)password{    //CloudKit給應用程式分配部分空間,用於儲存資料,首先要擷取這個儲存空間,這裡我們直接擷取了預設的儲存空間(可以自訂儲存空間):    CKContainer *container=[CKContainer defaultContainer];    CKDatabase *database;    if (isPublic) {        database=container.publicCloudDatabase; //公用資料    }    else    {        database=container.privateCloudDatabase;//隱藏資料    }        //建立主鍵ID  這個ID可以到時尋找有用到    CKRecordID *noteId=[[CKRecordID alloc]initWithRecordName:recordID];    //建立CKRecord 儲存資料    CKRecord *noteRecord = [[CKRecord alloc]initWithRecordType:@"User" recordID:noteId];        //設定資料    [noteRecord setObject:name forKey:@"name"];    [noteRecord setObject:password forKey:@"password"];        //儲存操作    [database saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {        if (!error) {            [self showAlertMessage:@"儲存成功"];        }    }];}

4:假如要儲存帶有圖片的欄位,需要用到CKAsset,他的初始化需要一個URL,所以這裡,我先把圖片資料儲存到本地沙箱,產生一個URL,然後再去建立CKAsset:

//增加帶圖片的提交 圖片的儲存,需要用到CKAsset,他的初始化需要一個URL,所以這裡,我先把圖片資料儲存到本地沙箱,產生一個URL,然後再去建立CKAsset:-(void)saveImageDataWithPublic:(BOOL)isPublic recordID:(NSString *)recordID name:(NSString *)name password:(NSString *)password{    //儲存圖片 圖片的儲存,需要用到CKAsset,他的初始化需要一個URL,所以這裡,我先把圖片資料儲存到本地沙箱,產生一個URL,然後再去建立CKAsset:    UIImage *image=[UIImage imageNamed:@"icloudImage"];    NSData *imageData = UIImagePNGRepresentation(image);    if (imageData == nil) {        imageData = UIImageJPEGRepresentation(image, 0.6);    }    NSString *tempPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/imagesTemp"];    NSFileManager *manager = [NSFileManager defaultManager];    if (![manager fileExistsAtPath:tempPath]) {                [manager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil];    }        NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,@"iCloudImage"];    NSURL *url = [NSURL fileURLWithPath:filePath];    [imageData writeToURL:url atomically:YES];        CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];        //與iCloud進行互動    CKContainer *container=[CKContainer defaultContainer];    CKDatabase *database;    if (isPublic) {        database=container.publicCloudDatabase; //公用資料    }    else    {        database=container.privateCloudDatabase;//隱藏資料    }        //建立主鍵ID  這個ID可以到時尋找有用到    CKRecordID *noteId=[[CKRecordID alloc]initWithRecordName:recordID];    //建立CKRecord 儲存資料    CKRecord *noteRecord = [[CKRecord alloc]initWithRecordType:@"User" recordID:noteId];        //設定資料    [noteRecord setObject:name forKey:@"name"];    [noteRecord setObject:password forKey:@"password"];    [noteRecord setObject:asset forKey:@"userImage"];        //儲存操作    [database saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {        if (!error) {            [self showAlertMessage:@"儲存成功"];        }    }];}

5:尋找單條記錄的功能,通過recordID進行

//尋找單條記錄-(void)searchRecordWithRecordID:(NSString *)recordID withFormPublic:(BOOL)isPublic{    //獲得指定的ID    CKRecordID *noteId=[[CKRecordID alloc]initWithRecordName:recordID];        //獲得容器    CKContainer *container=[CKContainer defaultContainer];        //獲得資料的類型 是公有還是私人    CKDatabase *database;    if (isPublic) {        database=container.publicCloudDatabase;    }    else    {        database=container.privateCloudDatabase;    }        __weak typeof(self)weakSelf = self;    //尋找操作    [database fetchRecordWithID:noteId completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {        NSString *message=[NSString stringWithFormat:@"獲得RecordID為%@ 的資料:%@,%@",recordID,[record objectForKey:@"name"],[record objectForKey:@"password"]];        [weakSelf showAlertMessage:message];    }];}

6:查詢多條記錄的功能,用到的謂詞進行

//尋找多條記錄(可以用謂詞進行)-(void)searchRecordWithFormPublic:(BOOL)isPublic withRecordTypeName:(NSString *)recordTypeName{    CKContainer *container=[CKContainer defaultContainer];    //獲得資料的類型 是公有還是私人    CKDatabase *database;    if (isPublic) {        database=container.publicCloudDatabase;    }    else    {        database=container.privateCloudDatabase;    }        NSPredicate *predicate=[NSPredicate predicateWithValue:YES];    CKQuery *query=[[CKQuery alloc]initWithRecordType:recordTypeName predicate:predicate];        __weak typeof(self)weakSelf = self;    [database performQuery:query inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) {        [weakSelf showAlertMessage:[NSString stringWithFormat:@"%@",results]];    }];}

7:更新一條記錄首先要尋找出該條記錄,再對它進行修改,如果對應的索引值存在進修改其值,如果索引值不存在則增加新的類型欄位;

//更新一條記錄 首先要尋找出這一條  然後再對它進行修改-(void)updateRecordWithFormPublic:(BOOL)isPublic withRecordTypeName:(NSString *)recordTypeName withRecordID:(NSString *)recordID{    //獲得指定的ID    CKRecordID *noteId=[[CKRecordID alloc]initWithRecordName:recordID];        //獲得容器    CKContainer *container=[CKContainer defaultContainer];        //獲得資料的類型 是公有還是私人    CKDatabase *database;    if (isPublic) {        database=container.publicCloudDatabase;    }    else    {        database=container.privateCloudDatabase;    }        __weak typeof(self)weakSelf = self;    //尋找操作    [database fetchRecordWithID:noteId completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {        if (!error) {                        //對原有的健值進行修改            [record setObject:@"aa123456789" forKey:@"password"];            //如果健值不存在 則會增加一個            [record setObject:@"男" forKey:@"gender"];                        [database saveRecord:record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {                if (!error) {                    [weakSelf showAlertMessage:@"修改儲存成功"];                }                else                {                    [weakSelf showAlertMessage:[NSString stringWithFormat:@"出錯誤 :%@",error]];                }            }];                    }    }];}

8:刪除一條記錄

//刪除記錄-(void)deleteRecordWithFormPublic:(BOOL)isPublic withRecordID:(NSString *)recordID{    //獲得指定的ID    CKRecordID *noteId=[[CKRecordID alloc]initWithRecordName:recordID];    //獲得容器    CKContainer *container=[CKContainer defaultContainer];        //獲得資料的類型 是公有還是私人    CKDatabase *database;    if (isPublic) {        database=container.publicCloudDatabase;    }    else    {        database=container.privateCloudDatabase;    }        __weak typeof(self)weakSelf = self;    [database deleteRecordWithID:noteId completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) {        if (!error) {            [weakSelf showAlertMessage:@"刪除成功"];            return;        }        [weakSelf showAlertMessage:[NSString stringWithFormat:@"刪除失敗 %@",error]];    }];    }

 五:操作執行個體

編寫一個關於在同一台手機上免登入的執行個體,主要原理是通過擷取手機裝置唯一碼,然後通過iCloud儲存到雲端,在刪除APP後再安裝後就可以直接從雲端獲得使用者跟密碼;會不斷完善此執行個體,如果感興趣可以點星並關注,會接著編寫關於iCloud關於檔案的同步功能;注意認證可以換成自個的,步驟如上:

原始碼地址:https://github.com/wujunyang/iCloudProject

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.