ShadeMirror试妆
简体中文

隐私政策

最后更新:2026 年 10 月 15 日


一句话

ShadeMirror试妆离线工作,不上传你的任何数据。

试妆、渲染、人脸识别、方案保存,全部在你的手机里完成,不需要网络;你的照片、妆容方案、录入的化妆品,全部只存在你自己的手机里 —— 本应用不会把它们发送到任何地方。

可能出现的三类联网,都与你的内容无关

下面三类情况可能产生网络通信。它们都不携带你的照片、妆容方案或任何可以指向你本人的信息,我们把每一处都写在这里,而不是藏进细则。

一、应用内购买(仅限提供订阅的版本)。 App Store 与 Google Play 版中,订阅的价格查询、购买与恢复由操作系统的支付组件完成(iOS 的 StoreKit、安卓的 Google Play 结算)。这一步需要联网,由系统与苹果/谷歌的服务器通信,我们既不发起、也接触不到其中的数据。

中国大陆应用商店提供的 Android 版当前没有应用内购买或订阅,因此不会发生这一类通信。

二、系统备份。 如果你开着 iCloud 备份(iOS)或云备份(安卓),操作系统会把本应用的数据连同你保存的照片一起备份到你自己的云账号,换手机时再恢复回来。这不是本应用做的,是操作系统按你自己的设置做的,数据进的也是你自己的账号。我们仍然看不到、也拿不到。

我们特意让本应用的数据参与系统备份 —— 否则你换一台手机,积累的方案与录入的化妆品就一件都带不走了。若不希望如此,可在系统设置里关闭本应用的备份。

三、iOS 版:人脸识别库自带的运行统计。 我们用 Google 的 MediaPipe 做人脸关键点识别(识别本身完全在设备上跑)。这个库里打包了一段 Google 的统计上报代码,我们排不掉:在 iOS 上,它会在应用启动约一分钟后向 play.googleapis.com 发出一次约 200 字节的请求,内容是这个库自己的运行统计 —— 用了哪个模型、调用了多少次、耗时多少、有没有出错,以及机型与系统版本。

它发不出你的照片,也发不出任何指向你的信息 —— 那段上报的数据结构里根本没有装这些的字段。但这件事确实发生,所以我们不说「零网络请求」。完整的实测证据与排查过程写在下面《关于 MediaPipe 附带的遥测代码》里。

安卓版没有这件事:安装包里没有 INTERNET 权限,同一段代码在系统层面就发不出任何请求。


为什么这不只是承诺

多数应用的隐私政策说「我们重视您的隐私」,然后列出一长串收集项。我们的情况不同,而且是可以被验证的:

安卓版的应用清单里没有声明 INTERNET 权限。

在安卓系统上,没有这个权限的应用在系统层面就无法访问网络 —— 不是「我们承诺不传」,是「传不了」。任何人下载安装包、解开清单文件就能自己核实这一点。

苹果版没有等价的权限机制,所以苹果版我们不说「传不了」,只说「我们没写过一行联网代码」 —— 这一条同样可以核实,方法见文末附录。

苹果版上确实可能有两类网络通信:提供订阅时由苹果自己的 StoreKit 完成购买相关通信,以及 MediaPipe 里那段排不掉的统计上报。两类都写在上面《可能出现的三类联网》与下面《关于 MediaPipe 附带的遥测代码》里,不藏在细节段。


我们申请的权限,以及为什么

相机

用途: 实时显示上妆效果。

摄像头画面只在你的设备上处理:人脸关键点识别(MediaPipe,本地运行)、妆容渲染(设备 GPU),全程不离开手机。画面不会被录制或保存,除非你自己按下快门。

保存到相册(仅添加)

用途: 把你导出的方案图存进系统相册。

这是苹果的「仅添加」权限 —— 它只允许写入,不允许读取。我们无法看到你相册里的任何其他照片。

安卓 10 及以上不需要任何权限;安卓 9 及以下因系统限制需要存储权限,我们已在清单中限定它只在那些旧版本上申请(maxSdkVersion="28")。

我们不申请的权限

权限为什么不要
读取相册导入照片走系统选择器(iOS 的 PHPicker / 安卓的 Photo Picker)—— 它跑在系统进程里,你选中哪张,我们才拿到哪张
网络见上
定位、通讯录、麦克风、设备标识与本应用的功能无关

人脸数据

人脸是敏感信息,所以单独用一节讲清楚:识别什么、存什么、存在哪、留多久、会不会给别人。

