2026/6/7 0:20:54
网站建设
项目流程
青岛专业网站营销,软件下载网站模版,网页设计实验报告总结,软件技术毕业后能做什么工作你说的“空”不是空#xff0c;你说的白是什么白#xff1f; 前排广告位#xff0c;欢迎访问我的个人网站#xff1a; https://hixiaohezi.com 最近在开发一个混合 App 项目时#xff0c;遇到了一个让我和安卓同事都摸不着头脑的问题。简单说就是#xff1a;我在 H5 页面…你说的“空”不是空你说的白是什么白前排广告位欢迎访问我的个人网站 https://hixiaohezi.com最近在开发一个混合 App 项目时遇到了一个让我和安卓同事都摸不着头脑的问题。简单说就是我在 H5 页面调用 JSBridge 方法时明明传了参数但安卓端却接收不到。整个场景是这样的在 App 的 WebView 中打开一个 H5 页面页面上有个关闭按钮点击后通过 JSBridge 调用原生的closeH5方法。由于业务需求iOS 和 Android 需要不同的参数iOS: 传空字符串Android: 传 JSON 字符串{showAdPage: true}序列化后问题出现代码写得很清晰H5 端的逻辑大概是这样functionhandleClose(){constisAndroid/Android/i.test(navigator.userAgent);constparamisAndroid?JSON.stringify({showAdPage:true}):;console.log(调用 closeH5参数:,param);window.JSBridge.closeH5(param);}自测时我在 Chrome DevTools 里打开了 WebView 调试清清楚楚看到控制台打印调用 closeH5参数: {showAdPage:true}一切正常。但是安卓同事说他那边接收到的参数是空的。我第一反应怎么可能第一轮排查你是不是没刷新这种我这没问题你那有问题的情况很容易陷入甩锅状态。为了避免无谓的争论我先自查了一遍参数确实传了控制台打印证据确凿JSBridge 调用正常没有报错方法确实被调用了Android 判断没错isAndroid返回true进了正确的分支好H5 端没问题。那是不是安卓那边的锅沟通的陷阱什么叫为空这里有个小插曲值得单独说一下。最开始安卓同事跟我说参数为空的时候我脑子里想的是空字符串因为从前端视角看空通常就是指空字符串或者null或者undefined但我传的是字符串所以我以为他说的“为空”指的就是空字符串。但其实他说的为空指的是null。这个语义差异直接导致了我们沟通了好几个回合都没找到重点。我以为他接收到了空字符串只是业务逻辑没处理好他以为我没传参数导致原生解析失败。教训跨端协作时别用口头描述变量的值直接发截图或者共享屏幕看代码。“为空”、“没值”、“undefined” 这些词在不同语言、不同上下文里含义都不一样很容易造成信息不同步反而浪费时间。第二轮排查现场办公既然远程说不清楚我直接走到安卓同事工位旁边准备一起现场排查。“来来来你打印一下参数看看。”他在原生代码里加了打印funcloseH5(param:Any?){Log.d(JSBridge,接收到的参数:$param)// ...后续逻辑}我在手机上点击关闭按钮H5 控制台调用 closeH5参数: {showAdPage:true}Android Studio 的 Logcat接收到的参数: nullnull这下我愣住了。关键发现null ≠ 空字符串我盯着那个null看了两秒突然意识到不对劲“等等你这打印出来的是null不是空字符串吧”安卓同事“对啊是null啊。”我“那就不对了如果我 H5 传的参数有问题比如传了undefined或者啥都没传你那边应该接收到空字符串才对怎么会是nullAndroid 会自动把空字符串转成null吗”他愣了一下“这……应该不会吧”这个发现很关键如果是前端传参问题原生接收到的应该是空字符串或其他值而不是null。null通常意味着变量压根没被赋值或者类型不匹配导致解析失败。找到真凶类型声明的锅我让他把接收参数的类型改一下试试// 之前funcloseH5(param:Any?){Log.d(JSBridge,接收到的参数:$param)}// 改为funcloseH5(param:String){Log.d(JSBridge,接收到的参数:$param)}再跑一次Logcat接收到的参数: {showAdPage:true}成功了复盘为什么Any?会导致参数丢失后来我们分析了一下可能的原因是JSBridge 的参数传递机制H5 传给原生的参数本质上是通过 JSON 序列化后传递的字符串Kotlin 的Any?类型过于宽泛当声明为Any?时Kotlin 可能会尝试将接收到的 JSON 字符串解析为其他类型对象、数组等如果解析失败就会返回nullString类型明确了意图直接声明为String告诉编译器我就要字符串就不会有歧义了当然这只是我们的推测具体实现可能因 JSBridge 库而异。但教训是明确的跨端通信时类型声明要尽可能明确避免使用过于宽泛的类型。总结这次 Bug 排查的收获看到预期外的值先质疑假设null和空字符串不一样这个差异往往是关键线索跨端问题要看两端的代码不能只看 H5 或只看原生有时候问题出在握手环节类型声明很重要尤其在跨语言通信时明确的类型能避免很多隐蔽的问题现场排查比远程高效有条件的话坐一起看代码比发截图快多了最后提醒一下做混合开发的同学当 H5 和原生的打印结果不一致时别急着甩锅先看看数据在两端的形态是否一致。很多时候问题出在中间的翻译环节。一个看似简单的参数传递背后藏着类型系统的细节。技术债往往就是这样一点点积累起来的。欢迎访问我的个人网站 https://hixiaohezi.com