月度归档:2013年10月

2013 年 10 月份第四周 AVOSCloud 更新

更新简述

在报告本周更新前,再次邀请大家参加我们的见面会,已经有不少朋友报名了,非常感谢大家对 AVOS Cloud 的支持。 报名链接

本周我们没有特别大的调整,主要改进集中在统计这块。

首先是,统计分析上线了自定义事件的分析 web 界面,可以查看自定义时间的次数、趋势、触发时间等等,一个截图如下:

stats_user_defined_event.png

其次,我们上线了在线参数配置的功能,你可以在统计配置的 自定义参数设置 菜单配置一些 key-value 的参数,然后在客户端就可以通过下列代码获取:

    // Android 为例
    AVAnalytics.updateOnlineConfig(context);
    String value = AVAnalytics.getConfigParams(context, "key");

发送策略设置还允许你在线关闭统计功能 (移动设备的下次启动将生效)。

Android 和 iOS 的 SDK 都发布了 1.4.2 版本,两者都添加了更多统计日志发送策略和自定义在线参数读取的功能,此外,Android 统计增加了 fragment 的支持,iOS 修复了一些 bug 并清理了头文件,完整的更新日志看下面。

云代码修复了无法从 JavaScript SDK 调用云代码函数的 bug,以及无法修改用户信息的 bug 等。并且云代码的部署菜单还添加了 部署环境清理 的功能,可以彻底删除当前部署的云代码,这将同时删除版本号和已经检出的代码,执行之后你需要重新部署云代码到测试环境和生产环境。

各模块详细的更新日志如下:

网站和云代码

  • 上线自定义事件的统计 web UI。
  • 修复云代码的若干 bug,并上线部署清理功能
  • 上线统计配置的自定义在线参数设置功能

iOS SDK 发布 1.4.2

  • 读取在线配置
  • 增加其他的发送策略
  • fix installation 存储过程中出现的警告和错误
  • 增加 updateOnlineConfig 的 block 版本
  • 当 query 的对象不存在时,返回空对象
  • fix push_at 存在的 bug
  • 清理 API 头文件

Android SDK 发布 1.4.2

  • 统计 SDK 增加 fragment 的支持
  • fix 离线状态下的 NPE 问题
  • 实现其他的发送策略
  • 添加获取和监听在线参数 API

AVOS Cloud 线下见面会

亲爱的 AVOS 用户,您好。

感谢开发者们在过去三个月中的支持和建议。AVOS Cloud 在这三个月中,因为大家的反馈和鼓励进行了诸多改善,也拥有了长足的进步。为此我们希望举办一些小型的聚会,希望能更加深入的与我们的用户进行交流,以便于更好地完善我们的服务。

我们的第一次聚会预计于 10 月末或 11 月初的某个周末在北京举办。介时,AVOS Cloud 的项目负责人和主要工程师都会在现场响应您对 AVOS Cloud 的每一个疑问或建议,也会有几位 AVOS Cloud 的开发者现身说法,向您介绍一些 AVOS Cloud 的使用经验。

我们期待您的光临。 点此报名

AVOS Cloud 团队

AVOS Cloud 正式发布统计 SDK

发布移动应用统计功能

每周更新时,本周我们正式对外发布统计 SDK,通过统计 API 您可以实现大多数友盟或者 Flurry 统计所能提供的功能。我们的优势在于为 AVOS Cloud 用
户提供了一站式的解决方案,您可以使用 AVOS Cloud 编写 App,存储数据和文件,发送推送消息,绑定 SNS 账号和分享,现在你还可以实现丰富的应用数据统计,
不用再到处去集成各式各样的 SDK,为编码和兼容等各种问题头痛。我们希望,AVOS Cloud 能真正地让移动开发更简单。

统计 SDK 已经集成在 SDK 客户端里,可以直接使用,下载请到 SDK 下载 页面,详细的开发指南链接如下:

我们还需要特意指出,统计功能是完全免费的,任何调用都不会计入 API 请求。

全新的统计 web 界面也已经上线 (如果无法看到请强制刷新页面),并且我们将 API 请求报表也独立出来,让我们看一些截图先睹为快:

SDK 全面更新 1.4.1

SDK 已经全面更新到 1.4.1 版本,除了统计功能之外,我们还针对 1.4.0 版本做了改进和优化,详细更新日志如下:

Android SDK 发布 1.4.1

  • 增加 android 的统计 SDK,具体使用方式请参阅 Android 统计 SDK 开发指南
  • 优化 push 服务器的获取方式,减少网络交互
  • 子类化 ParseUser.getCurrentUser,返回正确的子类化对象

