已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > 移动开发 > 安卓

标题: 通过云数据库和云函数,实现统计 APP 用户数量和检查更新功能

作者: @Ta

时间: 2022-08-22发布,2022-08-23修改

点击: 2628

通过云数据库和云函数,实现统计 APP 用户数量和检查更新功能

目录:背景 | 准备工作 | 创建云数据库 | 创建云函数 | 实战测试 | 总结


1. 背景

我正在尝试实现统计 APP 用户数量自动检查更新的功能。

具体过程为:

  1. 用户使用客户端时,客户端定期连接服务器,查询是否有新版本;
  2. 服务器收到请求后,记录当前时间戳和客户端的软件版本(用于统计用户数量);
  3. 服务器向客户端返回新版本信息(如最新版本号、更新内容、下载地址)。

尝试多种方案后,发现使用 uniCloud云数据库云函数云存储,实现起来最简洁高效。

现将实现步骤记录如下,供参考。


2. 准备工作

首先需要在 uniCloud 注册账号,并上传身份证照片实名认证。

注册完成后,在 服务空间列表 新建一个名为my-first-space的空间。我使用的是阿里云空间,因为可以免费使用。

还需要下载安装编辑器 HBuilder,用于编辑提交云函数和各种配置文件。下载安装后,需要在编辑器内登录 uniCloud 账号。


3. 创建云数据库

为了统计 APP 用户数量,需要通过云数据库创建数据一个数据表存储数据。

在浏览器打开之前新建的空间,在云数据库选项新建一个名为 myfirsttable数据表,然后编辑表结构,如图。

图中的代码如下:

{
  "bsonType": "object",
  "required": [],
  "permission": {
    "read": false,
    "create": true,
    "update": false,
    "delete": false,
    "count": false
  },
  "properties": {
    "_id": {
      "description": "ID,系统自动生成"
    },
    "mtimestamp": {
      "bsonType": "timestamp"
    },
    "mheader": {
      "bsonType": "object"
    }
  }
}

permission 控制了“前端非admin的访问权限”。因为之后我们需要通过云函数向数据表增添数据,所以 create 项设为 true。其它权限暂时不需要,所以设为 false

properties 中定义了表中有哪些字段:

  • _id 字段是系统自动生成的;

  • mtimestamp 字段用于保存时间戳,类型是 timestamp

  • mheader 字段用于保存客户端信息,类型是 object(JSON 对象)。

现在数据表已经准备就绪!如果你还希望存储其它数据,可查看 DB Schema 表结构 了解详细的编写方法。


4. 创建云函数

云函数用来保存客户端信息,以及向客户端返回版本更新信息。

创建云函数需要使用刚下载安装的 HBuilder 编辑器。

打开编辑器,选择 文件 - 新建 - 项目

然后选择 uni-app,项目名称输入 testproj,模板选择 默认模板,Vue 版本保持默认,勾选 启用uniCloud,然后点击 创建

然后展开项目文件夹 testproj,右击 uniCloud 文件夹,点击 关联云服务空间或项目...

在弹出的窗口中,勾选之前创建的空间,然后点击关联

关联成功后,再右击 uniCloud 内的 cloudfunctions 文件夹,新建云函数/云对象

在弹出的窗口中输入新建云函数的名字 testfunc,然后直接点击 创建 即可。注意这里不需要选择模板,也不需要修改模块或依赖。

然后打开 testproj/uniCloud-aliyun/cloudfunctions/testfunc/index.js,即可编写云函数代码,如图:

图中的代码为:

'use strict';
exports.main = async (event, context) => {

	// 获取数据库
	const dbJQL = uniCloud.databaseForJQL({
		event,
		context
	})

	// 获取数据表 myfirsttable,保存当前时间戳和客户端的 header 信息
	await dbJQL.collection('myfirsttable').add({
		mtimestamp: new Date().getTime(),
		mheader: event.headers
	})

	// 将新版本信息返回至客户端
	let latestVersionInfo = {
		"versionCode": 20220901,
		"whatsNew": "版本更新介绍"
	}
	return latestVersionInfo
};

