开发

常见问题 Q&A

Q1 从哪个版本开始可以通过客户端描述表扩展百度私有能力,而不通过 extension 包内扩展?

答:在百度智能小程序 SDK 2.26.0 版本上及之后版本,宿主可将百度私有能力通过描述表的形式写入客户端,即可使用该能力;宿主扩展包内不用再维护。

Q2 扩展能力在 extension 中生效,升级成客户端描述表则不生效,为什么?

答:可从以下几个角度进行排查:

1、获取描述表是否成功?

在 inspect 控制台,调用 _naSwan.getAPIs() 获取描述表,若不为空则表示获取成功。然后检查新增能力的描述表是否包含在内。

2、描述表的 name 字段是否正确?

举例:描述表 name 为 “abc.testAPI”,但是宿主协议名称是 “bdabc”,那么框架侧校验不匹配,该能力无法成功挂载。具体参见规范-API命名空间需与宿主协议名保持一致

3、在不同客户端环境下,描述表的 invoke 字段应该如何填写?

请参考 invoke 调起规范

4、能力调用方式是否正确?

参见 Q3 通过客户端描述表扩展的 API,如何调用。

Q3 通过客户端描述表扩展的 API,如何调用?

答:部分宿主原来通过 extension 扩展的方法,为前端实现逻辑,或者复杂API逻辑,能力调用方式不唯一。

举例,原来通过 extension 扩展的能力调用方式可能如下:

1
2
3
4
5
6
7
8
9
// extension.js
method: {
add(a, b) {
return a+b;
}
}

// page.js
let sum = swan.host.add(1, 2); // sum: 3

但是修改为描述表之后,发现原来的调用方式无法调起能力。是因为维护在客户端描述表的能力,有统一的能力调用方式。如上述的能力调用方式会变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// description 同步能力
// 关于描述表字段的说明请参见联盟平台文档 https://ossunion.baidu.com/opensourcedocs/develop/frontend/extension/api_outter/
{
"name": "host.addSync",
"args": [
{"name": "a", "value": "number"},
{"name": "b", "value": "number"}
],
...
}

// page.js
let sum = swan.host.addSync({
a: 1,
b: 2
}); // sum: 3

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// description 异步能力
{
"name": "host.add",
"args": [
{"name": "a", "value": "number"},
{"name": "b", "value": "number"}
{"name": "cb", "value": "string"}
],
...
}

// page.js
swan.host.add({
a: 1,
b: 2,
success(res) {
console.log(res.data); // 3
}
});

Q4 boxjs 上的能力在小程序内能否调用?

答:boxjs 上的所有能力,为框架内部(包括 extension)使用,小程序开发者无法使用。