我们不做人脸识别

应用要知道的是脸上各部位在画面里的位置 —— 眼睛在哪、唇线在哪、颧骨在哪 —— 据此决定每一层妆画在什么地方。

它不建立可用于辨认身份的人脸模板,不做比对、认证、搜索或聚类。 换句话说,这套数据回答的是「嘴唇在这一帧的什么位置」,而不是「这是谁」。

识别什么、什么时候落盘

实时试妆时,摄像头的每一帧交给设备上的 MediaPipe 人脸关键点模型(face_landmarker.task,随安装包一起分发,运行时不联网),得到一组二维关键点坐标。这些帧与坐标只存在于内存中,用完即弃 —— 不写文件,不上传。

只有你自己按下快门保存方案时,才会有东西落盘。落盘的是三样:

落盘内容为什么需要它
效果图你保存下来的那张成品
原始帧(未上妆)你之后换色号、调浓淡时,要在这张上重新渲染
人脸关键点坐标重新渲染时不必再跑一次检测,也避免每次结果略有出入

存在哪里

设备应用沙盒的 Application Support/StyleMe/ 目录下。 没有服务器,没有账户,没有任何副本离开过这台设备。

如果你开着 iCloud 备份(或安卓的云备份),它们会随应用数据一起备份。 这是有意为之:不备份意味着你换手机时积累的一切清零。备份进的是你自己的云账号,我们既看不到也接触不到。

留存多久

由你决定,我们不设期限。 删除某个方案,对应的三个文件即刻删除;卸载应用会删除应用沙盒中的全部数据。你主动导出到系统相册或文件应用的副本由对应系统应用管理,不会随本应用卸载自动删除。我们没有「保留 N 天」这类策略,因为我们从来不持有这些数据 —— 它们一直在你的设备上。

会不会共享给第三方

不会。 我们没有服务器可以上传,也没有接入任何分析、归因或广告组件。

应用用到的第三方组件只有 MediaPipe(Google 的开源库),它在你的设备上运行,既不接收也不发出人脸数据。它附带的那段遥测(见上文《三处联网》第三条)只上报模型调用次数、耗时、机型与系统版本 —— 那段数据结构里没有任何字段能装下图像或坐标。


数据存在哪里

数据存放位置谁能看到
你保存的妆容方案(效果图 + 原始帧 + 人脸关键点坐标)设备应用沙盒只有你
你录入的化妆品(品牌、名称、颜色)设备应用沙盒只有你
界面语言、使用提示是否看过设备本地偏好只有你

卸载应用会删除应用沙盒中的全部数据。 你主动导出到系统相册或文件应用的副本由对应系统应用管理。我们没有服务器,也就没有可供导出或删除的「账户数据」—— 因为从来没有账户。


第三方

我们没有主动引入任何广告、埋点或数据分析组件。

应用使用的第三方组件只有:

关于 MediaPipe 附带的遥测代码

有一件我们无法彻底消除的事,如实写在这里。

MediaPipe 会连带打包 Google 的遥测上传代码。两端各是一套:

(不在依赖清单上,是编进 MediaPipeTasksCommon 里的)

我们尝试过把安卓那个从依赖里剔除,但 MediaPipe 在代码中硬引用了它 —— 移除之后人脸检测根本无法启动。苹果那套是闭源静态库,连剔除的入口都没有。

安卓上我们已经让它无法工作;苹果上我们做不到。两边如实分开写。

两条权限,以及三个调度组件,全部已被移除。没有网络权限, 它在系统层面发不出任何请求,调度组件不存在,也无从被唤起。 这一点你可以自己核实,方法见文末附录。

2026 年 9 月 16 日实测,Release 包启动约 60 秒后会向 play.googleapis.com 发出一次请求(请求 234 字节、响应 393 字节, 返回 200),三次启动三次复现。发起方是 MediaPipe 静态库里 Google 的 ClearcutLoggingClient,走它自带的 GTMSessionFetcher。

这不是苹果的支付组件。 我们把自己代码里唯一的 StoreKit 调用注释掉 重新构建,这个请求照发不误 —— 所以不能把它算到苹果头上。

它发的是什么、不是什么:

那段上报的数据结构(logs.proto.mediapipe.MediaPipeLogExtension)只有这几类字段:会话开始/结束、调用次数与耗时、错误码、用了哪个模型与运行模式,以及机型和系统版本。

