赞
踩
这么做的原理主要是让 PC 端和 客户端能发生通信,然后在客户端的每一个 Hybrid 网页注入一段模拟调用的 js.
做这样的功能,需要维护一个 socket 服务,PC端需要和这个服务器通信,客户端也需要,开发起来依旧是比较麻烦。但也算较好的解决了 本地模拟 的一些问题。
在开发上述功能的过程中,发现了 flipper 这个工具
flipper 提供了一个桌面客户端,然后这个桌面客户端提供了一个和手机客户端通信的机制,免去了 socket 服务的开销,依靠这个通信机制,我们可以把上述的功能复制过来
基于这个通信机制把 api 名称和 api 参数传到手机客户端上,然后再在客户端里注入的 js 调用相应的 api,无需再维护 socket 服务
###使用 flipper
希望全面了解 flipper 的可以上 https://fbflipper.com/
具体文档查看:flipper 文档
工程中就基于 flipper 开发了一个 api 调试的功能,以及获取当前 Hybrid 页面的客户端数据,下面有一个简单的示例,简单介绍一下接入流程和开发一个插件
###桌面插件
需要有简单 React 组件开发经验,不会的话,照葫芦画瓢 10 分钟也能搞定。
桌面插件是一个 React 组件,用来描述界面,接受发送数据
#####0.前置条件
下载 Node,Yarn
Node.js
Yarn
#####1.创建工程
创建目录,执行 yarn init,目录下会出现一个文件 package.json 注意 name得以 flipper-plugin- 开头
{
“name”: “flipper-plugin-myplugin”,
“version”: “1.0.0”,
“main”: “index.js”,
“license”: “MIT”,
“dependencies”: {}
}
#####2.开始编程
创建 index.js,在 index.js 里面可以编写自己的插件,一个简单的组件可能是这样。
这个插件有三个要注意的点
id 为 “myplugin”,id 很重要,桌面插件和客户端插件 id 一样的话才能发生通信
订阅了客户端 “clientMessage” 的消息
给客户端发送了 “getData” 的消息(稍后会在客户端中接收这个消息)
import {FlipperPlugin, Button, FlexCenter} from ‘flipper’;
export default class extends FlipperPlugin {
static title = ‘My Plugin’;
static id = ‘myplugin’;
static icon = ‘internet’;
constructor(props) {
super(props);
this.init();
}
init(){
this.state = {
data: ‘null’,
message: ‘null’
};
//订阅客户端发送的数据
this.client.subscribe(‘clientMessage’, res => {
if(res){
this.setState({message:res.message});
}
});
}
sendData(){
//给客户端发消息
this.client.call(‘getData’, {request:“”}).then(res => {
this.setState({data:res.data});
});
}
render() {
const {data, message} = this.state;
return (
点我调用 getData
{'getData 的内容是:' + data}
{'clientMessage 的内容是:' + message}
) } }const mainStyle = {
“margin-top”:60,
“flex-direction”:“column”
}
const commonStyle = {
margin: 20,
};
#####3.加载插件
我编写完桌面插件之后,按照 flipper 提示的方式进行配置,还是无法动态加载我写的插件,最后我是把 flipper 的源码拉下来,将插件工程放到了
flipper/src/plugins/ 文件夹下面,然后执行 yarn build --version --mac 在 dist 文件夹下直接打出包,再使用的。
我不确实这是我的问题还是 flipper 的问题。
这是成功加载起插件的图例,假如没有写对应手机客户端插件的话,是不会显示我们写好的 MyPlugin,所以接下来介绍怎么写一个对应的手机客户端插件
###客户端插件
#####0.依赖
当大家想接入一个 debug 相关的库的时候,可能会考虑说,不想把 debug 的功能带到线上去,有几种做法,大家自行选用
a.在代码中去判断一下,在恰当的时候,把 debug 相关的功能给关掉
好处是做起来很简单轻松
坏处是会在线上引入一个线上根本不需要的库,增大了包体积
b.在非线上的时候引入正式库,在线上包中引入 ‘no-op’ 库,‘no-op’ 库可以理解为正式库的一个空实现, 这里有一个讨论 关于 no-op 的讨论
好处是不会增大太多包体积,虽然还是要引入一个不必要的包
不好的地方可能就是如果官方没有实现 no-op 的库,就需要你自己写
例如:
debugImplementation ‘com.facebook.stetho:stetho-okhttp3:1.5.0’
releaseImplementation ‘com.zhihu.android.library:stetho-no-op:1.0.0’
这种方式似乎也是很多类似库通用的处理方式
c.第三种,新建一个文件夹,比如 flipper,在里面写相关初始化代码,通过某种方式执行这些代码,然后再在 sourceSets 加上 srcDirs 即可 下面的意思是在 mr 或者 debug 包中才加上 srcDirs
dependencies {
…
debugImplementation ‘com.facebook.flipper
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。