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 | 用户信息 |
videoPause | String | 视频暂停播放,包含视频 ID |
audioPlay | String | 音频开始播放,额外参数是 index: 0,代表页面中的第几个音频 |
audioPause | String | 音频暂停播放,额外参数是 index: 0,代表页面中的第几个音频 |
comment | String | 评论数据有更新,可调用 getComments API 获取当前页评论 |
reward | String | 打赏数据有更新 |
nextContent | String | 下一讲、下一篇内容有更新 |
scrollToComment | String | 页面滚动到评论区 |
pk | String | 观点PK 模块有更新 |
vote | String | 投票模块有更新 |
subAuthor | String | 订阅作者成功 |
unSubAuthor | String | 取消订阅作者成功 |
followTopic | String | 关注话题成功 |
unFollowTopic | String | 取消关注话题成功 |
like | String | 点赞评论成功,额外参数是 comment_id: 1234 |
unlike | String | 取消点赞评论成功,额外参数是 comment_id: 1234 |
cleanAllAudioStatus | String | 修改文中所有音频状态为暂停 |
showForumRelation | String | 普通文章显示话题讨论 |
diary-like | String | 日记点赞,成功事件,额外参数是 comment_id: 1234 |
courseFavorite | String | 单课收藏,成功事件 |
unCourseFavorite | String | 单课取消收藏,成功事件 |
markSuccess | String | 成功添加划线,额外参数是id type sources |
markDelete | String | 成功删除划线,额外参数是id type sources |
noteCancel | String | 取消写笔记(创建新笔记),额外参数是id type text sources |
noteSuccess | String | 成功保存、修改笔记,额外参数是id type note text updated_at sources |
noteDelete | String | 成功删除笔记 ,额外参数是id type sources |
addNoteFromLine | String | 划线基础上添加了笔记,将划线转为笔记,,额外参数是id type note updated_at sources |
markCreateFail | String | 创建划线失败,额外参数是id type sources |
noteCreateFail | String | 创建笔记失败 ,额外参数是id type sources |
markDeleteFail | String | 删除划线失败 ,额外参数是id type sources |
noteDeleteFail | String | 删除笔记失败 ,额外参数是id type sources |
notefromLineFail | String | 创建划线笔记失败 ,额外参数是id type sources |
switchAudio | 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 | 类型 | 备注 |
|---|---|---|
imageViewerOpened | String | 打开图片查看器 |
imageViewerClosed | String | 关闭图片查看器 |
shareTimelineSuccess | String | 成功分享朋友圈 |
shareWechatSuccess | String | 成功分享微信好友 |
shareWeiboSuccess | String | 成功分享微博 |
shareQQSuccess | String | 成功分享QQ |
commentOpened | String | 打开评论页 |
commentClosed | String | 关闭评论页 |
rewardSuccess | String | 打赏成功 |
videoPause | String | 视频暂停播放 |
videoPlay | String | 视频开始播放 |
videoFullScreen | String | 视频全屏显示 |
videoExitFullScreen | String | 视频退出全屏显示 |
videoClosed | String | 关闭视频浮窗 |
示例
java
String eventName = "ImageViewerOpen";
dWebView.callHandler("notifyEvent", new Object[]{ eventName }, new OnReturnValue<Boolean>() {
@Override
public void onValue(Boolean retValue) {
showToast(retValue);
}
});onWebViewClick
网页点击事件,传达至客户端
参数
clickName
| clickName | 类型 | 备注 |
|---|---|---|
topAd | String | 顶通广告 |
bottomAd | String | 文章尾部广告 |
comment | String | 查看更多评论 |
focusCommentInput | String | 点击发表评论按钮,聚焦写评论输入框 |
reward | String | 文章打赏按钮 |
rewardList | String | 打赏列表 |
login | String | 点击登录 |
vip | String | 点击“立即开通”“成为会员”按钮 |
nextContent | String | 【课程详情】点击课程详情“下一讲”,无下一讲则返回目录 |
playList | String | 【课程详情】点击视频课程播放列表,弹出播放列表 |
click | String | 页面内容点击时调用 |
letter | String | 点击投稿爆料时调用 |
vote-change | String | 点击投票多选/单选时调用 |
afterRelationAd | String | ST-3 广告位点击 |
paymentVipBtn | String | 正文内容,点击开通会员按钮 |
paymentVipLink | String | 正文内容,点击 成为南周会员文字(下划线 |
paymentLogin | String | 正文内容,点击立即登录按钮 |
paymentBanner | String | 正文内容,点击南周会员权益图片 |
paymentMediaLogin | String | 【鸿蒙版本】点击视频文章和正文音视频内容,调用立即登录弹窗 |
paymentMediaVipOnly | String | 【鸿蒙版本】点击视频文章和正文音视频内容,调用提示“本文仅会员可看”弹窗,去开通会员 |
paymentMediaVip | String | 【鸿蒙版本】点击视频文章和正文音视频内容,调用提示“免费阅读上限”弹窗,去开通会员 |


示例
java
@JavascriptInterface
public void onWebViewClick(Object clickName, CompletionHandler<Boolean> handler) {
if(clickName === "topAd")
{
//do something
}
handler.complete(true);
}通用业务方法
onToast
短提示

参数
onToastObject
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| text | 请选择正文区域 | String | 短提示文字内容 |
| time | 2000 | Number | 短提示显示时间,毫秒 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onToast(Object onToastObject,CompletionHandler<Boolean> handler) {
JSONObject jsonObject = (JSONObject)onToastObject;
ToastUtils.makeShortText(
H5ArticleDetailActivity.this,
jsonObject.optString("text"),
jsonObject.optInt("time")
);
handler.complete(true);
}onCopyText
复制文本内容到粘贴板

参数
onCopyTextString
类型 String
典型值 意味着社会主义在……
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onCopyText(Object onCopyTextString,CompletionHandler<Boolean> handler) {
ClipData clipData = ClipData.newPlainText("text", (String)onCopyTextString);
handler.complete(true);
}话题业务方法
onHotComment/onLatestComment
获取文章、话题的最热和最新评论,异步接口
参数
onCommentsObject
json
{
"content_id": 1235,
"link_id" : 2,
"page" : 1,
"limit" : 10,
}| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| content_id | 2 | Number | 文章的 id |
| link_id | 2 | Number | 文章的 link_id |
| page | 1 | Number | 分页数 |
| limit | 10 | Number | 每页条数 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | stairs_comments | JSONArray | 见数据结构 |
onMoreReplyComments
加载更多的该条回复评论,异步接口
参数
onMoreReplyCommentsObject
json
{
"comment_id": 1235,
"page" : 1,
}| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| comment_id | 2 | Number | 获取更多该条评论的 id |
| page | 1 | Number | 分页数 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | more_comments | JSONArray | 见数据结构 |
onFollowTopic/onUnFollowTopic
点击话题页面中的关注话题按钮,取消关注
参数
onFollowTopicParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| onFollowTopicParams | { content_id: 12345 } | JSON |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onFollowTopic(Object onFollowTopicParams, CompletionHandler<Boolean> handler) {
JSONObject followTopic = (JSONObject) onFollowTopicParams;
int content_id = followTopic.getInt("content_id");
handler.complete(true);
}课程业务方法
onCourseItemMonthBtnClick
点击周期购课程页面中的 “去购买”按钮,弹出当前课程月份选择页面


参数
onAudioChapterString
类型 String
典型值 2025-04 为当前单课所属的月份
onAudioChapter
用于获取音频课程中当前展示的音频章节数据

参数
无
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| JSONArray | JSONArray | JSONArray |
json
[
{
"id": 329,
"time_spot": 0,
"desc": "DeepSeek 是谁",
"media_tencent_id": "2075"
},
{
"id": 330,
"time_spot": 200,
"desc": "但模型的技术原理:人工智能网络,几千亿的参数",
"media_tencent_id": "2075"
}
]onCourseClick
点击跳转到课程,参数为课程对象
参数
onCourseClickObject
json
{
"id": 121,
"media_id": 252717,
"headimg_media_id": 213169,
"title": "南方周末报社写作讲座(第一季)",
"media": {
"id": 252717,
"name": "w6fSTXYZaANRCP6cNJ1hO4UYxZNMyFPIcl7BdTNL.png",
"path": "http://images.infzm.com/cms/medias/image/23/09/28/w6fSTXYZaANRCP6cNJ1hO4UYxZNMyFPIcl7BdTNL.png"
},
}onCourseVideoContentShowBtnClick
弹出文稿内容。客户端判断逻辑:课程已购买 || 已借阅 || 单课免费
如果不是,弹出 toast 提示用户购买
加载文稿地址:https://api.infzm.com/mobile/course_items/${单课id}?format=html&style=night|day
onCourseFavoriteClick/onCourseUnFavoriteClick
web api GET dev.api.infzm.com/mobile/course_item/1/add_collect?token=164b6db11f5f55ebf1fad1c6924094e1&user_id=1
收藏单课、取消收藏单课,参数为单课对象。
网络请求成功后调用
notifyWebViewUpdated({ name: 'courseFavorite' })
notifyWebViewUpdated({ name: 'unCourseFavorite' })
参数
onCourseFavoriteClickObject/onCourseUnFavoriteClickObject
json
{
"id": 2049,
"title": "杨嘉敏:如何打造一个好看的地理故事?",
"media_type": "audio",
"lecturer": "",
"is_free": 0,
"isdigg": false,
"is_charging": false,
}onCourseVideoPlayList
视频课程中的播放列表。
返回视频内容的播放列表数组,取 course.course_items 字段视频内容返回数组
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| Array | Array | Array |
json
[
{
"id": 2018,
"title": "#一起问杜甫#观后感打卡规则",
"media_type": "magazine",
"media_cover": {
"id": 205697,
"name": "aDMW4WRxOxCBCoW5FtStp5n6F5kxr0Vu3MswMq6m.jpeg",
"path": "http://images.infzm.com/cms/medias/image/22/08/18/aDMW4WRxOxCBCoW5FtStp5n6F5kxr0Vu3MswMq6m.jpeg",
"width": 3400,
"height": 1911
},
},
{
"id": 2012,
"title": "01 杜甫应该取名“杜国庆”",
"media_type": "video",
"media_cover": {
"id": 204553,
"name": "Inw9p5tx5oqMhDigs146tgXHXFSeNpK81NT6A3Q5.jpeg",
"path": "http://images.infzm.com/cms/medias/image/22/08/11/Inw9p5tx5oqMhDigs146tgXHXFSeNpK81NT6A3Q5.jpeg",
"width": 3400,
"height": 1911
},
},
]onCourseVideoPlayListClick
播放列表,点击更多,打开弹窗
onCourseVideoPlayListItemClick
点击播放列表中的视频,进入新课程。参数是单课对象
参数
onCourseVideoPlayListItemClickObject
json
{
"id": 2012,
"title": "01 杜甫应该取名“杜国庆”",
"media_type": "video",
}onCoursePaymentClick
不可看未购买内容的点击事件
参数
onCoursePaymentClickObject
json
{
type: "vip | buy | borrow | wecom"
}type 值定义
| 典型值 | 类型 | 版本 | 备注 |
|---|---|---|---|
vip | String | - | 开通会员 |
buy | String | - | 确认订单 |
borrow | String | - | 立即借阅 |
wecom | String | 1.6.0 | 打开 webview open-weapp.php 服务,跳转到“南周会员”微信小程序添加客服页面 |
onPreCourseItem/onNextCourseItem
单课上一讲下一讲点击事件,对应接口 course_item.prev_content/course_item.next_content 对象
参数
onPreCourseItemObject/onNextCourseItemObject
json
{
"target": {
"id": 2103,
"title": "38 杜甫草堂经历过的大风大雷大雨天",
"course_section_id": 166
},
"target_dict": {
"link_type": 22,
"version": "1.6.14",
"course_item_id": "2103",
"media_type": "video",
"course_id": 119
}
}onCourseItemComment
web api GET /mobile/course_items/course_items_comments?course_item_id=2012&page=1&user_id=&token=&course_item_comment_id=
最新单课评论。返回评论数组,参考 onHotComment API
参数
onCourseItemCommentObject
json
{
"page": 1,
"limit": 5,
"course_item_id": 12
}返回值
返回评论数组,参考 onHotComment API
onCourseItemMoreReplyComments
web api GET /mobile/comments/expand_comment_list?course_item_comment_id=2266565
加载更多的该条回复评论,参考 onMoreReplyComments API
onCourseItemChallengeClick

点击课程页面中的打卡模块
参数
onCourseItemChallengeClickObject
json
{
"id": 1,
"checkin_id": 3,
"title": "作业标题111",
"start_time": "2023-10-12",
"end_time": "2023-10-19",
"diary_user_count": 1,
"user_status": 0
}划线笔记方法
功能操作示例

划线笔记元数据
web-highlighter 中的 HighlightRange 对象有足够的信息作为元数据,用来保存到本地或者服务器,用于下次加载高亮内容。
HighlightRange 对象的结构如下:
JSON
{
"startMeta": {
"parentTagName": "P", "parentIndex": 33, "textOffset": 7
},
"endMeta": {
"parentTagName": "P", "parentIndex": 33, "textOffset": 58
},
"text": "没想到采来一个声势浩大的春天一样,以罪犯身份西行的裴景福,他在逆旅孤馆中写就的原本为打发长路时光的日记",
"id": "a26b8fb9-dd2f-410f-8272-d3263f655131",
"__isHighlightSource": {},
"extra": { "type": "mark" }
}下面是HighlightRange 对象 作为元数据的定义:
| 字段名称 | 类型 | 含义 |
|---|---|---|
| extra | Object | 额外数据,用于区分划线还是 |
| startMeta | Object | 内容开始位置。 parentTagName 是文字内容的标签名称。 parentIndex 是文字内容的标签位于正文同名标签的位置,从0开始textOffset 是开始文字偏移数,从0开始 |
| endMeta | Object | 内容结束位置。 parentTagName 是文字内容的标签名称。 parentIndex 是文字内容的标签位于正文同名标签的位置,从0开始 textOffset 是结束文字偏移数,从0开始 |
| text | String | 内容的文本,换行内容使用 \n 间隔 |
| id | String | 选区内容生成的 UUID |
划线、笔记API调用时序图

getContentMarks
获取当前用户在文章中全部划线和笔记
参数
content_id
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| content_id | 12345 | Number |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| JSONArray | JSONArray | JSONArray |
json
[
{
"id" : 998,
"content_id": "216909",
"type" : 1,
"text" : "选中的原文内容",
"note" : "用户输入的心得内容",
"updated_at": "2025-08-05 11:45:13",
"sources" : {}
},
{
"id" : 998,
"content_id": "216909",
"type" : 1,
"text" : "选中的原文内容",
"note" : "用户输入的心得内容",
"updated_at": "2025-08-05 11:45:13",
"sources" : {}
},
]示例
java
@JavascriptInterface
public void getContentMarks(Object note, CompletionHandler<JSONArray> handler) {
Log.d(TAG, "getContentMarks");
if (!GlobalSettings.getLoginStatus(getContext())) {
handler.complete(null);
} else {
presenter.getNetContentMixNoteList(content_id, handler);
}
}onAddMark
用户点击了划线按钮。成功提交了划线数据后调用 notifyWebViewUpdated markSuccess
网络请求失败,或者创建失败时,调用 notifyWebViewUpdated markCreateFail

参数
onAddMarkObject
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| text | 中国焕发出强大生机活力并…… | String | 划线文字内容 |
| type | 1 | Number | 1是划线 2是笔记 |
| sources | {} | Object | 划线笔记元数据 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onAddMark(Object onAddMarkObject,CompletionHandler<Boolean> handler) {
JSONObject jsonObject = (JSONObject)onAddMarkObject;
Log.d(TAG, "onAddMark " + jsonObject.toString());
presenter.addNetContentUnderLineItem(mContentId,jsonObject.optString("text"),jsonObject.optJSONObject("sources"),jsonObject);
handler.complete(true);
}onAddNote
用户点击了笔记按钮,弹出笔记填写窗口。成功提交笔记后调用 notifyWebViewUpdated noteSuccess
取消新建笔记,调用 notifyWebViewUpdated noteCancel
网络请求失败,或者创建失败时,调用 notifyWebViewUpdated noteCreateFail

参数
onAddNoteObject
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| text | 中国焕发出强大生机活力并…… | String | 划线文字内容 |
| type | 2 | Number | 1是划线 2是笔记 |
| sources | {} | Object | 划线笔记元数据 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onAddNote(Object onAddNoteObject,CompletionHandler<Boolean> handler) {
JSONObject jsonObject = (JSONObject)onAddNoteObject;
Log.d(TAG, "onAddMark " + jsonObject.toString());
presenter.addNetContentUnderLineItem(mContentId,jsonObject.optString("text"),jsonObject.optJSONObject("sources"),jsonObject);
handler.complete(true);
}onAddNotefromLine
在划线基础上写笔记,弹出笔记填写窗口,完成写笔记。划线会变成笔记。
成功添加笔记后,调用 notifyWebViewUpdated noteFromLineSuccess

参数
onAddNotefromLineObject
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 123 | Number | 划线id |
| text | 中国焕发出强大生机活力并…… | String | 划线文字内容 |
| type | 1 | Number | 1是划线 2是笔记 |
| sources | {} | Object | 划线笔记元数据 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onAddNotefromLine(Object onAddNotefromLineObject,CompletionHandler<Boolean> handler) {
JSONObject jsonObject = (JSONObject)onAddNotefromLineObject;
int noteId = jsonObject.optInt("id");
String textStr = jsonObject.optString("text");
JSONObject sources = jsonObject.optJSONObject("sources");
handler.complete(true);
}onMarkDelete
删除划线。成功提交删除划线请求后调用 notifyWebViewUpdated markDelete

参数
onMarkDeleteObject
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 123 | Number | 划线id |
| text | 中国焕发出强大生机活力并…… | String | 划线文字内容 |
| type | 1 | Number | 1是划线 2是笔记 |
| sources | {} | Object | 划线笔记元数据 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onMarkDelete(Object onMarkDeleteObject,CompletionHandler<Boolean> handler) {
JSONObject jsonObject = (JSONObject)onMarkDeleteObject;
int noteId = jsonObject.optInt("id");
String textStr = jsonObject.optString("text");
JSONObject sources = jsonObject.optJSONObject("sources");
handler.complete(true);
}onNoteShow
用户点击笔记,显示笔记内容

参数
onNoteShowObject
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 123 | Number | 划线id |
| text | 意味着社会主义…… | String | 文字内容 |
| note | 我的笔记内容…… | String | 用户的笔记内容 |
| type | 2 | Number | 1是划线 2是笔记 |
| updated_at | 2025-08-05 11:45:13 | String | 修改时间 |
| sources | {} | Object | 划线笔记元数据 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onNoteShow(Object onNoteShowObject,CompletionHandler<Boolean> handler) {
JSONObject jsonObject = (JSONObject)onNoteShowObject;
Log.e(TAG, "onNoteShow " + jsonObject.toString());
handler.complete(true);
}onChat
点击查AI按钮

参数
onChatString
类型 String
典型值 来的历史性飞跃,意味
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onChat(Object onChatString,CompletionHandler<Boolean> handler) {
TargetDict targetDict = new TargetDict();
targetDict.setQueryString((String)queryStr);
handler.complete(true);
}打卡业务方法
onChallengeDetail
获取打卡详情页(已参加)数据

参数
id
onChallengeIntroClick
打卡详情简介页

参数
id
onChallengeCourseClick
点击打卡详情页学习内容

参数
onChallengeCourseClickObject
json
{
"id": 363,
"title": "【新课首发】",
"course_number": 26,
"lecturer": "",
"is_show_number": 0,
"order_number": 0,
"media_type": "audio",
"course_items": []
}onChallengeTask
获取打卡详情页作业列表

参数
onChallengeCourseClickObject
json
{
"challenge_id": 1235,//打卡id
"page" : 1, //页码
"limit" : 10,
}后端接口 mobile/homework?page=1&checkin_id=2
onTaskItemClick/onTaskEditClick
点击打卡详情页作业


参数
onTaskItemClickObject/onTaskEditClickObject
json
{
"id": 1,
"title": "作业标题111",
"start_time": "2023-10-12",
"end_time": "2023-10-19",
"diary_user_count": 1,
"user_avatar": [],
"user_status": 1,
"amount": 1
}作业业务方法
onTaskDetail
获取作业详情页数据

参数
id
onTaskComment
作业详情页精选日记数据

参数
onTaskCommentObject
json
{
"task_id": 1235,//作业id
"page" : 1, //页码
"limit" : 10,
}返回内容
json
{
"code":200,
"data": {
"list": [],
"next_page": false
}
}onTaskCommentItemClick
点击日记评论、点赞、分享按钮

参数
onTaskCommentItemClickObject
json
{
"_type": "content | reply | like | share",
"id": 1,
"root_id": 1
}_type 含义: reply 进入日记详情页, like 点赞, share 分享, content 点击内容,暂时无用
播客业务方法
onPodCastHome
点播客专栏,进入播客专栏页面,参数为 content.special_column
参数
onPodCastHomeObject
json
{
"id": 26,
"title": "播客专栏",
"count": 4,
"type": "podcast",
"media_id": 190253,
"description": "测822播客专栏",
"media": {}
}onAudioClientRects
页面加载完成时会调用,播客播放器位置
参数
onAudioClientRectsObject
json
{
"left" : 19.453125,
"top" : 433.4375,
"width" : 375.09375,
"height" : 211.296875,
"url" : "http://xxx.mp3",
"id" : "5285890",
"duration": "231"
}onAudioSeek
快进到播客音频时间点
参数
onAudioSeekObject
json
{
"id" :"1",
"time_spot": 180, //180秒 3分钟
"desc": "从小就是别人家的孩子",
"media_tencent_id": "5285890"
}onNextPodcast/onPrePodcast
播客上一讲 下一讲
参数
onNextPodcastObject/onPrePodcastObject
json
{
id: 1234,
title:'黑白',
target: {},
target_dict: {},
}onForumEntry
普通文章获取话题讨论内容,对用后端接口 GET /mobile/v8/contents/generate_topic_buzz?content_id=241517
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | forum_entry | JSONArray | 见数据结构 |
onForumEntryClick
点击页面上的参与讨论
参数
onForumEntryClickObject
onForumEntryClickObject (点击展开)
json
{
"id" : 241519,
"short_subject": "\u201c\u5dfd\u98ce\u6570\u5b57\u4e16\u754c\u201d\uff1a\u5728\u4e91\u7aef\uff0c\u917f\u9020\u4e00\u74f6\u4e13\u5c5e\u7684\u201c\u8305\u53f0\u7f8e\u9152\u201d",
"topic_number" : 0,
"topic_count" : 0,
"target_dict" : {
"article_id" : "241519",
"article_type": "article",
"article_mode": "free",
"link_type" : 1,
"version" : "1.0"
}
}onCommentIn/onCommentOut
进入和退出评论区事件
文章业务方法
WARNING
为提高客户端代码语义化,H5Api 类中实现的函数名 以具名行为的方式命名。如业务 user 业务方法应实现为 getUser
getContent
返回内容详情,用于文章详情页和课程详情页
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 147022/4 | String | 文章 ID content id/课程详情 IDcourse_item id |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | 文章详情 / 课程详情 | JSON Object |
文章详情返回值(点击展开)
json
{
"content": {
"status": 4,
"id": 147022,
"link_id": 323711,
"subject": "孩子从小要学编程吗?",
"subsubject": "",
"short_subject": "孩子从小要学编程吗?",
"author": "柴内普·图菲克奇(Zeynep Tufekci)",
"introtext": "许多面向儿童的计算机教程和编程语言十分风行,那么是否人人都应该从小学计算机呢?答案是因人而异,如果孩子喜欢,当然是最好不过。",
"fulltext": "<p class=\"contentImg image\"><img class=\"landscape\" src=\"http://images.infzm.com/cms/medias/image/content/kcrt6mDYaWrN323RMRZgrFBCecJdoHQS6qWiEDDq.jpeg\" width=\"500\" height=\"667\" data-src=\"//images.infzm.com/cms/medias/image/content/kcrt6mDYaWrN323RMRZgrFBCecJdoHQS6qWiEDDq.jpeg\" data-key=\"7545\"></p>\n<p class=\"cm_pic_caption\" style=\"text-align: center; color: #999; padding: 0 4em;\"><span class=\"cm_pic_author\" style=\"color: #aaa;\"><span style=\"font-family: 楷体, 楷体_GB2312, STKaiti;\">美国前总统奥巴马曾表示,应该“向每个学生提供动手式的计算机科学和数学课程,从一开始就让他们为将来的工作做好准备。”不久,他启动了“人人来学计算机”(Computer Science For All)的项目,项目经费高达40亿美元。</span>(请输入图片来源/图)</span></p>\n<p><b></b><span style=\"font-family: 楷体, 楷体_GB2312, STKaiti;\">访谈问题:科技公司对此热情很高。亚马逊发起了“亚马逊未来工程师”项目,每年想教1000万儿童编程。脸书、微软和谷歌等公司也有类似项目,规模及范围各有大小。</span></p>\n<p><b></b>访谈回答:许多家长也很热心。Code.org是一家促进计算机教育的非营利机构,具他们统计,有九成家长希望孩子在学校学习计算机。这解释了为什么许多面向儿童的教程和计算机编程语言会如此风行,比如Scratch语言和“编程一小时”活动。</p>\n<p><a href=\"https://www.zhihu.com/\" title=\"这是个链接\">这是个链接</a></p>\n<p class=\"contentImg image\"><img class=\"landscape\" src=\"http://images.infzm.com/cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg\" width=\"1000\" height=\"667\" data-src=\"//images.infzm.com/cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg\" data-key=\"7515\"></p>\n<p class=\"cm_pic_caption\" style=\"text-align: center; color: #999; padding: 0 4em;\">2019年7月30日,参赛选手在进行“少儿编程赛”。 <span class=\"cm_pic_author\">(新华社记者 骆学峰/图)</span></p>\n<p><span style=\"color: #339966;\"><b>那么,要让你的孩子参加编程营吗?</b></span><em>要执意让他们上计算机课吗?</em><span class=\"nfzm-web-style--kaiti\" style=\"font-family: 楷体, 楷体_GB2312, STKaiti;\">可以,但不一定。我从小就学习编程,并且从中获益匪浅。</span>我用兼职赚的钱买了一台家用电脑,学习了Basic编程语言和一些机器语言。那很好玩,就像解谜。我在大一时找了第一份工作,做软件开发。一直到今天,情况并没多大变化:软件开发工程师还是很赚钱,属于紧俏人才。那为什么我要说“不一定”呢?</p>\n<p> </p>\n<p> </p>\n<p> </p>\n<p> </p>\n<p><p><audio class=\"contents-audio\" id=\"contents-audio-0\" data-fileid=\"5285890786773580306\" data-media=\"audio\" data-resource=\"tencent\" data-filename=\"刘惜君 - 遥远的歌.mp3\" data-url=\"null\" width=\"320\" height=\"80\" src=\"\">刘惜君 - 遥远的歌.mp3</audio></p></p>\n<p> </p>\n<p> </p>\n<p> </p>\n<p> </p>\n<p>编程对于我很好玩。可是对于那些兴趣不大的孩子呢?难道也要强迫他们学习编程,只为了将来能找份工作?在我看来,几十年后,我们不太可能还像今天这样给计算机编程。就拿机器学习来说(我们今天讲到“人工智能”,主要指的就是机器学习),它迥异于为计算机下达详细的逐步指令。我们今天要做的是给机器学习算法输入大量数据,让程序自行建构完成工作所需的模型。</p>\n<h3 class=\"thirdTitle\">小标题二</h3>\n<p>我举一个显著的例子:从前的谷歌翻译包含50万行代码,但今天改用机器学习语言,</p>\n<p><a href=\"http://www.infzm.com/wap/#/vip\" title=\"南周会员页\">南周会员页</a></p>\n<p>大约只有500行代码。现在最大的难题不是学习一门编程语言,而是拥有大量数据,并在数学上理解计算机构建的模型如何运作,这样才能调整、测试这些模型。</p>\n<h5 class=\"thirdTitle fourthTitle fifthTitle\">小标题三</h5>\n<p>在未来,这类计算机工作要注重什么呢?在技术方面,主要是数学:统计学、线性代数、概率论和微积分。数学仍是一门重要技术,除了编程,对许多职业都很有用。对日常生活也不可或缺。建立算法思维未必要通过编程。懂一点数学,再从烹饪、缝纫和编织(这些都包含了某种算法)中积累适当的学习经验,都很有价值。</p>\n<p><a href=\"http://www.infzm.com/app/open-page.php?link_type=7\" title=\"南周会员\">南周会员</a></p>\n<h4 class=\"fourthTitle\">小标题</h4>\n<p>对未来更重要的,是认清一个事实:计算机编程本身鼓励我们建构一个闭合的世界。这也是我当年觉得编程好玩的一个原因:能用一条条指令组装起一个(乏味的)东西,然后在自己建构的世界中玩耍,简直像魔法般诱人。但可惜,这和当今科技产业的做法已经相去甚远。当今需要的人才,要懂历史、社会学、心理学、数学和计算机,还要擅长分析复杂、开放和混沌的系统。 </p>\n<p><p><video class=\"contents-video\" id=\"contents-video-0\" data-fileid=\"5285890795798398563\" data-media=\"video\" data-resource=\"tencent\" data-filename=\"2 环保小视频.mp4\" data-cover=\"http://images.infzm.com/cms/medias/image/19/03/26/LQGrInroFfUa17OlzZv4dtXNHWgGVsWlrWDKEzaZ.jpeg\" data-url=\"http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/c1e233295285890795798398563/ErvtIKlxIo0A.mp4\" poster=\"\" controls=\"controls\" width=\"640\" height=\"360\">\n <source src=\"\" type=\"video/mp4\"></video></p></p>\n<p>那么,你应该让一个对编程感兴趣的孩子加入编程营吗?当然应该。要不要让他们用Scratch语言编程玩,或参加“编程一小时”课程,看看他们是否感兴趣?绝对要。但如果他们对编程没有兴趣,只想学习如何做纸杯蛋糕、缝布娃娃或是爬树,你也不必担心。</p>\n<p>我们绝不能让年轻人认为,世界正强迫他们在两条道路之间选择,一边是数学和理科,一边是社会科学和人文。我们要面对的最有趣或许也是最艰难的问题,将位于这两条道路的交叉处――而不在我们为了好玩创造出来的那个渺小封闭的世界里。</p>\n<p class=\"nfzm-web-style--kaiti\">(Scientific American中文版环球科学授权南方周末发表,红猪翻译)</p>\n<p> </p>",
"publish_time": "2019-09-19 10:04:57",
"link_url": "",
"isnew": 1,
"subject_media": null,
"content_network_editor": "柔翡",
"content_charge_editor": "朱力远",
"check_author": "",
"content_from": "",
"share_count": 0,
"comment_count": 2,
"ding_count": 3,
"pay_property": {
"content_type": "article",
"front_template": "",
"mode": "free",
"end_freetime": "1899-11-30 00:00:00"
},
"column": {
"id": 143,
"platform": "all",
"title": "分类2",
"type": "column"
},
"channels": [
{
"id": 1,
"platform": "all",
"type": "channel",
"title": "推荐"
},
{
"id": 4,
"platform": "all",
"type": "channel",
"title": "文化"
}
],
"sns_share": {
"url": "http://www.infzm.com/content/147022",
"share_title": "孩子从小要学编程吗?",
"share_desc": "许多面向儿童的计算机教程和编程语言十分风行,那么是否人人都应该从小学计算机呢?答案是因人而异,如果孩子喜欢,当然是最好不过。",
"path": "http://images.infzm.com/medias/default/logo_100_white.png"
},
"tags": [
{
"title": "计算机"
}
],
"medias": [
{
"author": "",
"description": "fromPeopleMedia:23219",
"file_path": "cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg",
"subject": ""
}
],
"content_medias": [],
"video_cover": {},
"relation_contents": [],
"video": {},
"content_title_picture": "cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg",
"submodules": [],
"audios": []
},
"user": {
"islogin": false,
"isview": true,
"isNewsStand": 0,
"isdigg": false,
"isfav": false
},
"cache": "1_redis",
"magazine": {}
}课程详情返回值(点击展开)
json
{
"course_item": {
"id": 4,
"title": "02 卯时·早膳早课",
"media_id": 7,
"media_free_id": 0,
"media_cover_id": 3220,
"media_type": "video",
"lecturer": "向阳",
"is_free": 0,
"course_id": 3,
"comment_count": 6,
"ding_count": 26,
"fulltext": "",
"introtext": null,
"isdigg": false,
"media": {
"id": 7,
"name": "故宫第二集1012.mp4",
"path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/8f05105b5285890782836944635/mUaMHFF3o9wA.mp4",
"width": 0,
"height": 0,
"type": "video",
"duration": 784,
"fileId": "5285890782836944635"
},
"media_free": null,
"media_cover": {
"id": 3220,
"name": "OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
"path": "http://dev.cms.infzm.com/medias/image/courses/OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
"width": 952,
"height": 535,
"type": "image"
}
},
"course": {
"id": 3,
"media_id": 3262,
"headimg_media_id": 3211,
"title": "《故宫 · 皇帝的一天》",
"is_final": 0,
"course_number": 10,
"lecturer": "向阳",
"is_show_number": 0,
"order_number": 1658,
"media_type": "video",
"share_title": "南周严选课:在故宫带你走过皇帝的一天",
"share_media_id": 3245,
"share_desc": "十节视频课,亲近一群你从未亲近的皇帝,发现一座你从未发现的故宫。",
"desc": "<p><img src=\"medias/image/18/11/22/fCsHr7RrJnbQBtgGKCDotufbk0B3YIjpSLR8uBol.jpeg\" data-src=\"//images.infzm.com/cms/medias/image/18/11/22/fCsHr7RrJnbQBtgGKCDotufbk0B3YIjpSLR8uBol.jpeg\" data-key=\"4303\" /></p>",
"lecturer_desc": null,
"chapter_desc": null,
"purchase_desc": "<p><img src=\"medias/image/courses/qRnvLwr5lRM6yv7fOwhTiDUL9mAY4sOrkgYTsX6W.png\" data-key=\"3213\" /></p>",
"price_type": 2,
"price": 1000,
"vip_price": 1000,
"expire_price": 0,
"expire_time": "2018-11-26 23:59:59",
"lecturer_media_id": 3212,
"lecturer_id": "[1]",
"link_url": null,
"introtext": null,
"status": 1,
"specific_member": 0,
"is_update_note": 0,
"update_note": "",
"is_show_cover": 0,
"is_section_style": 1,
"is_multi_media": 1,
"share_url": "http://www.infzm.com/wap/#/course/3",
"course_items_count": 10,
"is_free": 1,
"course_url": "http://cms.infzm.com/mobile/courses/3?format=html",
"pumpkin": 50,
"lecturers": [
{
"id": 1,
"title": "向阳",
"media_id": 3804,
"desc": "媒体人、作家,著有《经典躺着读》。南方周末前副总编辑,南瓜视业创始人。大型人文教育公开课《同一堂课》出品人。",
"media": {
"id": 3804,
"name": "FZPvFHXAXh1VlpwlTssAKe75xtisArffqBOTkk7V.png",
"path": "http://dev.cms.infzm.com/medias/image/18/11/16/FZPvFHXAXh1VlpwlTssAKe75xtisArffqBOTkk7V.png",
"width": 400,
"height": 400,
"type": "image"
}
}
],
"now_time": "2020-05-13 15:00:46",
"course_item": {
"id": 3,
"title": "01 寅时·给太后请安",
"media_id": 6,
"media_free_id": 0,
"media_cover_id": 3222,
"media_type": "video",
"lecturer": "向阳",
"is_free": 0,
"published_at": "2018-11-05 19:49:57",
"course_id": 3,
"comment_count": 7,
"fulltext": "",
"introtext": null,
"media": {
"id": 6,
"name": "故宫第一集 修改版-ok 1012.mp4",
"path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/ae5c46915285890782830128097/0BxWzQJ286oA.mp4",
"width": 0,
"height": 0,
"type": "video",
"duration": 847,
"fileId": "5285890782830128097"
},
"media_free": null,
"media_cover": {
"id": 3222,
"name": "6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
"path": "http://dev.cms.infzm.com/medias/image/courses/6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
"width": 1165,
"height": 655,
"type": "image"
}
},
"isbuy": false,
"has_coupon_rule_user": 0,
"isborrow": 0,
"media": {
"id": 3262,
"name": "e4Q2gDcTYSCH5yfOYIlhx78n8T9I0BQU0fCGGdg7.jpeg",
"path": "http://dev.cms.infzm.com/medias/image/courses/e4Q2gDcTYSCH5yfOYIlhx78n8T9I0BQU0fCGGdg7.jpeg",
"width": 1242,
"height": 698,
"type": "image"
},
"headimg_media": {
"id": 3211,
"name": "ahkxfDtiaw5HKHNkUfoEEcOmWcEjzWFMMfjM0Bnh.jpeg",
"path": "http://dev.cms.infzm.com/medias/image/courses/ahkxfDtiaw5HKHNkUfoEEcOmWcEjzWFMMfjM0Bnh.jpeg",
"width": 140,
"height": 140,
"type": "image"
},
"share_media": {
"id": 3245,
"name": "LUFhLqqjPcaTvsBCbVUNvaR1pW6XyHFhBALu9h20.jpeg",
"path": "http://dev.cms.infzm.com/medias/image/courses/LUFhLqqjPcaTvsBCbVUNvaR1pW6XyHFhBALu9h20.jpeg",
"width": 140,
"height": 140,
"type": "image"
},
"lecturer_media": {
"id": 3212,
"name": "abWUAG2ESMTwooiwI6JytxrhFTRrO43ZS5PGpXHA.png",
"path": "http://dev.cms.infzm.com/medias/image/courses/abWUAG2ESMTwooiwI6JytxrhFTRrO43ZS5PGpXHA.png",
"width": 1182,
"height": 575,
"type": "image"
},
"course_items": [
{
"id": 3,
"title": "01 寅时·给太后请安",
"media_id": 6,
"media_free_id": 0,
"media_cover_id": 3222,
"media_type": "video",
"lecturer": "向阳",
"is_free": 0,
"published_at": "2018-11-05 19:49:57",
"course_id": 3,
"comment_count": 7,
"fulltext": "",
"introtext": null,
"media": {
"id": 6,
"name": "故宫第一集 修改版-ok 1012.mp4",
"path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/ae5c46915285890782830128097/0BxWzQJ286oA.mp4",
"width": 0,
"height": 0,
"type": "video",
"duration": 847,
"fileId": "5285890782830128097"
},
"media_free": null,
"media_cover": {
"id": 3222,
"name": "6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
"path": "http://dev.cms.infzm.com/medias/image/courses/6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
"width": 1165,
"height": 655,
"type": "image"
}
},
{
"id": 4,
"title": "02 卯时·早膳早课",
"media_id": 7,
"media_free_id": 0,
"media_cover_id": 3220,
"media_type": "video",
"lecturer": "向阳",
"is_free": 0,
"published_at": "2018-11-05 22:49:23",
"course_id": 3,
"comment_count": 6,
"fulltext": "",
"introtext": null,
"media": {
"id": 7,
"name": "故宫第二集1012.mp4",
"path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/8f05105b5285890782836944635/mUaMHFF3o9wA.mp4",
"width": 0,
"height": 0,
"type": "video",
"duration": 784,
"fileId": "5285890782836944635"
},
"media_free": null,
"media_cover": {
"id": 3220,
"name": "OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
"path": "http://dev.cms.infzm.com/medias/image/courses/OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
"width": 952,
"height": 535,
"type": "image"
}
}
]
},
"user": null,
"cache": "0_redis"
}示例
java
@JavascriptInterface
public void getContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(this.content);
}getVote
获取当前图文文章内投票模块数据
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 147022 | String | 文章 ID content id 或 单课id |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | JSON Object |
getVote 返回值(点击展开)
json
{
"id" : 7,
"title" : "测试投票",
"expire_at" : "2021-07-13 22:28:11",
"cited_count" : 1,
"created_at" : "2021-07-14 10:01:51",
"updated_at" : "2021-07-15 09:49:31",
"is_end" : true,
"user_options" : [
36,
40,
46
],
"user_status" : true,
"vote_problems": [
{
"id" : 16,
"vote_id" : 7,
"type" : "single",
"problem" : "问题1",
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59",
"vote_problem_options": [
{
"id" : 36,
"vote_problem_id": 16,
"description" : "选项1",
"num" : 12,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 37,
"vote_problem_id": 16,
"description" : "选项2",
"num" : 11,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 38,
"vote_problem_id": 16,
"description" : "选项4",
"num" : 1,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
}
]
},
{
"id" : 17,
"vote_id" : 7,
"type" : "multiple",
"problem" : "问题2",
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59",
"vote_problem_options": [
{
"id" : 39,
"vote_problem_id": 17,
"description" : "选项1",
"num" : 14,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 40,
"vote_problem_id": 17,
"description" : "选项2",
"num" : 16,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 41,
"vote_problem_id": 17,
"description" : "选项3",
"num" : 19,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
}
]
},
{
"id" : 18,
"vote_id" : 7,
"type" : "single",
"problem" : "问题3",
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59",
"vote_problem_options": [
{
"id" : 42,
"vote_problem_id": 18,
"description" : "选项1",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 43,
"vote_problem_id": 18,
"description" : "选项2",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 44,
"vote_problem_id": 18,
"description" : "选项3",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 45,
"vote_problem_id": 18,
"description" : "选项4",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 46,
"vote_problem_id": 18,
"description" : "选项5",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
}
]
}
]
}示例
java
@JavascriptInterface
public void getVote(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(this.vote);
}getPk
获取当前图文文章内观点PK 模块数据
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 147022 | String | 文章 ID content id |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | JSON Object |
getPk 返回值(点击展开)
json
{
"id": 1,
"title": "测试观点pk",
"expire_at": "2021-07-14 11:39:57",
"cited_count": 1,
"created_at": null,
"updated_at": null,
"is_end": true,
"user_options": [
2
],
"user_status": true,
"opinion_descs": [
{
"id": 112,
"opinion_id": 1,
"standpoint": "negative",
"opinion_name": "反方观点1",
"created_at": "2021-07-14 16:48:44",
"updated_at": "2021-07-14 16:48:44"
},
{
"id": 113,
"opinion_id": 1,
"standpoint": "positive",
"opinion_name": "正方观点2",
"created_at": "2021-07-14 16:48:44",
"updated_at": "2021-07-14 16:48:44"
},
{
"id": 114,
"opinion_id": 1,
"standpoint": "negative",
"opinion_name": "反方观点2",
"created_at": "2021-07-14 16:48:44",
"updated_at": "2021-07-14 16:48:44"
}
],
"opinion_options": [
{
"id": 1,
"opinion_id": 1,
"standpoint": "positive",
"description": "支持正方",
"num": 10,
"created_at": null,
"updated_at": null
},
{
"id": 2,
"opinion_id": 1,
"standpoint": "negative",
"description": "支持反方",
"num": 27,
"created_at": null,
"updated_at": null
}
]示例
java
@JavascriptInterface
public void getPk(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(this.pk);
}getNextContent
获取下一篇、下一章节内容,用于电子报详情页和课程详情页
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 147022/4 | String | 文章 ID content id/课程详情 IDcourse_item id |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | 下一课程 | JSON Object |
WARNING
电子报详情页下一篇文章暂未支持
课程详情返回值(点击展开)
json
{
"id": 4,
"title": "02 卯时·早膳早课",
"media_id": 7,
"media_free_id": 0,
"media_cover_id": 3220,
"media_type": "video",
"lecturer": "向阳",
"is_free": 0,
"course_id": 3,
"comment_count": 6,
"ding_count": 26,
"fulltext": "",
"introtext": null,
"isdigg": false,
"media": {
"id": 7,
"name": "故宫第二集1012.mp4",
"path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/8f05105b5285890782836944635/mUaMHFF3o9wA.mp4",
"width": 0,
"height": 0,
"type": "video",
"duration": 784,
"fileId": "5285890782836944635"
},
"media_free": null,
"media_cover": {
"id": 3220,
"name": "OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
"path": "http://dev.cms.infzm.com/medias/image/courses/OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
"width": 952,
"height": 535,
"type": "image"
}
}示例
java
@JavascriptInterface
public void getNextContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(this.content);
}getRewards
返回打赏数据结构
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| link_id | 147022 | String | 文章业务 ID |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | rewards | JSONArray | 见数据结构 |
WARNING
注意改接口返回的是 JSON 数组,即 data 的值
示例
java
@JavascriptInterface
public void getRewards(Object link_id, CompletionHandler<JSONArray> handler) throws JSONException {
handler.complete(this.rewards);
}getComments
返回当前页评论数据。当收到 notifyWebViewUpdated comment 事件通知,会调用该接口。
注意保存评论数据的上下文(页数),用于分页加载。接口返回的内容的分页数制作为参考。
参数
无
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | comments | JSONArray | 见数据结构 |
WARNING
接口返回的是后端接口的 data 值,不含 code 和 msg
示例
java
@JavascriptInterface
public void getComments(Object link_id, CompletionHandler<JSONArray> handler) throws JSONException {
handler.complete(this.comments);
}getAudio
返回全局正在播放的音频对象序号
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 147022 | String | 文章 ID |
返回值
json
{
"index": "0"
}示例
java
@JavascriptInterface
public void getAudio(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(new JSONObject);
}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);
}onComments
请求文章评论,参数为文章的 link_id ,分页数 page 和每页条数 limit 。请求的成功以 notifyWebViewUpdated comment 事件通知。

