如何让WearOS Android应用接收React Native原生模块消息?
以下是针对该问题的排查和解决步骤:
核对消息路径一致性
确保Android端sendMessage使用的路径与RN端注册监听的路径完全匹配,包括大小写、斜杠前缀(例如/wear/data_sync)。很多场景下通信失败都是因为路径拼写或格式不一致导致的,建议两端分别打印路径日志进行核对。确认RN监听器注册时机
在RN端尽早完成监听器注册,比如在根组件的useEffect中注册(依赖数组设为空确保只执行一次),避免Android端发送消息时RN侧尚未完成监听初始化。注册完成后打印日志标记,确保发消息前RN侧已准备就绪。检查WearableListenerService配置
如果Android端使用WearableListenerService,务必在AndroidManifest.xml中正确声明服务,包含指定消息接收动作的intent-filter,并设置exported="true":<service android:name=".WearMessageListenerService" android:exported="true"> <intent-filter> <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" /> <data android:host="*" android:pathPrefix="/your-target-path" android:scheme="wear" /> </intent-filter> </service>注意
pathPrefix要与实际使用的消息路径匹配,也可以暂时用*测试是否能接收所有路径的消息。验证消息发送的目标节点
Android端调用sendMessage时,明确指定RN设备的节点ID,避免使用null广播。可以通过NodeClient.getConnectedNodes()获取所有连接节点,打印节点ID和名称,确认消息发送到了正确的目标设备。调试RN模块的底层回调
若使用第三方RN模块,可临时修改模块的Android原生代码,在onMessageReceived方法中添加日志,确认原生层是否收到消息:@Override public void onMessageReceived(MessageEvent messageEvent) { Log.d("WearComm", "Native received message: " + messageEvent.getPath()); // 模块原有转发到RN的逻辑 }如果原生层能收到但RN层收不到,说明模块的JS桥接逻辑存在问题,需要修复回调转发代码。
确认应用签名与ID完全一致
再次核对Android和RN应用的应用ID(applicationId)和签名证书完全一致,Wear OS对签名要求严格,即使debug签名不同也会阻断通信。可通过签名工具查看两个应用的指纹是否匹配。
内容的提问来源于stack exchange,提问作者claired4l

