分类目录归档:教程

基于 AVOS Cloud 的一对多、多对多数据建模

产品需求

demo (1)

假设有一个类似于 Instagram 的产品,核心的数据类型可能包括:用户(User),图片(Image),评论(Comment),点赞(Like)。他们之间的关系如下:

  • 对于每张图片(Image),有一个 publisher,是一个 User 对象的实例;
  • 每张图片,可能会有很多 Comment,每条 Comment 会包含一段文字说明和一个 Creator(也是一个 User 对象的实例);
  • 每张图片还会有很多人点赞(Like),我们可以根据图片找到所有点赞的人,也可以根据人找到他所有赞过的图片。

对于这样的模型,在 MySQL 中我们能很容易地通过主键、外键建立关联,但在 AVOS Cloud 里面如何表现出来呢?下面我会为大家仔细说明一下如何处理这种复杂的数据建模。

继续阅读

使用 Swift 和 LeanCloud 构建 iOS 应用

苹果在今年(2014)的 WWDC 大会上发布了一门新的开发语言 Swift。我们注意到很多开发者对 Swift 感兴趣,于是我们第一时间尝试了怎么用 LeanCloud SDK 和 Swift 构建 iOS 应用,并把方法告诉大家,方便使用 LeanCloud 服务的开发者能更快适应新的开发语言。

如果你还不知道 Swift 或者知之甚少,可以先看看苹果官方的介绍
The Swift Programming Language 或者 The Swift Programming Language (iBooks Store)

Swift 对于 iOS 的开发者来说,一个最重要的特点就是它完全兼容已有的 Objective-C 开发库,不论是系统已有的还是第三方提供的。下面介绍怎么在 Swift 工程中使用 LeanCloud SDK。

继续阅读

Swift 基础运算符

对任何一门高级编程语言,基础运算符都是不可或缺的。为了让更多开发者了解 Swift 的基础运算符,我们翻译了《The Swift Programming》的《Basic Operators》一章,如有错误,敬请指正。转载请在开始位置注明出处。

基础运算符

运算符 是一种可以检查、修改或结合数值的特殊符号或短语。例如,加法运算符可以将两个数字相加(let i = 1 + 2)。更复杂的例子还包括逻辑与运算符 &&if enteredDoorCode && passedRetinaScan)以及可以简化增量操作的运算符 ++i

Swift 支持大多数标准 C 运算符,并增强了避免常见编码错误的能力。赋值运算符(=)没有返回值,这可以防止误用(=)和等于符号(==)。算数运算符(+*)会检测且禁止数值溢出,避免因处理数据不当而导致的意外结果。你可以使用 Swift 的溢出运算符来自定义溢出行为,详情请参考 溢出运算符

继续阅读

Objective-C 开发者眼中的 Swift: 那些激动人心的新功能

swiftfeature

我们会在 blog 上持续地发布 Swift 相关的文章。AVOS Cloud 的 Swift SDK 也会很快推出,请大家关注。在转载本文时请务必保持完整性并在开头提供出处链接。

本文翻译自 http://www.raywenderlich.com/73997/swift-language-highlights

如果你和我一样,周一早上坐下来准备好好看看苹果的 Keynote,兴奋地准备开始尝试一些新的 API,结果你听到最多的是一门新的语言:Swift!你突然被告知,这不是 Objective-C 的扩展,而是一门完完全全新的语言。你是会激动呢,还是高兴,抑或头脑一片空白?

Swift 将会完全改变我们写 iOS 和 Mac 应用的方式,在这片文章里,我概括了这门语言的一些要点,并和 Objective-C 里面相应部分做了对比。

注意:这不是 Swift 的入门读物,苹果已经发布了一本很全面的 Swift Programming Language,我强烈建议你先读它。这篇文章只会讨论一些特别 cool、值得玩味的知识点。

继续阅读

Swift 语言概览

过去的一周里 iOS 的开发者们最关注的话题无疑是 Apple WWDC 宣布的新的 iOS 平台程序设计语言 Swift. 不知道有多少非 iOS 开发者和我一样有「现在开始学 iOS 开发还不晚」的想法。

