背景
之前已经写过一篇关于文章详情和问答详情通信文章,目前由于需求优化,更新文章问答相关的通信协议,所以接入了文章详情和问答的需要同步更新协议。 2022/04/17,问答协议编写完成。
文章地址:http://www.debuglive.cn/sob/1513413753380597761,把文章id拼接进去就行了。 问答详情地址:http://www.debuglive.cn/sobwenda/问答id
阳光沙滩Android客户端下载地址:https://wwm.lanzouy.com/iB8Di0377vze
统一协议
Android端通信方法callSobNative
具体的使用方式
通信对象:
public class AndroidtoJs extends Object {
private CallBack mCallBack;
public AndroidtoJs(CallBack callBack) {
mCallBack = callBack;
}
// 被JS调用的方法必须加入@JavascriptInterface注解
@JavascriptInterface
public void callSobNative(String msg) {
LL.d("web$msg");
//收到webview的信息,回调,call back就是普通接口
if (mCallBack != null) {
mCallBack.recMsg(msg);
}
}
}
web记得注册对象
javaScriptEnabled = true
//注入对象DebugApp
vb.webView.addJavascriptInterface(mAndroidJs, "DebugApp")
下面是各种协议,web只负责把数据传递给客户端,客户端收到协议之后通过原生实现,各自实现不同的ui吧。
//104,点赞,点赞接口需要文章id
{
"protocolCode":104,
"data":{
"articleId":"1513413753380597761"
}
}
//101,打赏
{
"protocolCode":101,
"data":{
"articleId":"1513413753380597761"
}
}
//102,评论文章
{
"protocolCode":102,
"data":{
"articleId":"1513413753380597761"
}
}
//103,回复评论,回复评论的子评论
{
"protocolCode":103,
"data":{
"articleId":"1513413753380597761",
"parentId":"963383225231605760",
"beUid":"1284274686481473536",
"beNickname":"YanLQ"
}
}
//105,web点击图片,通知原生显示图片
{
"protocolCode":105,
"data":{
"imageUrl":"https://images.sunofbeaches.com/content/2022_04_16/964818391506354176.png"
}
}
//问答106,写答案
{
"protocolCode":106,
"data":{
"wendaId":"1515139201881927681"
}
}
//问答点击图片,也是105
//问答回复评论、子评论,107
{
"protocolCode":107,
"data":{
"wendaId":"1515139201881927681",
"parentId":"964873453335216128",
"beUid":"1139423796017500160",
"beNickname":"工头断点"
}
}
原生调用web
1:更新打赏列表 原生通知webview,更新,其实是原生:通知web调用一次加载打赏列表的接口。
通知更简单了:
override fun startObserve() {
viewModel.sendPriceMsg.observe(this) {
//当我们打赏成功了,通知webview,更新打赏列表
//nativeCallUpdateReward,这是我们在web中定义的方法。
callJs("nativeCallUpdateReward", "")
}
}
private fun callJs(name: String, args: String) {
//构造一个js通知,load一下就好了。
val url = "javascript:$name('$args')"
webView.loadUrl(url)
}
2,当评论(回复评论)成功后,客户端需要通知web更新评论数据
//通知webview,更新评论列表
callJs("nativeCallUpdateComments", "")
private fun callJs(name: String, args: String) {
val url = "javascript:$name('$args')"
vb.webView.loadUrl(url)
}
3,当问答编写答案,或者回复某个答案(评论)之后,你需要通知web更新回答列表
和上面一样,直接webview加载js即可。
callJs("nativeCallUpdateWendaComments", "")
总结
上一个版本的通信协议web调用原生的全部作废,需要使用新协议callSobNative
,只需要注册这个方法,对比老版本注册了多个方法,只需要拿到消息之后json转model即可,然后根据code转发不同功能。
问答的协议也是callSobNative
,只是code不同,到时候再更新吧。(4-17更新,同步升级App)
这样你就有了原生和web通信经验,以后面试也不用怕答不出了~