(我不熟悉 JS,代码可能不太规范,欢迎指正。)

注意编辑器不会自动保存修改,需要手动按下 Ctrl+S 保存。 编辑完成并保存后,右击 testfunc 文件夹,点击 上传部署

等待几秒钟,直到控制台显示 [阿里云:my-first-space]云函数testfunc上传完成

现在,回到浏览器,打开 云函数/云对象,在 函数/对象列表 中,可以看到刚刚上传的云函数。点击编辑,在页面最下方 设置URL的PATH部分,设置为 /firstfunc

云函数已经配置完成!点击 复制链接,你就得到了一个 HTTPS 地址。客户端访问此地址,即可执行此云函数。


5. 实战测试

这里以开发 Android APP 为例,使用 OkHttp 库访问互联网,如图:

图中的代码为:

OkHttpClient().newCall(
    Request.Builder()
        .url("https://********************.bspapp.com/firstfunc")
        .addHeader("User-Agent", "CuteGIF/20220820")
        .build())
    .execute().body!!.string()

CuteGIF/20220820 是客户端的版本信息。注意 Android 应用不应在主线程进行网络请求,所以图中的代码是在新建的线程内执行的。

如我们所愿,返回了预设好的 JSON 对象:{"versionCode":20220901,"whatsNew":"版本更新介绍"}

同时,云数据库也如同我们的预期,记录了客户端每次请求的时间戳和版本:

日后如果想处理云数据库中的数据,可以通过 HBuilder 使用 JQL 语句增删改查,也可以将数据库以 JSON 或 CSV 格式导出后,使用其它软件处理分析。

另外,uniCloud 还提供云存储服务,可用于存储软件更新的安装包。这样,在客户端检查更新时,可返回安装包链接,实现软件自更新。


6. 总结

我并没有网络和数据库开发的经验,好在 uniCloud 的云服务确实简单易用,只花了很少的时间和代码,就实现了统计 APP 用户数量和自动检查更新的功能。


[隐藏样式|查看源码]


『回复列表(8|隐藏机器人聊天)』

1. @无名啊,已尝试,确实可用
(/@Ta/2022-08-23 00:18//)

2.

@tasy5kg,好家伙,tasy5kg 的小课堂开课啦,这文档教程真详实~

粗粗瞟一眼,

服务器收到请求后,记录当前时间戳和客户端的软件版本(用于统计用户数量);

这个,会不会被恶意刷数据,导致数据库被垃圾数据填得爆满?

(/@Ta/2022-08-23 00:23//)

3. @无名啊,这个服务是阿里云免费提供的,被攻击了应该也不会对我造成实质的损失
(/@Ta/2022-08-23 00:32//)

4.

@tasy5kg,嗯?数据库占用的空间,不计入你的免费空间,也不收费,是嘛?

(/@Ta/2022-08-23 00:35//)

5. @无名啊,通过 uniCloud 使用阿里云的云函数、云数据库和云存储目前完全不收费
(/@Ta/2022-08-23 00:37//)

6.

@tasy5kg,哇,这么多资源都免费,舒服坏了

我以为只有 10GB 的免费云存储

云函数能运行ffmpeg么?能运行几秒?

(/@Ta/2022-08-23 00:40//)

7. @无名啊,我不会 JavaScript,不知道怎么运行。

免费阿里云空间的限制:https://uniapp.dcloud.net.cn/uniCloud/price.html#aliyun

此文档中指的是单个空间的限制。单个用户最多申请 50 个空间,所以理论上还可以乘以 50。

但是…阿里云免费存储单个文件限制最大 100M…
(/@Ta/2022-08-23 01:35//)

8. 我在用,unicloud简直是白嫖者天堂,可以深挖,还有定时器,不过 最小粒度只能是小时,定时打卡神器
(/@Ta/2022-08-23 08:04//)

回复需要登录

9月19日 23:02 星期五

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1