iOS SDK 发布 1.4.1

云代码增加定时器功能

我们还为云代码添加了定时器的 API,可以让你定期的运行一些任务,最简单的,比如每隔 5 分钟打印日志:

AV.Cloud.setInterval("log_timer", 300, function(){
    console.log("Log in timer.");
});

更复杂的,你可以使用 crontab 风格的语法定义一个定时任务,例如每周一早上 8 点准时发送推送消息给用户:

AV.Cloud.cronJob("push_timer", "0 0 8 ? * MON", function(){
    AV.Push.send({
        channels: [ "Public" ],
        data: {
            alert: "Public message"
        }
    });
});

详细说明请看更新后的 云代码指南

升级本地调试 SDK 请执行命令 sudo npm install -g avoscloud-code

第三方登录支持

我们开始支持 github 账号注册和登陆 AVOS Cloud。微博和更多第三方账号支持仍然在开发中,敬请期待。

Android SDK 子类化指南

从 1.4.0 版本开始,我们为 Android SDK 添加了子类化支持,一个简单的指南如下。

子类化

AVOSCloud 希望设计成能让人尽快上手并使用。你可以通过 ParseObject.get 方法访问所有的数据。但是在很多现有成熟的代码中,子类化能带来更多优点,诸如简洁、可扩展性以及 IDE 提供的代码自动完成的支持等等。子类化不是必须的,你可以将下列代码转化:

AVObject shield = new AVObject("Armor");
shield.put("displayName", "Wooden Shield");
shield.put("fireproof", false);
shield.put("rupees", 50);

成这样:

Armor shield = new Armor();
shield.setDisplayName("Wooden Shield");
shield.setFireproof(false);
shield.setRupees(50);

子类化 ParseObject

创建一个 ParseObject 的子类很简单:

  • 首先声明一个子类继承自 Parseobject。
  • 添加 @AVClassName 注解。它的值必须是一个字符串,也就是你过去传入 ParseObject 构造函数的类名。这样以来,后续就不需要再在代码中出现这个字符串类名。
  • 确保你的子类有一个 public 的默认(参数个数为 0)的构造函数。切记不要在构造函数里修改任何 ParseObject 的字段。
  • 在你的应用初始化的地方,在调用 AVOSCloud.initialize() 之前注册子类 AVObject.registerSubclass(YourClass.class)

下列代码成功实现并注册了 ParseObject 的子类 Armor:

// Armor.java
import com.avos.avoscloud.AVClassName;
import com.avos.avoscloud.AVObject;

@AVClassName("Armor")
public class Armor extends AVObject {
}

// App.java
import com.avos.avoscloud.AVOSCloud;
import android.app.Application;

public class App extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

    AVObject.registerSubclass(Armor.class);
    AVOSCloud.initialize(this, "{{appid}}", "{{appkey}}");
  }
}

访问器,修改器和方法

添加方法到 ParseObject 的子类有助于封装类的逻辑。你可以将所有跟子类有关的逻辑放到一个地方,而不是分成多个类来分别处理商业逻辑和存储/转换逻辑。

你可以很容易地添加访问器和修改器到你的 ParseObject 子类。像平常那样声明字段的 getter 和 setter 方法,但是通过 Parseobject 的 get 和 put 方法来实现它们。下面是这个例子为 Armor 类创建了一个 displayName 的字段:

// Armor.java
@AVClassName("Armor")
public class Armor extends AVObject {
  public String getDisplayName() {
    return getString("displayName");
  }
  public void setDisplayName(String value) {
    put("displayName", value);
  }
}

现在你就可以使用 armor.getDisplayName() 方法来访问 displayName 字段,并通过 armor.setDisplayName("Wooden Sword") 来修改它。这样就允许你的 IDE 提供代码自动完成功能,并且可以在编译时发现到类型错误。

各种数据类型的访问器和修改器都可以这样被定义,使用各种 get() 方法的变种,例如 getInt(), getAVFile(), 或者 getMap()。

如果你不仅需要一个简单的访问器,而是有更复杂的逻辑,你可以实现自己的方法,例如:

public void takeDamage(int amount) {
  // 递减 armor 的 durability 字段,并判断是否应该设置 broken 状态
  increment("durability", -amount);
  if (getDurability() < 0) {
    setBroken(true);
  }
}

初始化子类

你可以使用你自定义的构造函数来创建你的子类对象。你的子类必须定义一个公开的默认构造函数,并且不修改任何父类 ParseObject 中的字段,这个默认构造函数将会被 SDK 使用来创建子类的强类型的对象。

要创建一个到现有对象的引用,可以使用 AVObject.createWithoutData():

