使用 CloudKit 作为跨平台数据库

jopen 8年前

原文  http://tips.producter.io/shi-yong-cloudkit-zuo-wei-kua-ping-tai-shu-ju-ku/


一直以来 CloudKit 在我心中是有点鸡肋的,如果只是用在 Apple 的生态里还好,但是要面向 Web 和 Android 做 Public Database 就显得捉襟见肘。


但是毕竟便宜!

这两天在做Producter 的 App 时,用 CloudKit 来作为数据库支持,发现还是很有潜力的。(只要苹果改进下权限控制 & 支持云代码)

WebService Access

Apple 在 CloudKit Web Services Reference 里晦涩的描述了如何使用 HTTP 来做 Request,不过用起来还是比较简单的,下面以 Javascript 为例,首先需要下面几个数据

  • Apple 服务器地址
  • iCloud Container
  • 想要访问的 CloudKit 数据库环境
  • 数据库 (public or private)
  • 操作(query,lookup)
  • API Token (可以从 Dashboard 获取)
var ServerPath = "https://api.apple-cloudkit.com/database/1/";    var CloudIdentifier = "iCloud.kevinzhow.Producter";    var Enviroment = "development"    var DataBase = "public/records"    var DataMethod = "query"    var ckAPIToken= "xx" 

随后你需要定义查询语句,例如我需要查询的是 Article,那么最简单的方法可以像这样写

var articleRequest = {      query: {      recordType: "article"    }  } 

如果你的浏览器是 Chrome 那么可以用 fetch 来获取数据试试了

var articleQuery = ServerPath+CloudIdentifier+"/"+Enviroment+"/"+DataBase+"/"+DataMethod+"?ckAPIToken="+ckAPIToken    fetch(articleQuery, {      method: 'POST',    headers: { "Content-type": "application/json"},    body: JSON.stringify(articleRequest)  })  .then(function(response) {    status = response.status;    console.log("Fetch article records " + status);    return response.json();   })  .then(function(responseObject) {    }).catch(function(err) {      // An error occured parsing Json      console.log("Fetch Error" + err);  }); 

如果希望高端一点的查询,可以尝试增加 filterBy 的字段

var articleRequest = {      query: {      recordType: "article",      filterBy: [{          comparator: "EQUALS",          fieldName: "type",          fieldValue:{              value: "article"          },          sortBy: [{              fieldName: "article_id",              ascending: false          }]      }]    }  } 

CloudKitJS

写入操作首先需要用户验证登录,WebService API 目前没有主动登录的方式,而是会在你访问需要用户权限的 API 的时候返回一个 redirect url 给你,随后你需要用浏览器打开这个 URL 进行认证。

于此相比,用 CloudKitJS 就要方便的多,首先在你的 HTML 里引入

<script src="https://cdn.apple-cloudkit.com/ck/1/cloudkit.js"></script> 

进行一个基本的配置并获取 Container 和 Database

CloudKit.configure({        containers: [{          containerIdentifier: CloudIdentifier,          webTokenAuth: {              webToken: ckAPIToken,              persist: true          },          environment: 'development'      }]  });    var container = CloudKit.getDefaultContainer();    var publicDatabase = container.publicCloudDatabase; 

随后你可以通过 setUpAuth() 方法来判断用户是否需要登录

container.setUpAuth().then(function(userInfo) {        if(userInfo) {         // The user is authenticated      } else {        console.log("Need Login");      }  }); 

而如何让用户登录显得有点 Magic,需要你在 HTML 里加入

<div id="apple-sign-in-button"></div>    <div id="apple-sign-out-button"></div> 

如果需要用户登录,Sign In 的按钮会显示(样式 Apple 会默认帮你定义好),反之则会显示 Sign Out。

用户点击按钮会会被引导到一个登录窗口,完成登录后,你可以通过 whenUserSignsIn() 来监听用户登录的情况。

container.whenUserSignsIn().then(function(userInfo) {  // The user just signed in      if(userInfo) {      console.log("User Info " + userInfo);    } else {      console.log("Need Login");    }  }); 

写入数据

写入数据可以如下构建 Model

var newArticle = {      recordType: "Article",    fields: {      title: {        value:"Title"      },      author:{ value:"Kevin"}    }  } 

执行写入操作

publicDatabase.saveRecords(newArticle).then(function(response) {              if (response.hasErrors) {                // Insert error handling                throw response.errors[0];            } else {                // Insert successfully fetched record code            }  }); 

不妨开始使用 CloudKit 作为你的个人项目的数据库,接下来的几个月我就好好祈祷 CloudKit 在明年 WWDC 可以进化的更完善一些了。