普通视图

发现新文章,点击刷新页面。
昨天以前obaby@mars

成也UNI,败也UNI

作者 obaby
2026年9月15日 15:06

在不久的以前,写代码还需要大量人力的时候,跨平台框架无疑是最好的选择。不管是uni还是flutter,都是为了这个而生的,当然这不是最早的跨平台框架,在这之前还有很多其他的框架,可能大家都不曾听说过,我简单介绍个我用过的两个:b4a(basic for andorid),我最开始并不怎么喜欢写(再问就是不会)安卓的java代码,想着偷懒,不要去弄安卓那一套,偷懒玩了下b4a,这也是最开始做findu的时候最朴素的想法;另外一个是delphi的firemonkey框架,这个东西体验的更早,刚来青岛的时候,为了查询公交基于这个东西做了个公交查询的app,最后跑在了ios上。

这些框架,不能说生不逢时,只能说基础功能还是稍微有些欠缺,生态不完整,例如地图、Im等组件的支撑缺失,这也是最终为什么直接采用原生oc和java开发了最早版本的findu

然而,随着ai的发展,跨平台已经不再是一个主要的投入成本了。借助ai的能力可以快速复刻一个app到其他的平台,以前是点子不值钱,现在技术也不值钱了。跨平台唯一的好处仅剩下代码的可维护性,一套代码通吃各个平台,相对来说代码维护和bug修复的一致性会比多平台更加便捷。

可能这个发展偶尔也会有人会高喊暂停:

2026 年 8 月 11 日,美国参议员伯尼·桑德斯(Bernie Sanders)日前致信 OpenAI CEO Sam Altman、Anthropic CEO Dario Amodei 和 Meta CEO Mark Zuckerberg,要求三家公司暂停 AI 开发,并停止继续构建人类无法控制的 AI 系统。

至于暂停或者不暂停,现有的技术能力已经足够解决日常的技术问题和满足开发需求。也基于这种现有的技术能力,最近重新重构了findu,开发了新的portable claw。这里我想说的就是这个portable claw,借鉴之前的开发经验,想着一套代码解决所有问题,采用的架构依然是uniapp,不过不是uniappx。

按照uniapp 官方文档的说法,x其实是下一代,能达到原生的性能。我在开始的时候错误的评估了app在ios上对于性能的消耗,并且初期测试的时候主要也是基于ios模拟器测试,真机测试相对来说比较少,数据量也没有达到日常使用账号的数据量。导致对于app在ios真机上的性能过于乐观,数据量大了之后,会话窗口的绘制就成了一件痛苦的事情。

 uni-app 在 iOS 真机上的瓶颈,不只是「聊天列表用了 WebView」。换成 nvue,只是把聊天 UI 从 WKWebView 换成 Weex 原生控件,业务、流式更新、页面栈、桥接仍在 JS 容器里。所以能减轻长列表掉帧,但到不了 Swift + UITableView 那种原生体验。


uni-app 在 iOS 真机上真正卡在哪

1. 双运行时一直同时活着

本项目 iOS 不是「整 App 都是 nvue」:

  • 聊天:pages/chat/ios.nvue(Weex)
  • 状态 / 设置 / 登录 / 订阅:仍是 Vue + WKWebView
  • 业务宿主:stores/iosChatHost.js 挂在 App.vue 的 JS 服务层

chatRoutes.js 里写得很清楚:Vue 宿主和聊天 nvue 作为 subNVue 同时常驻,Tab 只挪 overlay。真机上等于:

  • 一套 WKWebView(设置等)
  • 一套 Weex(聊天)
  • 一套 5+ Runtime / Pandora

内存、启动、Tab 切换都比单进程 UIKit 贵。Android 用 index.vue 还能凑合,iOS 对 WebView 和后台 WebContent 更狠,真机掉帧、杀进程都更明显。

2. 主路径仍是 JS:解析、裁剪、再塞回 UI

