kuboard使用mysql_使用 CloudKit 作为跨平台数据库
一直以来 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 = {undefined
query: {undefined
recordType: "article"
}
}
如果你的浏览器是 Chrome 那么可以用 fetch 来获取数据试试了
var articleQuery = ServerPath+CloudIdentifier+"/"+Enviroment+"/"+DataBase+"/"+DataMethod+"?ckAPIToken="+ckAPIToken
fetch(articleQuery, {undefined
method: 'POST',
headers: { "Content-type": "application/json"},
body: JSON.stringify(articleRequest)
})
.then(function(response) {undefined
status = response.status;
console.log("Fetch article records " + status);
return response.json();
})
.then(function(responseObject) {undefined
}).catch(function(err) {undefined
// An error occured parsing Json
console.log("Fetch Error" + err);
});
如果希望高端一点的查询,可以尝试增加 filterBy 的字段
var articleRequest = {undefined
query: {undefined
recordType: "article",
filterBy: [{undefined
comparator: "EQUALS",
fieldName: "type",
fieldValue:{undefined
value: "article"
},
sortBy: [{undefined
fieldName: "article_id",
ascending: false
}]
}]
}
}
CloudKitJS
写入操作首先需要用户验证登录,WebService API 目前没有主动登录的方式,而是会在你访问需要用户权限的 API 的时候返回一个 redirect url 给你,随后你需要用浏览器打开这个 URL 进行认证。
于此相比,用 CloudKitJS 就要方便的多,首先在你的 HTML 里引入
进行一个基本的配置并获取 Container 和 Database
CloudKit.configure({undefined
containers: [{undefined
containerIdentifier: CloudIdentifier,
webTokenAuth: {undefined
webToken: ckAPIToken,
persist: true
},
environment: 'development'
}]
});
var container = CloudKit.getDefaultContainer();
var publicDatabase = container.publicCloudDatabase;
随后你可以通过 setUpAuth() 方法来判断用户是否需要登录
container.setUpAuth().then(function(userInfo) {undefined
if(userInfo) {undefined
// The user is authenticated
} else {undefined
console.log("Need Login");
}
});
而如何让用户登录显得有点 Magic,需要你在 HTML 里加入
如果需要用户登录,Sign In 的按钮会显示(样式 Apple 会默认帮你定义好),反之则会显示 Sign Out。
用户点击按钮会会被引导到一个登录窗口,完成登录后,你可以通过 whenUserSignsIn() 来监听用户登录的情况。
container.whenUserSignsIn().then(function(userInfo) { // The user just signed in
if(userInfo) {undefined
console.log("User Info " + userInfo);
} else {undefined
console.log("Need Login");
}
});
写入数据
写入数据可以如下构建 Model
var newArticle = {undefined
recordType: "Article",
fields: {undefined
title: {undefined
value:"Title"
},
author:{ value:"Kevin"}
}
}
执行写入操作
publicDatabase.saveRecords(newArticle).then(function(response) {undefined
if (response.hasErrors) {undefined
// Insert error handling
throw response.errors[0];
} else {undefined
// Insert successfully fetched record code
}
});
不妨开始使用 CloudKit 作为你的个人项目的数据库,接下来的几个月我就好好祈祷 CloudKit 在明年 WWDC 可以进化的更完善一些了。
原文链接:https://blog.csdn.net/weixin_42442958/article/details/114318845
相关文章