iOS開發 - OC - 蘋果為大家提供的後台:CloudKit 的簡單使用

來源:互聯網
上載者:User

標籤:containe   xcode   控制   app   網頁   blog   任務   不能   inf   

 

一、什麼是cloudKit

      移動開發中,網路請求資料是日常中用到的,我們習慣把一些使用者改動的資料存在伺服器,以便下次請求使用。或者開發人員方通過伺服器將編輯的資料發送給使用者。但是這一切都建立在我們的APP擁有自己的伺服器之上。如果沒有伺服器的情況下我們的某些開發就變得很難進行,比如,公司沒有伺服器,確需要你做出一個使用者系統,這顯然令人頭痛,因為這幾乎是一個不可能完成的任務(有人說,扯淡吧,公司會沒有伺服器? 呵呵,我公司就沒有啊)。然而蘋果提供了一些便利,雖然不能完全替代後端,但是在一定程度上可以解決資料的雲端儲存需求,沒錯就是本文要講的:CloudKit。每個開發人員在使用CloudKit之後,蘋果會為其提供一個不小的dashboard作為雲端資料的儲存地,CloudKit 提供了一套API用於在dashboard中存取資料。簡直太方便了啊有米有。

      關於CloudKit的詳細說明,我建議大家看看這裡。   

二、如何使用cloudKit 

      使用之前,我們先瞭解下關於CloudKit的一些基礎資料型別 (Elementary Data Type)。

CloudKit 基礎物件類型

CloudKit 的基礎物件類型有 7 種。這些物件類型可能和你在其他編程領域瞭解的類似物件類型稍有差別。

  • CKContainer: Containers 就像應用啟動並執行沙箱一樣,一個應用只能訪問自己沙箱中的內容而不能訪問其他應用的。Containers 就是最外層容器,每個應用有且僅有一個屬於自己的 container。(事實上,經過開發人員授權配置 CloudKit Dashboard 之後,一個應用也可以訪問其他應用的 container。)

  • CKDatabase: Database 即資料庫,私人資料庫用來儲存敏感資訊,比如說使用者的性別年齡等,使用者只能訪問自己的私人資料庫。應用也有一個公開的資料庫來儲存公用資訊,例如你在構建一個根據地理位置簽到的應用,那麼地理位置資訊就應該儲存在公用資料庫裡以便所有使用者都能訪問到。

  • CKRecord: 即資料庫中的一條資料記錄。CloudKit 使用 record 通過 k/v 結構來儲存結構化資料。關於KVStore for Redis,目前值的架構支援 NSString、NSNumber、NSData、NSDate、CLLocation,和 CKReference、CKAsset,以及儲存以上資料類型的數組。

  • CKRecordZone: Record 不是以零散的方式存在於 database 之中的,它們位於 record zones 裡。每個應用都有一個 default record zone,你也可以有自訂的 record zone。

  • CKRecordIdentifier: 是一條 record 的唯一標識,用於確定該 record 在資料庫中的唯一位置。

  • CKReference: Reference 很像 RDBMS 中的參考關聯性。還是以地理位置簽到應用為例,每個地理位置可以包含很多使用者在該位置的簽到,那麼位置與簽到之間就形成了這樣一種包含式的從屬關係。

  • CKAsset: 即資源檔,例如二進位檔案。還是以簽到應用為例,使用者簽到時可能還包含一張照片,那麼這張照片就會以 asset 形式儲存起來。

本文就一個簡單的例子說說使用cloudKit。假如我們需要做一個使用者資訊的儲存系統。

 

使用CloudKit 的環境配置     

     在使用CloudKit之前,我們需要先在Xcode 中做一些配置。 (本文基於Xcode8)

  1. 在target -> capabilities 中找到 iColod選項。

     

     

  2. 開啟iCloud的控制開關。 
  3. 在展開的框中做如下設定  

     

     其中在containers中的 “ cloudKit dashBoard ”按鈕可以直接進入到我們在icloud上的儲存空間。 這裡要確保APP中使用的開發人員帳號是實際存在的 。進入網頁之後登入開發人員帳號登入。

 

 

登入成功會出現這個畫面:

 

這裡我已經存了一部分資料。 存進去之後還是很直觀的,但是看不到儲存的屬性對應的內容,我也還在研究中。

 

使用CloudHit 儲存資料  

    如果我們需要儲存一個包含了使用者的  賬戶、密碼、使用者名稱字、電話號碼、郵箱、帳戶圖片等資料的對象。 我們建立一個使用者的屬性類  UserInfoModel。

