更多常见问题请点击这里。
9 月--10 月常见问题
1.【云引擎】云函数超时时间多久,超时处理方案是什么?
云函数超时时间为 15 秒,如果超过阈值,客户端将收到 HTTP status code 为 503 的响应,body 为 The request timed out on the server。
我们建议将代码中的任务转化为异步队列处理,以优化运行时间,避免云函数或定时任务发生超时。
例如:
- 在存储服务中创建一个队列表,包含 status 列;
- 接到任务后,向队列表保存一条记录,status 值设置为处理中,然后将请求结束掉,将队列对象的 id 发给客户端。
- 当业务处理完毕,根据处理结果更新刚才的队列对象状态,将 status 字段设置为 完成 或者 失败;
- 在任何时候,在控制台通过队列 id 可以获取某个任务的执行结果,判断任务状态。
详情参考:超时的处理方案文档。
2.【数据存储】Leancloud 有没有专门针对字节跳动小程序的 SDK,是否支持一键登录?
JavaScript SDK 支持在微信、支付宝、百度与字节小程序平台使用,字节小程序需要使用 字节的 adapters。
所有小程序平台的一键登陆都可以用 loginWithMiniApp 接口来实现。
3.【控制台】Leancloud 的 class 可以选择不同的字段,直接生成 excel 吗?
如果查询结果匹配的数据量小于 1000 条,可以直接点数据表格右上角的下载按钮存为 CSV 或者 JSON,如图所示:
4.【SDK 更新】Swift SDK 在 Xcode 13 build 会报错,如何解决。
Xcode 更新到 13 时,Swift SDK 编译会报错 Cannot convert value of type 'LCValueResult<LCUser>' to expected argument type 'LCValueResult<User>'
。这个问题已经在 v17.9.2 版本中修复,可以升级至最新版 Swift SDK 来避免这个问题。
在项目根目录下执行下列任意命令,更新 SDK 版本:
$ pod update
8 月常见问题
1. 【即时通信】查询会话列表,返回的最新一条会话 LastMessage 为什么没有值?
对于一个聊天应用,一个典型的需求是在对话的列表界面显示最后一条消息,默认情况下,针对对话的查询结果是不带最后一条消息的,需要单独打开相关选项:
// 例如在 JavaScript SDK 中,withLastMessagesRefreshed 方法可以指定让查询结果带上最后一条消息
query.withLastMessagesRefreshed(true);
需要注意的是,这个选项真正的意义是「刷新对话的最后一条消息」,这意味着由于 SDK 缓存机制的存在,将这个选项设置为 false 查询得到的对话也还是有可能会存在最后一条消息的。
2. 【云引擎】控制台的 API 访问日志只能保存 7 天,如何延长保存时间?
我们平台提供的 API 访问日志仅保存 7 天,无法扩展。可以通过其他方式自行保存一份日志。
一般业务需要的用户活动日志,对应行为大概是:
对于这些操作要保存更长时间,需要使用 云引擎配合 hook 来将用户行为日志记录到第三方,大概流程是:
- 对需要保存的 Class 配置 hook( 比如 Post 这个 Class 的BeforeSave 或
AfterSave),在控制台数据存储中操作。
- hook 会在保存时发一个 http 请求到云引擎(云引擎实例需要单独购买)。
- 开发者在云引擎中实现 hook 对应的代码,在代码中将用户的信息拿出来(云引擎实例需要单独购买)。
- 云引擎中将用户行为日志保存到第三方,可以是第三方日志服务,开发者也可以在 LeanCloud 购买 ElasticSearch 实例来保存用户行为日志。
7 月常见问题
1. 【消息推送】有一些 iOS 设备收不到推送,到控制台查看推送记录,发现 invalidTokens 的数量大于 0,是怎么回事?
invalidTokens 的数量由以下几部分组成:
- 选择的设备与选择的证书不匹配时,会增加 invalidTokens 的数量,例如使用开发证书给生产证书的设备推送。
- 目标设备移除或重装了对应的 App。
-
保存 DeviceToken 时没有上传 team ID 也会报错 invalidTokens。
- 使用 Token Authentication 的方式在控制台上传证书时,TeamID 或者 Topics 输入错误(Topics 是
App 的 Bundle ID)也会报错 invalidTokens。检查相关配置可参考:iOS 推送设置指南。
2. 【云引擎】云引擎的启动限制时间是多久?
应用在启动时,云引擎的管理程序会每秒去检查应用是否启动成功,如果超过启动时间限制仍未启动成功,即认为启动失败。 启动时间限制默认为 30 秒,如需延长或缩短,可以在 leanengine.yaml 文件中指定 startupTimeout
,可设置范围为 15 – 120 秒。
6 月常见问题
1. 【数据存储】如何限制文件上传类型?
在控制台>应用>数据存储>文件>设置中,点击修改按钮,输入允许的 MIME 类型,即可更改文件上传策略。
- 支持白名单。如 image/jpeg;image/png 表示只允许上传 jpeg 和 png 类型的图片。
- 支持黑名单。如 !text/html;text/plain 表示禁止上传 HTML 文件或纯文本文件。
- 支持通配符。如 image/* 表示只允许上传图片类型。
- 留空表示允许任意类型。
2. 【云引擎】执行 HOOK 函数实现定期批量上传的功能,瞬时的请求频率很高,有什么好的实现方案吗?
类似的需求往往会产生很高的瞬时请求频率,这样可能导致数据库的压力,从而影响到终端用户的访问。通常建议在脚本中控制请求的频率,平滑请求,以避免对数据库产生压力。
更好的方案是使用 LeanCloud 提供的 云队列(Cloud Queue),它不仅可以平滑请求,还有重试机制。
5 月常见问题
1.【数据存储】批量删除使用 deleteAll,一次最多能删除多少个数据,一次 deleteAll 操作是计为一次 API 操作吗?
我们对每一批次中所包含的操作数量(requests 数组中的元素个数)暂不设限,但考虑到云端对每次请求的 body 内容大小有 20 MB 的限制,因此建议将每一批次的操作数量控制在 100 以内。
调用一次 deleteAll
删除 100 条记录,算一次 API 操作。
但是调用一次 saveAll
或 fetchAll
来保存或获取 array 里面 100 个 对象,算 100 次 API 请求。
可以参考 API 调用次数的计算 的文档。
2.【短信】短信签名审核被拒绝,应该如何申请签名,证明签名的资质文件是什么?
应运营商的审核要求,创建签名需要提交相应的证明材料。比如:
注意,未上架的应用,以应用名申请签名,以应用商店后台开发者管理截图作为资质文件,运营商审核人员不会通过。 如果该应用有同名的小程序、公众号、网站,或者为应用名称注册了商标,可以提交相应的资质文件申请签名。 否则,可以改用公司名或简称作为签名。
4 月常见问题
1. 【数据存储】文件存储支持访问控制吗?
由于知道文件 URL 的任何用户都可以访问文件,因此需要为 _File
Class 和引用文件的 Class 设置合适的 Class 权限和 ACL,限制未授权用户获取到文件 URL。
如果希望能够更精细地控制文件访问权限,比如在一定时间后重新检查是否有权访问文件,建议使用支持访问权限控制的第三方文件存储服务商,然后直接在 LeanCloud 文件服务中保存一个外部的 URL。注意 _File
表是不可变的,这意味着已经写入的 URL 不能修改。但通常支持访问权限控制的文件存储服务商,实现访问权限的方式都是在现有的 URL,比如 <https://file.example.com/some-url
> 后额外传入一个 token 参数(这个 token 通常有时效性),比如 <https://file.example.com/some-url?token=xxxxxx。
>所以客户端需要访问文件时,可以先从 LCFile
获取 url
属性后,再加上这个 token 参数,拼成最终的 URL 下载文件。token
的获取需要自行在云引擎或自己的服务器上部署一个简单的生成访问 token
的 API 服务,客户端访问该 API 服务获取 token
。
2. 【数据存储】如何修改文件存储中已有的文件?
文件存储对应的 _File
Class 是不可变数据,文件内容和相关元数据一经写入就无法修改,只能删除后重新上传或重新通过 URL 构建。在使用外部文件(通过 URL 构建文件)的情况下,如果有频繁修改文件或相关元数据的需求,可以考虑如下方案:
自己实现一个存储外部文件相关信息的 Class,比如 ExternalFile
。在引用该文件的对象中设置 Pointer 字段,指向 ExternalFile
。注意,这种情况下,查询包含文件的对象时,如果希望同时获取文件信息,需要 include 相应字段(使用内置 _File
Class 的情况下会自动 include,不用另外指定)。
在需要引用文件的对象中,直接使用字符串类型保存 URL。这种情况下文件相关功能都需要自行实现。如果想要保存这个文件的相关元信息,还需要另外设计。比如在对象的其他字段上保存,或者将相应字段的类型从字符串改成 object,同时保存 URL 和元信息。注意,如此设计会导致应用的文件信息分散在需要用到文件的各个 Class 中,要对整个应用的文件进行批量查询和批量处理会比较麻烦。
3 月常见问题
1. 【即时通信】为什么无法收到离线消息推送,该怎么排查?
检查方法总结如下:
具体可以参考 文档。
2. 【云引擎】怎么上传整个文件目录下的文件到云端?
可以使用 命令行工具 CLI 上传:
使用 upload
命令既可以上传单个文件,也可以批量上传一个目录下(包括子目录)下的所有文件到 LeanCloud 云端。
$ lean upload public/index.html
Uploads /Users/dennis/programming/avos/new_app/public/index.html successfully at: http://ac-7104en0u.qiniudn.com/f9e13e69-10a2-1742-5e5a-8e71de75b9fc.html
文件上传成功后会自动生成在 LeanCloud 云端的 URL,即上例中 successfully at:
之后的信息。
上传 images 目录下的所有文件:
$ lean upload images/
3. 【云引擎】用户反馈模块下线以后还能获取用户反馈数据吗?
「用户反馈」模块已经下线,新版控制台不再提供用户反馈页面。
一段时间内可以通过 用户反馈组件 API 接口获取历史记录。
用户反馈组件 API 后续也会下线,以后该接口也不再支持获取用户的反馈数据。建议尽快使用 数据存储服务 来替代用户反馈功能。
2 月常见问题
1.【推送】_Installation 中的 valid 字段指的是什么,valid 为什么是 false?
Valid 表示当前这条设备记录是否有效,是 false 表示这条记录失效了,比如长时间未使用或者使用 LeanCloud 平台推送但是推送设备并未登录。
比如 Android 设备未执行以下代码打开「启动推送服务」,valid 的值就会一直是 false。
// 设置默认打开的 Activity
PushService.setDefaultPushCallback(this, PushDemo.class);
如果某个设备不想收到推送提醒,也可以将 _Installation
表中相应安装对象的 valid
字段修改为 false
。
2. 【云引擎】hook 函数算 API 请求次数吗,afterUpdate 执行一次算 1 次请求次数吗?
AfterUpdate 是在云引擎内执行的,执行 afetrUpdate 不算 API 请求,自然也不计入 API 请求数。如果 afterUpdate 里发起了 API 请求,那么照常计算 API 请求数(和客户端请求 API 一样)。
3. 【云引擎】前端如何调用云引擎分组中的cloud.js?
2020 年 10 月份云引擎已经在所有分组上支持了云函数,如果您的应用的不同分组上的云函数不存在重复定义的,客户端直接调用云函数,在云引擎这边能自动根据名称路由到正确的分组(对客户端来说是透明的)。
同样,云函数不存在重复定义的前提下,如果您需要在某个云引擎实例内调用其他分组上的云函数,那么传入 remote: true
即可,详见文档。
1 月常见问题
1.【云引擎】定时任务有超时限制吗?
我们建议将代码中的任务转化为异步队列处理,以优化运行时间,避免云函数或定时任务发生超时。
例如:
在存储服务中创建一个队列表,包含 status
列;
接到任务后,向队列表保存一条记录,status
值设置为 处理中
,然后将请求结束掉,将队列对象的 id 发给客户端(旧版本的 SDK 使用 response.success(id)
):
return new Promise((resolve, reject) => {
resolve(id);
});
当业务处理完毕,根据处理结果更新刚才的队列对象状态,将 status
字段设置为 完成
或者 失败
;
在任何时候,在控制台通过队列 id
可以获取某个任务的执行结果,判断任务状态。
详情参考文档: 超时的处理方案。
2.【即时通信】怎么才能取到超过 100 条未读的真实未读条数?
目前公有云不支持单个会话里单个成员的未读数超过 100。
通常来说,客户端的 UI 界面也不需要精确展示超过 100 的未读数,一般的处理方式是显示 99+ 。
然后消息查询接口是可以根据消息 ID 以及消息时间戳的组合条件查询所有历史消息的,所以它能支持 UI 展示一个会话里的所有消息,不会存在遗漏消息的情况。
详细用法参考文档:聊天记录查询。
3.【数据存储】日志表如何设计。比如某个时间点线程和访问量突然增加,想知道是谁访问的,这种情况应该怎么设计日志表?
日志表是指用来存储只增不减不改的数据(以日志为代表),并不仅用来保存访问日志。日志表的使用和普通表一样,都是通过我们的 SDK 来提交 AVObject。但是日志表与普通表还有一些差异:
日志表不能实时展示,在控制台页无法看到当天的日志表数据(延后一天集中导入);
日志表只能通过离线数据分析进行查询,不能通过普通的 AVQuery 查询。
如果想知道访问量的增减情况,光用日志表可能解决不了这个问题,因为一般不会在客户端同时提交两条数据:一条是正常的数据,一条是日志数据(记录你想要记录的客户端信息)。一般这种情况下,需要自己在云引擎里进行记录,并调用 API 将访问信息保存到日志表。
对于访问量的统计,可以看一下控制台的用量统计,那里可以找到什么平台对什么 Class 的什么操作请求量比较大,然后可以结合业务代码判断一下是什么原因导致的。