Gateway / Hermes 事件、历史、tool 卡、附件、TTS、权限,全部在 JS 里做。nvue 不能 import gatewayMedia@noble/* 等,否则 Weex 白屏。于是每条流式更新都是:

JS 宿主算完 → cloneMessage 裁成短摘要 → uni.$emit 整份快照 → nvue 再 v-for 刷 <list>

原生工程则是:SSE 回调直接改 ChatMessageUITableView 按行刷新。中间没有「整窗 JSON 快照」。

3. 聊天数据本身就重

长会话卡、空会话不卡,文档里已经定性:推给 nvue 的是「当前窗口」的完整 JSON,最后十几条常带着大段 tool 输出和 data: 图。你们被迫:

  • 窗口大约 16 条,上限约 48
  • 正文截断、不传 toolCards、不传 data: 预览
  • 流式尽量 splice 一条,避免整表替换

这是在 迁就 Weex 序列化 + 布局,不是产品想要的完整列表。原生 ChatTableView 可以按 cell 复用、按行测高,不必先把历史砍成摘要。

4. 5+ / Weex 桥是同步税

例如内购注释:不要和 StoreKit 弹窗同时触发 Weex 布局,否则会 同步 调 getSafeAreaInsets 卡住。真机上 plus.*、相册、文件、支付、安全区,都会在 JS 线程和主线程之间来回。原生是直接调系统 API。

5. Weex 不是 UIKit

<list> / <cell> 看起来像原生列表,实际是:

  • JS 虚拟 DOM → Weex 原生节点
  • 能力子集(布局、富文本、手势冒泡都弱)
  • 本页还用了 list-flip 倒序列表 才能贴底,属于 Weex 滚动模型的绕路
  • Markdown、代码块、动态高度,Weex 测高和复用远不如 UITableView.automaticDimension

nvue 缓解了什么,为什么仍不够

nvue 确实缓解了「用 webview <scroll-view> 画几百条气泡」这一层:原生 view 绘制、有限回收、少一次 DOM/CSS。

它没有拿掉下面这些,所以仍然不是原生 App:

还在的成本 说明
双引擎
聊天 Weex + 其它页 WebView,Tab 常驻两套页面
快照协议
宿主和 nvue 用事件传 JSON,流式时反复 clone / emit / diff
瘦 UI
重逻辑不能进 Weex,热点路径仍在 JS
列表策略
必须截断、限窗,完整历史会把 <list> 打爆
容器
DCloud 基座、模块、plus、描述文件,启动和权限都比单 target Swift App 重
表达力
做不到原生那种 cell 精细复用、TextKit/AttributedString、键盘 inset、分屏

所以:nvue 是「聊天绘制层换引擎」,不是「App 换成原生」。 瓶颈从「WebView 排版」变成「JS 宿主 + 跨运行时同步 + Weex 列表模型」。对 Agent 聊天这种 高频流式、变高 cell、大 tool 输出 的场景,第二套瓶颈一样会被打满。

和原生工程差在哪(同一产品)

原生 native_ios 是单一 Swift 进程:UITableView + 按条 merge、键盘按窗口算 inset、没有 uni.$emit 快照窗。uni-app 即使用 nvue,也还是「JS 算完再通知另一套 UI」。

一句话: nvue 能让短会话、轻气泡比纯 Vue 页跟手;真机长会话、流式、工具卡、多 Tab 同时在时,瓶颈在运行时架构,不在某一两个 CSS。要到原生手感,只能像现在这样离开 Weex/WebView,用 UIKit/SwiftUI 自己画列表。


以上内容是基于ai的总结,基本也就是这个情况,尤其是对于这种可变cell+列表的绘制,性能就更是问题了,哪怕独立出来nvue页面,js主进程还是会卡住其他的操作。

相反,在andorid设备上就不会存在这个性能瓶颈,虽然都是uniapp框架,在安卓设备上流畅度基本能达到原生的效果。

实际真机效果对比:

上面的视频是 进入app之后,首先点了状态,后续其实又点了其他的tab页,但是此时已经卡死了。

上面的视频是基于swift的ios原生项目。

虽然页面功能一样,但是绘制的效果和性能却是天差地别。

当然,uni框架还有另外一个缺点就是,一些与系统打交道的东西还是需要原生插件支持,例如ios 的定位回调,ios的healthkit(闺蜜圈APP),安卓的各种系统设置等等,多数都是基于现有的uni插件来实现,所以,findu虽然是页面样式基础功能跨平台了,底层依然是基于原生的定位组件,系统操作组件,以及badge组件来堆起来了app的核心功能。

至于portable claw,则是需要tts引擎,很不幸baidu的tts引擎超过了200m,导致无法使用uni的云打包(打包也可以,交钱就行)。

这个问题,其实我之前在其他的文章中也提过。

为了解决云打包的问题,我是用uni的本地打包,基于xcode项目来实现打包,这也是ios版本发布的必经流程,这个操作其实也不算简单,需要配置一系列的东西,包括证书 mp文件等等。

这一系列的操作都是为了能够复用uni的代码,不用重新写。

只是,现实狠狠地给了我一巴掌,告诉我这个东西虽然可行,但是不够完美,或者说达不到自己的心理预期。作为一款app,这个运行效率是无法忍受的,这就有了原生的swift的ios项目:

说了这么多,并不是说uniapp一无是处。

在不需要与系统底层交互app中,uni无疑依然是开发效率和跨平台的最优选择,继承了基础的三方登录、内购、分享、地图等等能力,这些能力对于多终端的适配的确可以减少大量重复的工作。

不过,如果你需要一个高性能的app,那么最好的办法就是直接原生开发(有了ai,一切都简单了),至少目前我这里的优化已经到了自己的能力极限了。

成也UNI,败也UNI。

附简要跨平台框架性能对比(基于cursor总结)仅做参考:

Portable Claw – 手机龙虾客户端

作者 obaby
2026年8月20日 09:19

Portable AI 是面向自建 AI Agent 的移动端客户端,支持连接 OpenClaw Gateway 与 Hermes Agent API Server,在 iPhone以及Android手机上与 AI Agent 进行多轮对话、语音交互与文件发送。

【核心功能】
• 会话聊天:多会话切换、历史记录与流式回复;支持会话重命名与删除;工具调用结果以卡片展示
• 多类型服务器:OpenClaw(Gateway WebSocket)与 Hermes(/v1/ws + REST);配置地址、端口与 Token,自动重连
• 图片与文件:从相册选图或通过 iOS 分享扩展发送附件给 Agent
• 用量统计:Token 消耗、费用趋势与会话排行可视化(OpenClaw 更完整;Hermes 为部分能力)
• 龙虾状态:健康检查、当前模型与连接状态一目了然
• 服务器信息云备份:服务器配置加密上传,多设备一键恢复(含服务器类型等字段)

【Pro 会员(可选订阅)】
• 语音输入(ASR):按住麦克风说话,松手即发送
• 语音播报(TTS):Agent 回复可自动朗读,设置页一键开关
• 每月固定额度(非无限量),详见应用内订阅页说明
• 文字聊天无需登录;购买 Pro 需注册账号

【使用前提】
本应用是外部客户端,不提供托管的 AI 对话服务。您需要:
1. 自行运行或有权访问一台 OpenClaw Gateway 或 Hermes API Server
2. 在应用中选择服务器类型,并配置地址与 Token
3. 首次连接远程 OpenClaw Gateway 时,在服务器端批准设备配对(Hermes 按服务端鉴权配置)

官网地址:

https://portableai.ai

https://portableai.cn

 

 

迟钝

作者 obaby
2026年9月2日 10:59

总是说,自己缺少锐利的目光,深度的思考。在浪潮滚滚向前的时候,自己却固步自封,停在了那个地方。终于,洪峰过后,自己才想起来该去赶潮了。

所谓的人工智能,一轮轮的迭代,一代代的升级。ai变得越来越智能,各种工具也层出不穷,变得越来越先进。当然,跟着升级的还有价格,不再那么平易。龙虾潮退了,自己才开始玩龙虾,大家都开始玩够了harnes,自己才姗姗来迟,开始初体验。

互联网上工具一堆了,自己才想起来要开发个应用。虽然网上已经有一堆应用了,还是忍不住想要自己去开发一个。重复造轮子,这就是所谓的ai的正确用法。唯一的不同,这次开发的是付费应用,最开始的时候,也不过是想复刻一下自己常用的功能。能满足自己在移动端处理一些日常的事务就可以了,简而言之就是让龙虾去爬公众号的文章。

在实现的过程中,总觉得功能太单薄,不断的丰富功能和优化体验。从单一的龙虾客户端,变成现在龙虾 harnes多端客户端。当然,因为app购入了第一个ai域名,protableai.ai

不得不说,.ai后缀的域名是真的贵,当然,除了.ai,我还入了portableai.cn

为了能够上架苹果应用商店,期间改了无数次的名称、截图等等metadata信息,苹果认为包含claw字段的app信息,都会侵犯open claw的商标权,在一次次的更新优化之后,我连最开始的图标也放弃啦,从龙虾变成了章鱼,毕竟都说🐙是外星生物,应该会更聪明,更智能吧。

在改了无数次之后,我想据理力争,连ai都劝我说,尽量不要与苹果的审核员争执,只会激化矛盾。让你改,你就改吧!

很多的东西,怎么说呢。多数的时候就是路边的野草,连一个正眼看的机会都得不到,谁又会在乎路边的那些野草呢。

产品一样,人也一样,不管有没有人看,剩下的也只有,自顾自美丽了。

网站:https://portableai.cn

苹果:https://apps.apple.com/cn/app/portable-claw/id6779501378

安卓:https://app.zhongxiaojie.cn/app/portabl-claw/android/

买垃圾

作者 obaby
2026年8月31日 15:12

有时候,看到好玩的东西,喜欢的东西,总是太容易心动。心动之后,就容易冲动,一旦冲动的结果就是手里又多了一件可能只用一次的东西。这种日抛型的东西,一旦买了又不能日抛,慢慢的就成了累赘。

收拾东西的时候,一件件的拿出来,不穿的衣服,不用的东西。衣服拿在手里,总是觉得,万一哪天还会穿呢;东西拿在手里,总是觉得,万一哪天还会用呢。

这些东西就这么扔在那里,过了一天又一天,一个月有一个月,一年一又一年,最后要么被扔到了垃圾桶,要么被扔进了一个更深的角落里。

那些买了没穿过几次的鞋子,还有就穿过一次的衣服。留着可惜,扔了浪费。

然而,这还不是最浪费的,还有一堆买了放在那里吃灰的东西。买的时候,总是觉得会用的到的。然而买了之后,就从此沉寂了。用了十年的mac mini,硬盘坏了之后,换了个硬盘,装了ubuntu server版,放在机柜里当服务器用,也就是现在的博客服务器。

总觉得mac 会常用,去年买的mac mini 放在显示器后面,到现在开几次数一只手都数的过来。前几天才发现,并不是mini 带不动两个4k显示器,是hdmi线的问题,导致屏幕刷新率锁死在了30帧上,换了dp线之后两块4k显示器都没问题了。但是,日常常用的还是windows。

数年前买的三星的360摄像机,实际在出去玩的时候也就用过一次,后来就躺在机柜里,再也没见过太阳。

360gear 实际视频效果:

前段时间,想买个所谓的ai智能眼镜,买的时候,看着有国补乱七八糟优惠加起来,到手700来块钱。从二手东下单买了华为的智能眼镜,等实际使用的时候,发现没有摄像功能,然而,这才是自己最想要的功能,至于ai什么的反而没那么在乎。过了七天无理由,想要出掉的时候,爱回收评估回收价格200,这什么都没用,莫名其妙丢了500块钱也是真的傻逼。

从淘宝重新入手一个小米的二手。

两个眼睛对比,下面的是小米。这个倒是有了摄像功能了,但是感觉续航能力是个问题,实际录像使用可能也就能用个半小时左右。

并且貌似不用的时候也在掉电。一周左右,掉了50的电。

拍照效果,室内:

室外:

视频效果:

至于买这个东西有什么用?其实我也不知道有什么,大概率又是放在某个角落落灰的东西。

有的时候,只是无聊了,不知道想干什么。或者能干什么,想释放点多余的精力而已。

买垃圾,买的时候,看着光鲜亮丽的东西,等到手之后发现也不过就那么回事,变成了手里的垃圾。文章中的那些衣服,鞋子,虽然不贵,但是买了之后就成了累赘。有的也就适合去拍个写真用一下,至于平时穿,那自然穿不了一点。而各种所谓的玩具,到手之后玩了几天甚至后悔了,不该买这个东西。不管是物,还是人,都是一样的,没有太多的分别,你喜欢ta,也不过是因为爱而不得,更何况太多的人都会喜新厌旧。

鸡肋鸡肋……

色衰而爱弛 爱弛则恩绝。

❌
❌