#import <Foundation/Foundation.h>@interface UserInfoModel : NSObject/** 賬戶名稱 */@property (nonatomic,strong)NSString *userAccout;/** 使用者名稱字 */@property (nonatomic,strong) NSString *userName;/** 帳戶圖片 */@property (nonatomic,strong) UIImage *userAvtar;/** 使用者手機號碼 */@property (nonatomic,strong) NSString *userPhoneNum;/** 使用者郵箱號 */@property (nonatomic,strong) NSString *userEmail;/** 使用者密碼 */@property (nonatomic,strong) NSString *userPassword;@end

 

     在儲存資料之前,我們為了之後方便查詢,可以將某一項作為唯一標示(這要求標示不會經常被修改),比如在這裡我們選擇賬戶名,當然你也可以選擇其他任意的字元,關鍵是之後的尋找要有依據。  接下來就開始進行儲存了。    

 - (void)saveWithModel:(UserInfoModel*)userInfoModel{    //因為賬戶名不變的 以帳戶名稱做微ID最好不過了    CKRecordID *postrecordID = [[CKRecordID alloc]initWithRecordName:userInfoModel.userAccout];    CKRecord *postRecrod = [[CKRecord alloc] initWithRecordType:userInfoModel.userAccout recordID:postrecordID];        //將使用者類的屬性和屬性值打包成一個字典  其中屬性對應key 屬性值對應Value  因為屬性中有一欄是圖片類,CloudKit不支援直接對圖片進行儲存,但是可以轉換成NSdata,這洋就可以進行儲存了.   這裡說明一下 cloudKit的提交 只接受NSString、NSNumber、NSData、CLLocation,和 CKReference、CKAsset 等直接的儲存, 其它的需要    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];    NSMutableArray *propArr = [self getAllProp:[userInfoModel class]];   //這裡使用getAllProp 在下面貼出    for (NSString *prop in propArr) { if([[userInfoModel valueForKey:prop] isKindOfClass:[UIImage class]]){        // 圖片特殊情況另外處理  如果實別的不符合儲存的也同樣需要處理        UIImage *image = [userInfoModel valueForKey:prop];                postRecrod[prop] = [NSData dataWithData:UIImagePNGRepresentation(image)]; //record可以像字典一樣進行資料的收納    }else{        postRecrod[prop] = [userInfoModel valueForKey:prop];    }    }        //使用者資訊 提交到 雲    [[[CKContainer defaultContainer] privateCloudDatabase] saveRecord:postRecrod completionHandler:^(CKRecord *savedPlace, NSError *error) {        if(savedPlace){            DLog(@"%@",savedPlace);  //成功  列印儲存的內容                    }else{            DLog(@"%@",error);    //失敗 列印錯誤        }    }];        }
- (NSMutableArray *)getAllProp:(Class)cls{    // 擷取當前類的所有屬性    unsigned int count;// 記錄屬性個數    objc_property_t *properties = class_copyPropertyList(cls, &count);    // 遍曆    NSMutableArray *mArray = [NSMutableArray array];    for (int i = 0; i < count; i++) {        // objc_property_t 屬性類型        objc_property_t property = properties[i];        // 擷取屬性的名稱 C語言字串        const char *cName = property_getName(property);        // 轉換為Objective C 字串        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];        [mArray addObject:name];    }    return mArray;} 
使用CloudHit 查詢資料
- (void )cloudGetUserInfoWithUseraccout:(NSString *)userAccout Succeed:(void(^)(UserInfoModel* ))succeed failed:(void(^)(NSError *))failed{    UserInfoModel *model = [[UserInfoModel alloc]init];    if(userAccout){        CKRecordID *postrecordID = [[CKRecordID alloc]initWithRecordName:userAccout];        [[[CKContainer defaultContainer] privateCloudDatabase] fetchRecordWithID:postrecordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {            // handle errors here            if(error){                if(failed){                    failed(error);                }            }else{  //說明查詢成功                if(succeed){                                        //已經擷取到了存入的資料, 並經過轉換存入了字典 dic  將字典中的索引值對賦給一個類對應的屬性 同理因為其中有一個圖片 所以需要做一個NSdata的轉換                    NSMutableArray *mArray = [self getAllProp:[model class]];                    for (NSString *prop in mArray) { //這裡如果不是在後台人為添加的資料 不會出現沒有對應的屬性的情況  但是為了保險起見。在UserInfoModel 重寫 setVale:forUndefinedKey方法                        id info = [record valueForKey:prop];                        if(![info isKindOfClass:[NSData class]]){                            //                        [model setValue:[dic valueForKey:prop] forKey:prop];                            [model setValue:record[prop] forKey:prop];                                                    }else{                            UIImage *image = [UIImage imageWithData:info];                            [model setValue:image forKey:prop];                        }                    }                    succeed(model); //回調擷取到的模型                }            }        } ];    }}

 

使用CloudHit 刪除資料
- (void)cloudDeleteModelWithModel:(UserInfoModel *)userInfoModel{    //之前也說了在儲存的時候, 我們操縱cloud上的資料都是通過record ID來實現的, 所以record ID的名字應該是一個不經常改變的屬性, 這裡用的就是使用者的賬戶名    CKRecordID *postrecordID = [[CKRecordID alloc]initWithRecordName:userInfoModel.userAccout];    [[[CKContainer defaultContainer] privateCloudDatabase] deleteRecordWithID:postrecordID completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) {        if(!error){                //刪除成功        }else{                DLog(@"刪除失敗%@",error);    //列印錯誤        }    }];}

 

以上就是cloudKit的簡單使用。通過這個,當需要儲存一些比較簡單的資料還是可以滿足的。

PS:我也剛開始用,發現了一個小問題, 單次儲存的資料不能太大(大小沒有測試,大概是2M左右吧),不然會提示失敗。   所以有的資料過大,可能需要經過拆分,或者圖片過大需要經過壓縮才能進行儲存。

   

  

      

 

iOS開發 - OC - 蘋果為大家提供的後台:CloudKit 的簡單使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.