For AI agents: the complete documentation index is available at /next/zh/llms.txt, the full documentation bundle is available at /next/zh/llms-full.txt, and this page is available as Markdown at /next/zh/api/lynx-devtool-native-api/cdp-event-listener.md.
Lynx
  • 简体中文
  • 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 字符串。

    数据格式

    字段类型说明
    methodstringEvent 名称,请参考 CDP
    paramsobjectEvent 参数,请参考 CDP

    例如,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
        }
      }
    }

    使用示例

    使用步骤

    1. 实现 CDPEventListener
    2. 获取 LynxBaseInspectorOwner 实例
    3. 调用 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;
    
    @end
    TestCDPEventListener.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);
    }
    
    @end
    ViewController.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

    除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。