没有任何字段能装下图像、关键点坐标或你的内容 —— 何况整个请求只有 234 字节。它不携带账号、广告标识或任何指向你本人的信息,我们也拿不到其中任何数据:收件方是 Google,不是我们,我们没有服务器、也没有任何 Google 分析账号可以去看这些数字。

我们做不到的,就不承诺。 这个库是闭源静态库,官方没有提供关闭开关(库里有一个空实现的 TasksDummyLogger,但没有对外暴露的选择方式),而 MediaPipe 的版本在本项目里是钉死的 —— 换版本要在真机上重验整条人脸检测与相机链路,那是另一件事。所以苹果版我们不主张「零网络请求」。

之所以写下这一整段:本政策请你亲自核实,而你解开安装包时会看到这些类、抓包时会看到这个请求。与其让你自己发现、再怀疑我们别的话是不是也这样,不如我们先说清楚,并把复现方法一并给你(见文末附录)。


付费

中国大陆应用商店提供的 Android 版当前全部功能免费,没有应用内购买或订阅。

仅在通过 App Store 或 Google Play 明确提供订阅的版本中,购买通过对应商店完成。支付信息由苹果或谷歌处理,我们看不到你的支付方式、卡号或账单地址,只能从系统收到「此设备是否已解锁完整版」这一个是非判断。


儿童

本应用不面向 13 岁以下儿童,也不收集任何年龄信息。


变更

若未来引入任何联网功能(例如二期的商品库),我们会:

  1. 在应用内以显著方式告知,并在你同意之前不启用
  2. 更新本政策并注明修订日期

我们不会在你不知情的情况下开始收集数据。


联系

developer@metaimax.com


附录:本文事实的核实方式

供审核方或任何愿意自己验证的人参考。

核实安卓版发不出任何网络请求:

# 解开安装包,查看清单中声明的权限
aapt2 dump permissions app-release.apk
# 各 Android 版本都应有 CAMERA、WRITE_EXTERNAL_STORAGE(maxSdkVersion=28)
# 和一条应用私有权限。Google Play 版还会有 BILLING(走进程间通信,
# 不是网络权限);国内应用商店版没有 BILLING。
# 所有版本都不应有 android.permission.INTERNET —— 进程在系统层面
# 发不出任何网络请求,包括 MediaPipe 带的那个遥测库。

# 也可以直接确认埋点的调度组件不在清单里:
aapt2 dump xmltree app-release.apk --file AndroidManifest.xml | grep datatransport
# 应当没有输出

核实我们自己的代码没有联网:

# 两端全域搜索网络 API(应当一条都搜不到)
grep -rn "URLSession\|CFNetwork\|NWConnection\|dataTask" ios/Sources/ StyleMeCore/Sources/
grep -rn "OkHttp\|HttpURLConnection\|java.net.Socket\|Retrofit" android/app/src/main/java/

核实苹果版上那两处第三方联网:

# 一、看二进制链接了哪些能联网的系统框架
otool -L StyleMeProto.app/StyleMeProto | grep -iE "CFNetwork|Network|StoreKit"
#   会看到 StoreKit.framework —— 苹果的支付组件,订阅由它联网。
#   看不到 CFNetwork、看不到第三方网络框架、没有 WebView。

# 二、看 MediaPipe 那段统计上报的地址(它是静态链接,不在框架列表里)
strings -a StyleMeProto.app/StyleMeProto | grep play.googleapis.com
#   会看到 https://play.googleapis.com/log —— 这就是上文说的那一条。

⚠️ 第二条会有输出,这是预期的,不是我们在藏东西。 它来自 Pods/MediaPipeTasksCommon/frameworks/graph_libraries/ 下的静态库,符号里能看到 mediapipe::tasks::core::logging::google_internal::ClearcutLoggingClient。

复现那个请求: 在 iOS 模拟器上装 Release 包,启动后用 log stream --predicate 'process == "StyleMeProto"' 观察约 60 秒,会出现 hostname: play.googleapis.com 与 taskName = GTMSessionFetcher。这是我们自己用的方法,结论就是这么来的。

核实第三方依赖清单: 查看 android/app/build.gradle.kts 与 ios/Podfile。两处都只有 MediaPipe 与官方系统库。

核实相册访问方式: 搜索 PHPickerViewController(iOS)与 ActivityResultContracts.PickVisualMedia(安卓)。两者均为系统选择器,不需要相册权限。