#CDPEventListener
一个协议(或接口),用于接收 DevTool 发送的 CDP Event 消息。
#语法
#iOS
LynxBaseInspectorOwner.h
@protocol CDPEventListener <NSObject>
@required
- (void)onEvent:(nonnull NSString *)event;
@end#Android
CDPEventListener.java
public interface CDPEventListener {
void onEvent(String event);
}#参数说明
event: 包含 CDP Event 内容的 JSON 字符串。
#数据格式
例如,Page.screencastFrame 的数据如下:
{
"method": "Page.screencastFrame",
"params": {
"data": "...",
"metadata": {
"deviceHeight": 200.0,
"deviceWidth": 100.0,
"offsetTop": 0.0,
"pageScaleFactor": 1.0,
"scrollOffsetX": 0.0,
"scrollOffsetY": 0.0
}
}
}#使用示例
#使用步骤
- 实现
CDPEventListener。 - 获取
LynxBaseInspectorOwner实例。 - 调用
addCDPEventListener方法,添加消息监听。
#代码示例
下列示例代码添加了一个名为 TestListener 的 CDP Event 监听器,并通过 invokeCDPFromSDK 发送一条 Page.startScreencast 消息,开启屏幕截图功能。
最终 TestCDPEventListener 会收到 Page.screencastFrame 消息。
#iOS
TestCDPEventListener.h
#import <Lynx/LynxBaseInspectorOwner.h>
@interface TestCDPEventListener : NSObject <CDPEventListener>
@property(nonatomic, readonly, nonnull) NSString *name;
- (instancetype)initWithName:(NSString * _Nonnull )name;
@endTestCDPEventListener.m
#import "TestCDPEventListener.h"
@implementation TestCDPEventListener
- (instancetype)initWithName:(NSString *)name {
if (self = [super init]) {
_name = name;
}
return self;
}
- (void)onEvent:(nonnull NSString *)event {
NSLog(@"onEvent: %@", event);
}
@endViewController.m
#import <Lynx/LynxView.h>
#import <Lynx/LynxBaseInspectorOwner.h>
#import "TestCDPEventListener.h"
@interface LynxViewLifecycleClient : NSObject <LynxViewLifecycle>
@property(nonatomic, weak) LynxView* lynxView;
@end
@implementation LynxViewLifecycleClient {
TestCDPEventListener* _listener;
}
- (void)lynxView:(LynxView *)view didLoadFinishedWithUrl:(NSString *)url {
[self addCDPEventListener:@"TestListener"];
__weak __typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
__strong __typeof(weakSelf) strongSelf = weakSelf;
[strongSelf removeCDPEventListener:@"TestListener"];
});
}
- (void)addCDPEventListener:(NSString *)name {
__strong LynxView* view = self.lynxView;
id<LynxBaseInspectorOwner> owner = [view baseInspectorOwner];
_listener = [[TestCDPEventListener alloc] initWithName:name];
[owner addCDPEventListener:name withListener:_listener];
NSString *method = @"{\"id\":1,\"method\":\"Page.startScreencast\",\"params\":{\"format\":\"jpeg\",\"mode\":\"fullscreen\"}}";
[owner invokeCDPFromSDK:method withCallback:^(NSString *result){
}];
}
- (void)removeCDPEventListener:(NSString *)name {
__strong LynxView* view = self.lynxView;
id<LynxBaseInspectorOwner> owner = [view baseInspectorOwner];
[owner removeCDPEventListener:name];
}
@end
@implementation ViewController {
LynxViewLifecycleClient *_client;
}
- (void)viewDidLoad {
[super viewDidLoad];
// ...
_client = [LynxViewLifecycleClient new];
_client.lynxView = lynxView;
[lynxView addLifecycleClient:_client];
}
@end#Android
TestCDPEventListener.java
import android.util.Log;
import com.lynx.devtoolwrapper.CDPEventListener;
public class TestCDPEventListener implements CDPEventListener {
private final String name;
public TestCDPEventListener(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void onEvent(String event) {
Log.i("TestCDPEventListener", "onEvent: " + event);
}
}MainActivity.java
import android.os.Handler;
import android.os.Looper;
import com.lynx.devtoolwrapper.LynxBaseInspectorOwner;
import com.lynx.tasm.LynxView;
import com.lynx.tasm.LynxViewClient;
import java.lang.ref.WeakReference;
public class MainActivity extends Activity {
private TestCDPEventListener mTestCDPEventListener = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
lynxView.addLynxViewClient(new LynxViewClient() {
@Override
public void onLoadSuccess() {
addCDPEventListener(lynxView, "TestListener");
}
});
}
private void addCDPEventListener(LynxView lynxView, String name) {
LynxBaseInspectorOwner owner = lynxView.getBaseInspectorOwner();
if (owner == null) {
return;
}
mTestCDPEventListener = new TestCDPEventListener(name);
owner.addCDPEventListener(name, mTestCDPEventListener);
String method = "{\"id\":1,\"method\":\"Page.startScreencast\",\"params\":{\"format\":\"jpeg\",\"mode\":\"fullscreen\"}}";
owner.invokeCDPFromSDK(method, result -> {
});
Handler mainHandler = new Handler(Looper.getMainLooper());
WeakReference<LynxBaseInspectorOwner> weakOwner = new WeakReference<>(owner);
mainHandler.postDelayed(() -> {
LynxBaseInspectorOwner strongOwner = weakOwner.get();
strongOwner.removeCDPEventListener(name);
}, 10000);
}
}#兼容性
LCD tables only load in the browser