Not too late to learn

相对于 Objective-C 而言,因为没有了历史包袱,Swift 是一个更简洁的语言。同时 Swift 也是一个比较简单的语言,与其他现代的程序设计语言并没有太大不同。所以对于有一定经验的开发者来说只要对语法和基本特性有一定了解,就可以马上开始用 Swift 做开发。我们翻译了官方「The Swift Programming Language」中的「A Swift Tour」一章发布出来,旨在帮助有经验的开发者快速熟悉这门语言。

在这个过程中我们发现这本书在语言方面的质量并不是很高,比如一些地方出现了类型和类型的实例的混淆,以及声明和定义等概念的混淆等等。但无论如何在短期内,这本书还是学习 Swift 的主要资源。我们也会在 blog 上持续地发布相关的文章。AVOS Cloud 的 Swift SDK 也会很快推出,请大家关注。

在转载本文时请务必保持完整性并在开头提供出处链接。

继续阅读

细说 iOS 消息推送

经常有同学问我们,iOS 上推送究竟怎么做啊,为什么我的设备总收不到推送呢,这里跟大家集中讨论一下 iOS 上推送的实现细节。

APNs 的推送机制

与 Android 上我们自己实现的推送服务不一样,Apple 对设备的控制非常严格,消息推送的流程必须要经过 APNs:
remote_notif_simple_2x

这里 Provider 是指某个应用的 Developer,当然如果开发者使用 LeanCloud 的服务,把发送消息的请求委托给我们,那么这里的 Provider 就是 LeanCloud 的推送服务程序了。上图可以分为三步:

  1. LeanCloud 推送服务程序把要发送的消息、目的设备的唯一标识打包,发给 APNs。
  2. APNs 在自身的已注册 Push 服务的应用列表中,查找有相应标识的设备,并把消息发送到设备。
  3. iOS 系统把发来的消息传递给相应的应用程序,并且按照设定弹出 Push 通知。

继续阅读

自定义应用内用户重设密码和邮箱验证页面

AVOS Cloud 的应用内用户系统帮助您解决用户注册、SNS 帐户绑定、修改密码、忘记密码以及邮箱验证等用户系统相关的问题。

用户邮箱验证

默认应用里用户注册是不需要验证邮箱的,如果您强制要求用户验证邮箱,那可以在应用设置菜单的邮件设置里打开 启用邮件验证 的选项。那么当用户在您的 App 里注册的时候,将会自动发送一封邮件到用户的注册邮箱,附带一个链接让用户来确认邮箱有效。

20140109_email_setting.png

同时每个用户 AVUser 对象都会有一个布尔属性 emailVerified 来标示用户是否验证过邮箱。

用户重设密码

当用户忘记密码的时候,可以通过调用 SDK 中代码来发送忘记密码的邮件到用户的注册邮箱,邮件中会带有一个链接,用户点击链接后可以重设密码。

在 iOS SDK 中调用:

[AVUser requestPasswordResetForEmailInBackground:@"myemail@example.com" block:^(BOOL succeeded, NSError *error) {
    if (succeeded) {

    } else {

    }
}];

在 Android 中调用:

AVUser.requestPasswordResetInBackground("myemail@example.com", new RequestPasswordResetCallback() {
    public void done(AVException e) {
        if (e == null) {
            // 已发送一份重置密码的指令到用户的邮箱
        } else {
            // 重置密码出错。
        }
    }
});

自定义邮件模板

默认发送的邮箱验证邮件和重设密码邮件的内容可以在应用设置的邮件设置菜单里看到:

20140109_template_setting.png

您可以修改邮件主题和内容,保存后即可生效。主题和内容都支持 handlebar 模板 ,并且预定义了部分变量。

验证邮箱邮件中支持的变量包括:

  • appname – 应用名称
  • email – 用户邮箱地址
  • username – 用户的用户名
  • link – 验证邮箱的链接,默认是 AVOS Cloud 提供的验证链接。*

重设密码邮件中支持的变量包括:

  • appname – 应用名称
  • username – 用户的用户名
  • link – 修改密码的链接,默认是 AVOS Cloud 提供的页面。