评论模块若干API 的调用流程图
参数
onCommentsObject
json
{
"link_id" : 2,
"page" : 1,
"limit" : 10
}| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| link_id | 2 | Number | 文章的 link_id |
| page | 1 | Number | 分页数 |
| limit | 10 | Number | 每页条数 |
返回值
true
示例
java
@JavascriptInterface
public void onComments(Object commentsObject, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject _commentsObject = (JSONObject) commentsObject;
int link_id = _commentsObject.getInt("link_id");
int page = _commentsObject.getInt("page");
int limit = _commentsObject.getInt("limit");
handler.complete(true);
}onContentVote
投票提交内容,完整的参数见后端接口文档
参数
ContentVoteObject
json
{
"vote_id" : 2,
"content_id" : 12345, //文章页面返回的是 文章id
"course_item_id" : 1193, //单课页面返回的是 单课id
"vote_problem_options": [30, 31, 32, 33]
}| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| vote_id | 2 | Number | 投票id |
| content_id | 12345 | Number | 投票所属文章的id |
| vote_problem_options | 127 | Number[] | 选项集合 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | JSON Object |
onContentVote 返回值(点击展开)
json
{
"id" : 7,
"title" : "测试投票",
"expire_at" : "2021-07-13 22:28:11",
"cited_count" : 1,
"created_at" : "2021-07-14 10:01:51",
"updated_at" : "2021-07-15 09:49:31",
"is_end" : true,
"user_options" : [
36,
40,
46
],
"user_status" : true,
"vote_problems": [
{
"id" : 16,
"vote_id" : 7,
"type" : "single",
"problem" : "问题1",
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59",
"vote_problem_options": [
{
"id" : 36,
"vote_problem_id": 16,
"description" : "选项1",
"num" : 12,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 37,
"vote_problem_id": 16,
"description" : "选项2",
"num" : 11,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 38,
"vote_problem_id": 16,
"description" : "选项4",
"num" : 1,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
}
]
},
{
"id" : 17,
"vote_id" : 7,
"type" : "multiple",
"problem" : "问题2",
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59",
"vote_problem_options": [
{
"id" : 39,
"vote_problem_id": 17,
"description" : "选项1",
"num" : 14,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 40,
"vote_problem_id": 17,
"description" : "选项2",
"num" : 16,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 41,
"vote_problem_id": 17,
"description" : "选项3",
"num" : 19,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
}
]
},
{
"id" : 18,
"vote_id" : 7,
"type" : "single",
"problem" : "问题3",
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59",
"vote_problem_options": [
{
"id" : 42,
"vote_problem_id": 18,
"description" : "选项1",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 43,
"vote_problem_id": 18,
"description" : "选项2",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 44,
"vote_problem_id": 18,
"description" : "选项3",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 45,
"vote_problem_id": 18,
"description" : "选项4",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
},
{
"id" : 46,
"vote_problem_id": 18,
"description" : "选项5",
"num" : 0,
"created_at" : "2021-07-14 10:18:59",
"updated_at" : "2021-07-14 10:18:59"
}
]
}
]
}示例
java
@JavascriptInterface
public void onContentVote(Object ContentVoteObject, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject _ContentVoteObject = (JSONObject) ContentVoteObject;
int vote_id = _ContentVoteObject.getInt("vote_id");
//post to server
JSONObject res = new JSONObject();
res.put("data", "data"); //data 值是返回值
handler.complete(res);
}onContentPk
观点PK提交内容,完整的参数见后端接口文档
参数
ContentPkObject
json
{
"opinion_id": 2,
"content_id": 12345,
"opinion_option_id": 123,
}| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| opinion_id | 2 | Number | pk id |
| content_id | 12345 | Number | pk 所属文章的 id |
| opinion_option_id | 127 | Number | 正方或反方的选项 id |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | JSON Object |
onContentPk 返回值(点击展开)
json
{
"id": 1,
"title": "测试观点pk",
"expire_at": "2021-07-14 11:39:57",
"cited_count": 1,
"created_at": null,
"updated_at": null,
"is_end": true,
"user_options": [
2
],
"user_status": true,
"opinion_descs": [
{
"id": 112,
"opinion_id": 1,
"standpoint": "negative",
"opinion_name": "反方观点1",
"created_at": "2021-07-14 16:48:44",
"updated_at": "2021-07-14 16:48:44"
},
{
"id": 113,
"opinion_id": 1,
"standpoint": "positive",
"opinion_name": "正方观点2",
"created_at": "2021-07-14 16:48:44",
"updated_at": "2021-07-14 16:48:44"
},
{
"id": 114,
"opinion_id": 1,
"standpoint": "negative",
"opinion_name": "反方观点2",
"created_at": "2021-07-14 16:48:44",
"updated_at": "2021-07-14 16:48:44"
}
],
"opinion_options": [
{
"id": 1,
"opinion_id": 1,
"standpoint": "positive",
"description": "支持正方",
"num": 10,
"created_at": null,
"updated_at": null
},
{
"id": 2,
"opinion_id": 1,
"standpoint": "negative",
"description": "支持反方",
"num": 27,
"created_at": null,
"updated_at": null
}
]示例
java
@JavascriptInterface
public void onContentPk(Object ContentPkObject, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject _ContentPkObject = (JSONObject) ContentPkObject;
int vote_id = _ContentPkObject.getInt("vote_id");
//post to server
JSONObject res = new JSONObject();
res.put("data", "data"); //data 值是返回值
handler.complete(res);
}onContentMounted
网页获取正文内容并渲染到页面后触发的回调,客户端可监听 onContentMounted 即可得知内容已显示在页面上。
内容显示出来后,前端便会计算正文标题和标题下方内容到页面顶部的高度,将参数带进 onContentMounted 回调参数中。
参数
ContentMountedObject
json
{
"titleOffsetTop": 82,
"metaOffsetTop": 127,
"postOffsetTop": 3555,
"pkOffsetTop": 2000,
"voteOffsetTop": 2500,
"contentHeight": 700,
"topAdOffsetTop": 100
}| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| titleOffsetTop | 82 | Number | 正文标题到页面顶部的距离 |
| metaOffsetTop | 127 | Number | 标题下方内容到页面顶部的距离 |
| postOffsetTop | 3555 | Number | 报料投稿模块到页面顶部的距离,0 代表电子报场景无该模块 |
| pkOffsetTop | 2000 | Number | 观点PK 模块到页面顶部的距离,0 代表无该模块 |
| voteOffsetTop | 2500 | Number | 投票模块到页面顶部的距离,0 代表无该模块 |
| contentHeight | 700 | Number | 文章正文中,文字和图片的高度 |
| contentOffsetBottom | 500 | Number | 文章正文中到页面底部的距离 |
| topAdOffsetTop | 100 | Number | 文章顶部广告位到页面顶部的距离 |
| authorCardsOffsetTop | 621 | Number | 作者卡片模块到页面顶部的距离 |
| onCommentOffsetTop | 1621 | Number | 评论模块到页面顶部的距离,0 代表无该模块 |
titleOffsetTop metaOffsetTop 属性分别表示页面中不同两点间的距离:

postOffsetTop 表示页面中不同两点间的距离:

contentHeight 表示文章正文中,文字和图片的高度:

示例
java
@JavascriptInterface
public void onContentMounted(Object ContentMountedObject, CompletionHandler<Boolean> handler) throws JSONException {
JSONObject _ContentMountedObject = (JSONObject) ContentMountedObject;
int titleOffsetTop = _ContentMountedObject.getInt("titleOffsetTop");
int metaOffsetTop = _ContentMountedObject.getInt("metaOffsetTop");
int postOffsetTop = _ContentMountedObject.getInt("postOffsetTop");
handler.complete(true);
}onCommentItemClick
点击评论内容,回复评论、点赞和更多操作
参数
commentItemObject
commentItemObject 对象柔合了单条评论数据,客户端可根据需求自行判定
commentItemObject 中的 _type 参数描述对应业务功能; _index 参数表示该目标评论位于原评论数组中序号(从 0 开始)
| _type | 类型 | 备注 |
|---|---|---|
reply | String | 回复用户评论 |
like | String | 点赞用户评论 |
item-like | String | 点赞用户评论(楼中楼) |
unlike | String | 取消点赞用户评论 |
item-unlike | String | 取消点赞用户评论(楼中楼) |
more | String | 点击更多操作 |
share | String | 分享该条评论内容 |
json
{
"_type": "reply",
"_index": 0,
"id": 2264072,
"parent_id": 0,
"root_id": 0,
//表示回复哪条id
"link_id": 323711,
"user_id": 2292965,
"comment_content": "燃气热水器",
"user": {},
"created_at": null,
"comment_images": [
{
id:1,
width: 1080,
height: 1585,
path: 'https://images.infzm.com/cms/medias/image/25/03/18/BWQ1tD1Z4gxt8oKAH4UDpLBXM9jiAquOLJNON07M.jpeg'
}
]
}示例
java
@JavascriptInterface
public void onCommentItemClick(Object commentItemObject, CompletionHandler<Boolean> handler) throws JSONException {
JSONObject commentItem = (JSONObject) commentItemObject;
String id = commentItem.getString("id");
handler.complete(true);
}onCommentImageClick
点击评论图片,全屏显示这张图片
参数
commentImageObject
json
{
id:1,
width: 1080,
height: 1585,
path: 'https://images.infzm.com/cms/medias/image/25/03/18/BWQ1tD1Z4gxt8oKAH4UDpLBXM9jiAquOLJNON07M.jpeg'
}onImageList
onImageViewer
全屏显示文章内图片,imageObj JSONObject 中包含当前点击的图片 current 和文章中所有图片 list
! 在 1.7.0 版中,头图加入了可浏览的图片集合
参数
imageObj
包含当前图片 current 的资源地址、left 离视窗左侧、top 离视窗顶部、with 宽度、height 高度,和当前页面所有的图片资源地址。
离视窗左侧、离视窗顶部、宽度、高度的单位为 px。
json
{
"current": "http://images.infzm.com/cms/medias/image/20/07/26/RhRj06GKd89KqOTyNEQjeUKNFQLDKfjrZKC2CAVy.jpeg",
"left" : 0,
"top" : 440,
"width" : 375,
"height" : 211,
"data" : [
"http://images.infzm.com/cms/medias/image/20/07/26/RhRj06GKd89KqOTyNEQjeUKNFQLDKfjrZKC2CAVy.jpeg",
"http://images.infzm.com/cms/medias/image/20/07/26/oYmAWVCaj6hd21skaO9rIsHJJCZ29uylZqRyUtWV.jpeg",
"http://images.infzm.com/cms/medias/image/20/07/26/gVvMRN295zS4QA29oN9aLiO7PrpDa36su64wDGNF.jpeg"
]
}示例
java
@JavascriptInterface
public void onImageViewer(Object imageObj, CompletionHandler<Boolean> handler) throws JSONException {
JSONObject images = (JSONObject) imageObj;
String current = images.getString("current");
JSONArray data = images.getJSONArray("data");
/*
open imageViewer
*/
handler.complete(true);
}getRelationContent
获取当前文章的推荐模块内容
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| id | 147022 | String | 文章 ID content id |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
json | relationContent | JSONArray | 见数据结构 |
示例
java
@JavascriptInterface
public void getRelationContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
handler.complete(this.relationContent);
}onRelationContent/onRelationWithTopic
点击相关推荐,话题中含有的关联内容
参数
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| relationContent | {} | JSON | 相关推荐,单条内容的数据结构 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onRelationContent(Object index, CompletionHandler<Boolean> handler) {
int RelationContentIndex = (int) index;
/*
open new content code in here
*/
handler.complete(true);
}onShare
点击分享按钮
参数
shareType
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| shareType | timeline wechat weibo qq | String | 微信朋友圈、微信好友、微博、QQ |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
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);
}onVideoPlay
调起客户端视频播放功能
参数
videoParams
json
{
"left" : 19.453125,
"top" : 433.4375,
"width" : 375.09375,
"height" : 211.296875,
"url" : "http://1251434507.vod2.myqcloud.com/48276b87vodtransgzp1251434507/c1e233295285890795798398563/v.f20.mp4",
"id" : "5285890795798398563",
"duration": "231"
}返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true false | Boolean |
示例
java
@JavascriptInterface
public void onVideoPlay(Object videoParams, CompletionHandler<Boolean> handler) throws JSONException {
JSONObject video = (JSONObject) videoParams;
double left = video.getDouble("left");
String id = video.getString("id");
/*
open video
*/
handler.complete(true);
}onAudioPlay
调起客户端音频播放功能
参数
audioParams
json
{
"index" : "0",
"title" : "刘惜君 - 遥远的歌",
"id" : "5285890786773580306",
"duration": "174",
"url" : "http://1251434507.vod2.myqcloud.com/48276b87vodtransgzp1251434507/ebbd01f65285890786773580306/v.f1010.mp3",
"status" : "playing" //stop
}返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true false | Boolean |
示例
java
@JavascriptInterface
public void onAudioPlay(Object audioParams, CompletionHandler<Boolean> handler) throws JSONException {
JSONObject audio = (JSONObject) audioParams;
String id = audio.getString("id");
double duration = audio.getString("duration");
/*
play audio
*/
handler.complete(true);
}onChannel
打开相关频道/栏目
参数
channelParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| termId | 145 | Number | 频道/栏目 ID |
| title | 分类4 | String | 频道/栏目名称 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onChannel(Object channelParams, CompletionHandler<Boolean> handler) {
JSONObject channel = (JSONObject) channelParams;
int id = channel.getInt("termId");
double duration = channel.getString("title");
/*
open channel
*/
handler.complete(true);
}onColumn
收录于专栏模块
参数
specialColumnParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| specialColumnParams | {} | JSON | 专栏数据结构 |
json
{
"special_column": {
"id": 15,
"title": "wh专栏",
"count": 2
}
}返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onColumn(Object specialColumnParams, CompletionHandler<Boolean> handler) {
JSONObject column = (JSONObject) specialColumnParams;
int id = column.getInt("id");
double duration = column.getString("title");
/*
open column
*/
handler.complete(true);
}onSubject
收录于专题模块
参数
belongSubjectParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| belongSubjectParams | {} | JSON | 收录于专题模块数据结构 |
json
{
"belong_subject": {
"id": 216755,
"subject": "正文列表标题-总策划从库里选择",
"subject_media": {
"id": 146497,
"path": "cms\/medias\/image\/22\/06\/10\/cd82f5b2ce04e119d4c5a50f997398da.png",
"width": 657,
"height": 260
}
}
}返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onSubject(Object belongSubjectParams, CompletionHandler<Boolean> handler) {
JSONObject belongSubject = (JSONObject) belongSubjectParams;
int id = belongSubject.getInt("id");
string subject = belongSubject.getString("subject");
/*
open subject
*/
handler.complete(true);
}onMovement
文章详情页加了组稿模块,点击调用 onMovement API ,参数是一个json对象。取自文章接口 content.belong_composite 对象

onMovementParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| onMovementParams | {} | JSON | 组稿对象 |
json
{
"belong_composite": {
"id": 243350,
"subject": "组稿组稿组稿组稿组稿组稿组稿组稿组稿",
"subject_media": {
"id": 352758,
"path": "cms/medias/image/25/11/28/s8oQ7mt1xXeVI1F3gaMC4C2cU51EzV1knbvnwk8g.png",
"width": 400,
"height": 534
},
"modules": [
{
"id": 1012,
"title": "动静1012",
"mobile_media_id": 352753,
"mobile_media": {
"id": 352753,
"name": "YqwYS6zHIOUZOWovYna0nuibNkdiUTw9yHmmQf73.gif",
"path": "http://dev.cms.infzm.com/cms/medias/image/25/11/14/YqwYS6zHIOUZOWovYna0nuibNkdiUTw9yHmmQf73.gif",
"width": 35,
"height": 35,
"type": "image"
}
}
],
"published_at": "2025-11-28 10:21:04"
}
}onAuthorCard
点击本文作者模块中的“看看TA”按钮
参数
authorParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| authorParams | {} | JSON | 作者数据结构见数据结构 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onAuthorCard(Object authorParams, CompletionHandler<Boolean> handler) {
JSONObject author = (JSONObject) authorParams;
int id = author.getInt("id");
string name = author.getString("name");
/*
open subject
*/
handler.complete(true);
}onAuthorSub
订阅作者
参数
authorParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| authorParams | {} | JSON | 作者数据结构见数据结构 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
onAuthorUnsub
取消订阅作者
authorParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| authorParams | {} | JSON | 作者数据结构见数据结构 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
onFollowColumn
关注栏目
参数
followColumnParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| column_id | 152 | Number |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
onUnFollowColumn
取消关注栏目
unFollowColumnParams
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| column_id | 152 | Number |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
onSearch
打开文章标签,搜索页面
参数
title
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| title | 分类4 | String | 搜索关键字 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
示例
java
@JavascriptInterface
public void onSearch(String title, CompletionHandler<Boolean> handler) {
/*
open search
*/
handler.complete(true);
}onVoiceText
标题与正文内容,用于语音播放
参数
title
| 参数 | 典型值 | 类型 | 备注 |
|---|---|---|---|
| text | 分类4 | String | 标题与正文字符串 |
返回值
| 返回值 | 典型值 | 类型 | 备注 |
|---|---|---|---|
true | true | Boolean |
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
{
"fontSize" : "normal", //小 small | 标准 normal | 大 large | 特大 xlarge
"fontStyle" : "system", //系统默认 system | 思源宋体 simsun | 霞鹜文楷 LXGWWenKai
"nightMode" : false, //夜间模式 true | 浅色模式 false
"topContentAdText" : "广告", //iPhone/Android 文章页顶通 S-T1
"topContentAd" : "http://dev.ad.infzm.com/medias/image/advertising/RXHdi9Zd8XFg5RoQXSM8ARFVCgUUiEjQwoCdsfVq.jpeg", //iPhone/Android 文章页顶通 S-T1
"bottomContentAdText" : "活动", //iPhone/Android 文章页相关推荐上方 S-T2
"bottomContentAd" : "http://dev.ad.infzm.com/medias/image/advertising/RXHdi9Zd8XFg5RoQXSM8ARFVCgUUiEjQwoCdsfVq.jpeg", //iPhone/Android 文章页相关推荐上方 S-T2
"afterRelationAdText" : "", // S-T3
"afterRelationAd" : "", // S-T3
"showAd" : true, //显示广告 true
"navAndStatusBarHeight": "64", //64 个单位,网页内容顶部预留的高度
"bottomBarHeight" : "32", //32 个单位,网页内容底部预留的高度
"commentHookId" : "748367" //评论ID ,表示当前文章要定位到评论模块,并高亮第一条评论
"markNoteId" : "123213", //划线笔记 ID ,表示当前文章要定位到划线笔记
"featureConfig": {
"enableMovementModule": false //文章中的组稿模块 不显示,默认为 true
}
}广告位
广告位置见 7.0 版本设计稿
| 数据字段 | 广告位名称 | 广告标识 |
|---|---|---|
topContentAdText/topContentAd | 文章页顶通 | S-T1 |
bottomContentAdText/bottomContentAd | 文章页相关推荐上方 | S-T2 |
afterRelationAdText /afterRelationAd | 相关推荐后方 | S-T3 |
示例
java
@JavascriptInterface
public void onConfig(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
JSONObject config = new JSONObject();
config.put("fontSize", "normal");
handler.complete(config);
}