2014年10月24日金曜日

CloudKit解決!

このまま1日坊主で終わってしまいそうな雰囲気だったSwift挑戦記ですが、
無事2日めに突入出来そうです。

さて、前回CloudKitが全くもってクエリを返してくれないという事で難儀しておりましたが、またもやK君の力添えにて解決。

まずハマりポイントその1

CloudKitにはContainerという概念があります。まあスキーマを保存する入れ物でしょうか。普通のRDBですとデータベースというレイヤーに当たる所だと思います。

んで、今回はCloudKit + Today Extensionという組み合わせで作っていたために、CloudKit側に本体とExtension2つのContainerが出来ていました。

よく分かっていなかったのでCloudKit DashboardにてExtension側にデータを突っ込んでいたのですが、、、

var db: CKDatabase! = CKContainer.defaultContainer().publicCloudDatabase

ネットからかっぱらってきたこのソース、よく見るとDefaultのContainerを取ってくる用でした。設定の方で、他のContainerを指定してから、、










var db: CKDatabase! = CKContainer(identifier: "iCloud.com.subakolab.@@@@@@@@@").publicCloudDatabase

という風にソースを変更してやります。(@@@@@@@@@はContainer名)

そして次のソース

//
let p = NSPredicate(format: "TRUEPREDICATE")
let q : CKQuery = CKQuery(recordType: "※テーブル名", predicate: p)        
db.performQuery(q, inZoneWithID: nil) { (results, error) -> Void in
    self.texts = results as [CKRecord]
    self.tableView.reloadData()
}

これでUITableViewにレコードが表示出来るはず。。。。が、いくらやってもサーバからエラーしか返ってきません。。な。。。ぜ。。。だ。。。。

ここでハマりポイントその2




















CloudKitはiCloudにログインしていないと使えないサービスです。
(2014-11-07追記 ★ログインしなくても実機ではReadは出来るみたいです。ただし、やはり何故かシミュレーター上ではiCloudの設定は必要なようです。)

なので、、、当然iOS Simulator上でもiCloudにログインしていないと使えないのでした。。当たり前ですがこれに気づかず。。。

というわけで、これで無事データを取ってくる事が出来ました。

サーバの用意いらず費用いらずの素敵MBaaSサービスのCloudKit、これから色々活用出来そうです。ただ、DashboardがデータのImport/Exportも出来ないなど使い勝手は本当に最低限なので、そのあたりが充実する事を切に願う次第であります。

またそのうち続きを書きます。

では。。