Appearance
🔌 客户端 API 列表(写作平台)
WARNING
假设你已了解 📖 实现方案 章节内容,如果你刚刚接手开发,那这不是你最佳的观光点。
API 命名空间
所有 API 约定均使用 DSBridge-Android/DSBridge-IOS 作为调用函数和响应的功能。
在当前实现,没有定义 API 资源的情况下,不使用命名空间功能,将 API 添加到 DWebView 实例时,命名空间参数为 null
Android
java
dwebView.addJavascriptObject(new H5Api(), null);iOS
object-c
[dwebview addJavascriptObject:[[H5Api alloc] init] namespace:nil];为提高代码语义化,H5Api 类中实现的函数名 以具名行为的方式命名。
如业务 content 业务名称约定为 getContent; 响应/处理方法以 on 为前缀,如分享按钮 onShare
钩子/生命周期
onWebViewCreated
onWebViewCreated 生命周期,网页代码开始运行,响应网页,以便网页运行后续续业务。
示例
java
@JavascriptInterface
public void onWebViewCreated(Object msg, CompletionHandler<Boolean> handler) {
handler.complete(true);
}onWebViewSuccess
暂定在 onWebViewCreated 后调用,该周期暂无对应的逻辑。由网页告知客户端。
java
@JavascriptInterface
public void onWebViewSuccess(Object msg, CompletionHandler<Boolean> handler) {
handler.complete(true);
}onWebViewError
网页代码运行错误,调起客户端错误页面
java
@JavascriptInterface
public void onWebViewError(Object msg, CompletionHandler<Boolean> handler) {
handler.complete(true);
}notifyWebViewUpdated
notifyWebViewUpdated 生命周期,有配置或数据更新时,通知网页。调用 callHandler 函数,传入 updateObj JSONObject 参数。
如改变字体大小,实际上是修改 config 中的 fontSize,那么客户端调用该函数,并传入 { "name": "config" }。
网页接收到回调后主动调取 onConfig ,获取最新的配置,并更新 UI。
参数
updateObj
json
{
"name": "user",
"author_id" : 1,// author_id 是 internal_user_id v8.1.7 订阅功能
}| name | 类型 | 备注 |
|---|---|---|
config | String | 全局应用配置 |
content | String | 文章内容更新,常用于用户登录后更新文章内容 |
user | String | 用户信息 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| retValue | true false | Boolean | retValue 表示 updated 的响应结果 |
示例
java
JSONObject updateObj = new JSONObject();
try {
updateObj.put("name", "config");
} catch (JSONException e) {
e.printStackTrace();
}
dWebView.callHandler("notifyWebViewUpdated", new Object[]{ updateObj }, new OnReturnValue<Boolean>() {
@Override
public void onValue(Boolean retValue) {
showToast(retValue);
}
});事件
notifyEvent
event 事件,在 UI 或者网络耗时操作时候调用,通知网页
参数
eventName
| eventName | 类型 | 备注 |
|---|---|---|
clickLikeBtnSuccess | String | 成功点击喜欢按钮 |
示例
java
String eventName = "clickLikeBtnSuccess";
dWebView.callHandler("notifyEvent", new Object[]{ eventName }, new OnReturnValue<Boolean>() {
@Override
public void onValue(Boolean retValue) {
showToast(retValue);
}
});onWebViewClick
网页点击事件,传达至客户端
参数
clickName
| clickName | 类型 | 备注 |
|---|---|---|
likes | String | 点击了喜欢作品 |
shareWechat | String | 点击了分享到微信按钮 |
shareMoments | String | 点击了分享到微信朋友圈按钮 |
sharePoster | String | 点击了分享海报按钮 |
topicHomePage | String | 点击了“去参加按钮”,进入主题详情页 |
示例
java
@JavascriptInterface
public void onWebViewClick(Object clickName, CompletionHandler<Boolean> handler) {
if(clickName === "shareWechat")
{
//do something
}
handler.complete(true);
}业务方法
WARNING
为提高客户端代码语义化,H5Api 类中实现的函数名 以具名行为的方式命名。如业务 user 业务方法应实现为 getUser
getPostsContent
返回作品详情数据
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 4 | String |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | 作品详情 | JSON Object |
作品详情(点击展开)
json
{
"content": {
"id": 988723,
"type": "image", //text
"title": "闪光的小精灵:标题不省略,标题显示完全,显示完全显示完全",
"content": "我是一个喜欢阅读的孩子,别人的父母都是为孩子不阅读挖空心思地想办法,我却是被父母时常吆喝着放下手里的书,理由是让眼睛做短暂的休息。我经常想,书里有那么多好玩的故事,有那么多有趣事情,有那么多有血有肉的人物,甚至有许多我不曾到过的地方,为什么他们不喜欢读书,可能是他们没有体会到书的“浩瀚、博大与迷人吧”。\r\n 看到媒体有关“阅读中的真善美”的征文,我脑海里最先想到的是书。书里面那些善事、善美的儿童故事人物都活了起来,犹如童话故事里的精灵,一个个跃跃欲试,争着抢着要跳到我的笔下,以铅字的形式展现给全国的读者,好让广大读者了解他们,尤其是小朋友喜欢他们。 《草房子》里的桑桑应该是其中的一个,别看桑桑只是一个小孩子,他身上有乡村景色一般的质朴,有河水一眼见底的纯净,没有受到太多环境的污染,保持自己那份童趣纯真。桑桑有时会顽皮,有时会做错事,有时甚至会与同学打架,这是成长自然,也是孩子该有的天性,但这并不影响他的善良与心灵的美好。 在小说中桑桑做过许多善良的事,他默默的关心纸月。善良可爱的纸月也是个苦命的孩子,她与奶奶相依为命,为了躲避当地孩子的欺负,她转学到油麻地小学,结果还是有同学对她不善,好在有桑桑的关心照顾。可好景不长,纸月因家庭原因离开了心爱的校园,让人看到了生活中可惜无奈的一面。",
"user_id": 1,
"author": "闵诗睿",
"phone": "13800138000",
"school": "东城第一中学",
"group": "初中组",
"is_marked": 0,
"status": 1,
"advisor": "闵保华",
"province": "陕西省",
"city": "西安市",
"district": "灞桥区",
"created_at": "2022-02-22 17:17:21",
"updated_at": "2022-02-22 17:17:21",
"like_count": 100001,
"like_state": false,
"reviews": "每个人都活在这平凡的世界中,有人却不甘平凡,走出不凡的人生曲线。\r\n -------------------- \r\n 每个人都活在这平凡的世界中,有人却不甘平凡,走出不凡的人生曲线。",
"writing_theme_id": 1,
"code": "",
"status_cn": "已入围",
"writing_images": [
{
"id": 1,
"path": "http://images.infzm.com/cms/medias/image/22/03/02/GUwG7LS2EeZHvgh5H7oMTcDs9vNWteuMSJL8dQVK.jpeg",
"type": "image",
"width": 11,
"height": 11,
},
{
"id": 2,
"path": "http://images.infzm.com/cms/medias/image/22/03/02/zZaMuS6qINEK3OklXEhnhEXhoKy8Q0aks7HhcqvH.jpeg",
"type": "image",
"width": 11,
"height": 11,
}],
"writing_theme": {
"id": 1,
"title": "怎样读懂一本经典,是让我们重新认识经典作品"
}
},
"user": {
"id": 1,
"username": "南周用户",
"loginname": "1599999999202111010423562021110104331820211101043535",
"headimgurl": "http://images.infzm.com/users/1/u1.jpg",
"member_type": 2
}
}示例
java
@JavascriptInterface
public void getPostsContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(this.content);
}onShare
点击分享按钮
参数
shareType
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| shareType | wechat timeline poster | String | 微信好友、微信朋友圈、海报 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true false | Boolean |
java
@JavascriptInterface
public void onShare(Object shareType, CompletionHandler<Boolean> handler) {
String shareType = (String) type;
/*
share code in here
*/
handler.complete(true);
}getUser
用户信息,返回数据结构到网页
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | user | JSONObject | 见数据结构 |
WARNING
用户未登录时,返回空的数据结构,如下:
json
{
}示例
java
@JavascriptInterface
public void getUser(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject user = new JSONObject();
user.put("username", "Mather");
handler.complete(content);
}onContentMounted
网页获取正文内容并渲染到页面后触发的回调,客户端可监听 onContentMounted 即可得知内容已显示在页面上。
参数
ContentMountedObject
json
{
}示例
java
@JavascriptInterface
public void onContentMounted(Object ContentMountedObject, CompletionHandler<Boolean> handler) throws JSONException {
JSONObject _ContentMountedObject = (JSONObject) ContentMountedObject;
handler.complete(true);
}onDevice
设备信息、客户端版本
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | device | JSONObject | 见数据结构 |
json
{
"platform" : "android", //ios
"client_version" : "6.7.0"
}示例
java
@JavascriptInterface
public void onDevice(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject device = new JSONObject();
device.put("platform", "android");
handler.complete(device);
}onConfig
用户自定义,系统设置。包含字体样式、深色模式(夜间模式)、页面顶部、底部预留高度。
前端初次调用该方法,返默认的数据结构。内容更新后客户端需要调用 notifyWebViewUpdated API,并传入 { "name": "config" } 参数,通知前端重新调用。
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | config | JSONObject | 见数据结构 |
json
{
"fontStyle" : "system", //系统默认 system | 宋体 simsun
"nightMode" : false, //夜间模式 true | 浅色模式 false
"navAndStatusBarHeight": "64", //64 个单位,网页内容顶部预留的高度
"bottomBarHeight": "32" //32 个单位,网页内容底部预留的高度
}示例
java
@JavascriptInterface
public void onConfig(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject config = new JSONObject();
config.put("fontSize", "normal");
handler.complete(config);
}