Armor armorReference = AVObject.createWithoutData(Armor.class, armor.getObjectId());

查询

你可以通过 AVObject.getQuery() 或者 AVQuery.getQuery 的静态方法获取特定的子类的查询对象。下面的例子就查询了用户能够购买的盔甲 (Armor) 列表:

AVQuery<Armor> query = AVObject.getQuery(Armor.class);
//rupees 是游戏货币
query.whereLessThanOrEqualTo("rupees", AVUser.getCurrentUser().get("rupees"));
query.findInBackground(new FindCallback<Armor>() {
  @Override
  public void done(List<Armor> results, AVException e) {
    for (Armor a : results) {
      // ...
    }
  }
});

ParseUser 的子类化

ParseUser 作为 ParseObject 的子类,同样允许子类化,你可以定义自己的 User 对象,不过比起 ParseObject 子类化会更简单一些,只要继承 ParseUser 就可以了:

import com.avos.avoscloud.AVObject;
import com.avos.avoscloud.AVUser;

public class MyUser extends AVUser {
    public void setNickName(String name) {
    this.put("nickName", name);
    }

    public String getNickName() {
    return this.getString("nickName");
    }
}

不需要添加 @ParseClassname 注解,所有 ParseUser 的子类的类名都是内建的 _User。同样也不需要注册 MyUser。

注册跟普通的 ParseUser 对象没有什么不同,但是登陆如果希望返回自定义的子类,必须这样:

MyUser cloudUser = AVUser.logIn(username, password,
            MyUser.class);

2013 年 10 月第二周 AVOSCloud 更新

在度过了国庆假期之后,我们迎来了 AVOS Cloud 的本周更新,在国庆期间积蓄了力量之后,我们又可以发一个大招了。这次最大的改进仍然集中在客户端 SDK。

首先,iOS SDK 开始支持增量更新和子类化,并修复了不少 bug,并且缩小了整个 iOS SDK 的大小。其次,Android SDK 修复了 1.3.5 发布后发现的一些 bug,并实现了子类化。最后,Javascript SDK 也做了改进,增强了文件 API,更新了 API 文档。

关于子类化,以 Android 为例子,可以参考 开发指南里的例子 :

// Armor.java
import com.avos.avoscloud.AVClassName;
import com.avos.avoscloud.AVObject;

@AVClassName("Armor")
public class Armor extends AVObject {
}

// App.java
import com.avos.avoscloud.AVOSCloud;
import android.app.Application;

public class App extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

    AVObject.registerSubclass(Armor.class);
    AVOSCloud.initialize(this, "{{appid}}", "{{appkey}}");
  }
}

更多关于子类化的信息请参考我们的 开发文档 。我们全面更新了 开发文档 以适配最新的 SDK。SDK 下载请到 这里

我们还为云代码发布了一个本地调试的工具,具体见 这篇博客 ,欢迎尝试。

完整的更新日志如下:

iOS SDK 发布 1.4.0

  • 全面优化增量更新,仅当数据有变化时才真正保存
  • 解决 addArrayObject 的问题
  • 解决子类化 setter 和 getter crash 的问题
  • 解决 user session token 引起的对象保存问题
  • 增加 json string dictionary 功能,允许 AVObject 导出 dictionary 或者从 dictionary 构造
  • 解决 query 中出现 role 的问题
  • 解决 query 中 getFirstObject 和 getObjectWithId 的 include 问题
  • 增加 deleteInBackground for AVFile
  • 批量删除 query 结果中的对象
  • 优化编译方法,大幅减小 SDK 的体积

Android SDK 发布 1.4.0

  • 实现 ParseObject 和 ParseUser 的子类化,具体请参考 android 开发指南。
  • 增加 ParseObject.destroyAll 和 ParseQuery.destroyAll 方法用于批量删除。
  • 修复 1.3.5 版本推送丢失 title 的 bug。
  • 修复推送无法回调不同 package 的 Activity 的 bug。
  • 修复网络异常没有返回给用户的 bug。

JavaScript SDK 发布 0.2.3

  • 增强 AV.File 类,添加 metaData() 方法用于获取元数据,size() 和 ownerId() 分别用于获取大小和上传者 id。
  • 添加静态方法 AV.Object.destroyAll(objects) 用于批量删除对象,AV.Query 也添加方法 destroyAll 用于删除查询出来的所有对象。
  • 增加方法 AV.Cloud.afterUpdate 用于注册 after update 处理器,更新对象后回调处理函数。
  • 增强云代码 API 文档。
  • 添加创建已有对象的新方法 AV.Object.createWithoutData(name, id)

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 函数,其他函数类似。

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