其中 link 默认都使用 AVOS Cloud 提供的页面。如果您希望用户跳转到您的网站来验证邮箱或者修改密码,您可以下载我们默认页面的模板,修改后(比如添加您的 Logo,修改 CSS 等)上传到您的网站,并保存相应的 URL 到邮件设置菜单里:

20140109_link_setting.png

自定义链接后,邮件中的链接将使用您所定义的链接,用户点击也将跳转到您的网站。

在云代码中处理用户登录

使用云代码的 web hosting 功能,你可以在我们的云代码里托管一个网站。网站很经常需要处理的一个事情是用户登录和登出。

今天我们来介绍下怎么在云代码里的 web 主机里,使用 express.js 框架处理用户登录和登出。

首先,您需要安装最新版本的 avoscloud-code 命令行工具(必须升级到最新的 0.3.3-beta 版本):

sudo npm install -g avoscloud-code

关于命令行更多详细内容请参考这篇 博客

接下来,假设你创建了一个支持 web 主机功能的云代码项目,在 app.js 里添加下列代码:

var express = require('express');
var app = express();
var avosExpressCookieSession = require('avos-express-cookie-session');

// App 全局配置
app.set('views', 'cloud/views');   //设置模板目录
app.set('view engine', 'ejs');    // 设置 template 引擎
app.use(express.bodyParser());    // 读取请求 body 的中间件

//启用 cookie
app.use(express.cookieParser('Your Cookie Secure'));  
//使用 avos-express-cookie-session 记录登录信息到 cookie。
app.use(avosExpressCookieSession({ cookie: { maxAge: 3600000 }})); 

使用 express.cookieParser 中间件启用 cookie,注意传入一个 secret 用于 cookie 加密(必须)。然后使用 require('avos-express-cookie-session') 导入的 avosExpressCookieSession 创建一个 session 存储,它会自动将 AV.User 的登录信息记录到 cookie 里,用户每次访问会自动检查用户是否已经登录,如果已经登录,可以通过 AV.User.current() 获取当前登录用户。

avos-express-cookie-session' 支持的选项包括:

  • cookie 可选参数,设置 cookie 属性,例如 maxAge,secure 等。我们会强制将 httpOnly 和 signed 设置为 true。
  • fetchUser 是否自动 fetch 当前登录的 AV.User 对象。默认为 false。如果设置为 true,每个 HTTP 请求都将发起一次 AVOS Cloud API 调用来 fetch 用户对象。如果设置为 false,默认只可以访问 AV.User.current() 当前用户的 id 属性,您可以在必要的时候 fetch 整个用户。通常保持默认的 false 就可以。
  • key session 在 cookie 中存储的 key 名称,默认为 avos.sess

登录很简单:

app.get('/login', function(req, res) {
    // 渲染登录页面
    res.render('login.ejs');
});
// 点击登录页面的提交将出发下列函数
app.post('/login';, function(req, res) {
    AV.User.logIn(req.body.username, req.body.password).then(function() {
        //登录成功,avosExpressCookieSession 会自动将登录用户信息存储到 cookie
        //跳转到 profile 页面。
        console.log('signed in successfully: %j', AV.User.current());
        res.redirect('/profile');
    },function(error) {
        //登录失败,跳转到登录页面
        res.redirect('/login');
    });
});

//查看用户 profile 信息
app.get('/profile', function(req, res) {
    // 判断用户是否已经登录
    if (AV.User.current()) {
        // 如果已经登录,发送当前登录用户信息。
        res.send(AV.User.current());
    } else {
        // 没有登录,跳转到登录页面。
        res.redirect('/login');
    }
});

//调用此 url 来登出帐号
app.get('/logout', function(req, res) {
    //avosExpressCookieSession 将自动清除登录 cookie 信息
    AV.User.logOut();
    res.redirect('/profile');
});

登录页面大概是这样 login.ejs:

  
    
    
      
%MINIFYHTMLf327424dba296d39aa30334494e1b2cc1%

