你的“App”本可以只是个网页(所以我帮你改好了)
Your 'app' could have been a webpage (so I fixed it for you)

原始链接: https://danq.me/2026/07/09/your-app-could-have-been-a-webpage/

由于表演艺术学校强制要求用户必须下载一款臃肿、充斥广告且带有重度追踪功能的应用程序,才能查看基础的行程单,作者决定亲自“修复”这一体验。 作者指出,对于本质上只需通过网页呈现文本、图片和 PDF 的内容,强制用户安装一个 124MB 的应用程序是非常荒谬的。在通过拦截网络流量对该应用进行逆向工程后,作者发现该应用仅仅是通过获取 JSON 数据来显示信息,而这些信息完全可以轻松地部署在标准网页上。 由于无法忍受该应用的反用户功能——特别是数据追踪和不受欢迎的“励志”广告,作者编写了一个简单的 Ruby 脚本来抓取行程数据。随后,作者为所在团队搭建了一个私有、轻量且易于访问的网页。通过绕过该应用程序,作者用一个仅 0.05MB 的网页取代了原本臃肿且侵入性强的工具,该网页不仅支持打印、搜索,还能在任何设备上运行。 作者总结道,虽然某些任务确实需要专门的应用程序,但“应用文化”已经走得太远了,强制用户为那些由开放网络提供服务会更好的内容去安装软件。

本次讨论聚焦于人们对服务“应用程序化”日益增长的不满——即企业强迫用户为本可通过响应式网页轻松完成的简单任务下载独立的应用程序。 **核心论点:** * **支持网页的理由:** 开发人员强调,Web 应用具备平台独立性,无需通过应用商店审核,可即时修补漏洞,并为用户提供更多控制权(如使用扩展插件、屏蔽广告)。许多人认为“应用文化”是一种营销驱动的趋势,旨在窃取用户数据、绕过广告拦截器,并通过强制通知增加用户粘性。 * **支持原生应用的理由:** 原生应用的支持者认为,与漏洞多、臃肿的 Web 应用相比,原生应用性能更佳,具备更出色的系统集成度(如小组件、后台任务),并能提供更可靠的离线功能,体验质量更高。 * **用户视角:** 虽然“技术熟练”的用户更青睐网页,但许多普通用户发现应用程序更易于发现,且作为主屏幕图标更便于管理。苹果和谷歌被指责有意让“添加到主屏幕”的操作变得困难,以保护其应用商店的收入来源。 * **结论:** 这一分歧凸显了开发者自由/用户隐私(Web)与平台优化、高参与度体验(App)之间的矛盾。
相关文章

原文

Why is this an “app”?

This summer, the kids’ performing arts school are singing and dancing in a show at Disneyland. We’re all very excited, but my excitement, at least, was muted a little when I was told to install the “Travelbound” app in order to get access to the itinerary, travel arrangements, and accommodation details.

Fuck that noise. This should have been a webpage. Why do you want me to install a(nother) shitty app just to tell me something that could have been a (smaller, faster, more universally-accessible) document?

Screenshot of an Android app showing a summary itinerary: times for a 'ferry crossing', 'check in at your hotel', 'coach driver accommodation', 'disney's hotel cheyenne', and 'welcome gala', each with an attractive but generic photo.
I’m not remotely exaggerating. This app is literally text, images, and links to PDF files, delivered via the Web.

There only seem to be two things that this “app” does, that a webpage might not have, and they’re both anti-features:

  1. It reports tracking data associated with your Google Account back to the developers.
  2. It shows you advertisements (which they call “inspirations”) for other trips organised by the same agency.

Fuck. Everything. About. That.

A webpage would have been so much better. Unlike this app, a webpage can be…

  • Copy-pastable
  • Printable
  • Saveable
  • Bookmarkable
  • Searchable
  • Usable on virtually any device
  • (Potentially) more-accessible

I’m annoyed enough… that I’m going to “fix” this app. Hold my beer.

Intercepting app traffic

It’s been a while since the last time I reverse-engineered an Android app from its network traffic, so I had to brush-up on the best way. Here’s what I ended up doing.

  1. Created a new virtual device in Android Studio’s Virtual Device Manager.
  2. Tested adb shell was working and used rootAVD to root it: ./rootAVD.sh system-images/android-33/google_apis_playstore/x86_64/ramdisk.img.
  3. Performed a cold boot, ran Magisk, and tweaked its settings to automatically grant su access to any app that asked.
Screenshot showing the HTTP Toolkit application running on both MacOS and an emulated Android mobile, with User Trust and System Trust enabled.
All your traffic are belong to me. At this point, it’s just like running Wireshark or TCPdump.
  1. Ran HTTP Toolkit and told it to intercept AVD traffic. It installed a (fake) VPN provider, routing the phone’s traffic through the proxy.
  2. Installed the Travelbound app from the Play Store.
  3. Configured HTTP Toolkit to proxy only the Travelbound app (more signal, less noise).

With only a couple of minutes experimentation I discovered that the app works by concatenating the username and password and using it in a URL of the form:

https://travelbound.api.vamoos.com/api/itineraries/{username}-{password}

This returns a pile of JSON which, with a little interpretation, can be seen to represent all of the content the app “shows”. E.g., there’s:

  • an array containing each leg of the itinerary,
  • an array containing all of the “inspirations” advertisements to show you,
  • a cross-referenced array containing all of the files (images etc.) that are referenced by the other sections, etc.
Firefox showing a JSON document, focussing on a section about 'Your Ferry Crossing' with some accompanying HTML.
They’re clearly producing HTML code anyway… so again, I ask: why isn’t this a webpage?

A little experimentation showed me that the S3 image URLs were being delivered with moderately-short expiration times, so the JSON needs re-fetching periodically even if the content hasn’t been changed.

Turning it into something better

Now I had everything I needed to make something… better. I wrote a Ruby script that runs on a Cron schedule to pull the latest JSON and use it to build a HTML page.

I chose to have it completely skip over the “inspirations” (“overlayRows” in the data schema) and just list:

  1. the items from the itinerary and
  2. all of the files not referenced by the inspirations nor itinerary, (a lazy way to collate the PDF download links).

Then I hosted the page, protected by a password: the same one my tour group were given in the first place. I included the raw JSON it used in <details> elements so it can be checked if e.g. there are bits of the schema I didn’t see but that might appear later.

Screenshot of a simply-styled web page showing the same information about the ferry, along with a photo from its deck.
My web page isn’t as “pretty” as the app from which it “borrows” its information. But it’s a fraction of the size and gets all of the Web’s standard features for free.

Some people like an “app”, and that’s… fine, I guess. But some apps could have been a webpage. And especially where, like this one, the content they deliver is already written in HTML and delivered over HTTP… they should be a webpage, right?

I can’t understand how we got to this place with “app culture”! Software companies are happy to make their lives harder (and more expensive: deploying to the big app stores isn’t free!), in order to deliver HTML content to fewer people and with fewer features than if they just published directly to the Web in the first place!

There are (some) tasks for which an “app” is absolutely the right choice of medium. Travelbound is not one of them.

But at least I (and the rest of our group, whom I’ve shared it with) now get the choice about how we access this content. Either a 43MB app (ballooning to 124MB when it’s finished downloading extra content) with tracking and advertisements… or a 0.05MB web page (with an optional extra 35MB of images) that provides more features and works on more devices. I know which one I’ll be using!

× × × ×
联系我们 contact @ memedata.com