P.S. 本次除了命令行工具做了升级之外,我们的 avoscloud-sdk 也升级到了 0.2.8,解决在 node.js 环境下用户登录信息会保存在本地文件的 Bug。

注意 :express 框架的 express.session.MemoryStore 在我们云代码中是无法正常工作的,因为我们的云代码是多主机,多进程运行,因此内存型 session 是无法共享的,建议用 cookieSession 中间件。

在云代码中处理上传文件

我们的云代码提供了 Web Hosting 的功能,您可以在我们的云代码上完整托管一个网站。对于一个网站应用来说,处理上传文件是很常见的需求。比如用户上传头像,上传附件等等。

同样,我们使用 express.js 框架也是支持上传文件的。现在让我们看下怎么上传一张图标,比如应用的 icon 图片。

首先,您需要对云代码有基本的了解,推荐阅读下我们的 《云代码开发指南》 中的初始配置和 web hosting 章节。

其次,您需要配置 express 框架使用 bodyParser 这个中间件,它会解析表单里的文件,并将上传文件都放到请求对象的 files 对象里:

app.use(express.bodyParser());

接下来,编写一个 html 表单放到 public 目录:

这个表单很简单,只有一个字段 iconImage,用来上传一个文件到 /upload 路径下,使用 multipart 表单 POST 提交。

接下来,我们要编写下 /upload 的处理函数,require 受限制的 fs 模块读取上传文件:

var fs = require('fs');
app.post('/upload', function(req, res){
    var iconFile = req.files.iconImage;
    if(iconFile){
        fs.readFile(iconFile.path, function(err, data){
            if(err)
                return res.send("读取文件失败");
            var base64Data = data.toString('base64');
            var theFile = new AV.File(iconFile.name, {base64: base64Data});
            theFile.save().then(function(theFile){
                res.send("上传成功!");
            });
        });
    } else {
        res.send("请选择一个文件。");
    }
});

代码非常简单,从 req.files 中得到 iconImage 文件,使用 fs.readFile 来读取这个文件的内容,并创建一个 AV.File 对象存储到 AVOS Cloud 平台,告诉客户端保存成功。

请注意,这里的 fs 模块跟 Node.js 标准库的文件模块不同,它只能用于读取上传文件,除了 readFile 方法之外都不可用。

AVOS Cloud 本地调试云代码

云代码在 AVOS Cloud 里扮演了很重要的角色,你可以在云代码里定义保存前后的回调函数,可以发送推送消息,可以建立起一个网站等等。更多云代码的信息请参考 云代码开发文档

但是,云代码的调试也是相当繁琐,你需要添加 console.log 打印日志,提交代码到 git 仓库,然后部署到我们的平台,运行,查看运行结果和日志。这个过程太繁琐,也太痛苦了。用户的痛苦,就是我们没做好的地方。

因此,我们开发了一个本地调试的环境,让您可以在本地运行起云代码项目,并通过 curl 或者浏览器执行查看运行结果,调试代码。请遵循下列步骤开始本地运行云代码之旅:

  • 要在本地调试云代码,你需要安装 node.js 最新版本。
  • 运行命令: sudo npm install -g avoscloud-code 安装调试 SDK。
  • 在项目根目录运行 avoscloud,将启动本地调试服务器。
  • 访问 http://localhost:3000/ 即可访问到你的云主机代码,子路径按照你在 app.js 里配置的即可访问。
  • 测试函数:
curl -X POST -H 'Content-Type:application/json' 
    -d '{ "name": "dennis"}' 
    http://localhost:3000/avos/hello

其中 hello 是你通过 AV.Cloud.define 定义的函数名称。

  • 测试 beforeSave,afterSave,afterUpdate,beforeDelete/afterDelete 等:
curl -X POST -H 'Content-Type:application/json' 
     -d '{ "name": "dennis"}' 
     http://localhost:3000/avos/MyUser/beforeSave

其中 MyUser 是 className,beforeSave 指定调用 MyUser 定义的 beforeSave 函数,其他函数类似。

怎么样,是不是很方便呢? 因为是个全新的工具,特别欢迎您的使用和 反馈