这个话题的原因来自 2023 年 WWDC 之后苹果发布的「App Store 提交隐私更新」政策,政策首要提出了两点:第三方 SDK 隐私清单和签名和需求供给必要理由的 API 流程。
其实先简略总结,便是 Apple 想经过隐私清单来进一步提升用户数据搜集和运用的透明度,包含 required reason API 也是算是归于隐私清单里的内容。
那这个和标题里的 Flutter 有什么关系?由于跟从此次隐私清单升级, Apple 上线了一个**对用户隐私产生严重影响的第三方 SDK 列表** ,而在这列表刚好就有 Flutter 的存在,并且里边接近 1/3 是和 Flutter 相关的 Plugin ,例如 connectivity_pulus
、device_info_plus
、fluttertoast
、shared_preferences_ios
、sqflite
、webview_flutter_wkwebview
、url_launcher
等等。
这就很懵逼了,是 Flutter 做了什么「天怒人怨」的问题,仍是 Apple 故意针对 Flutter 呢?那在聊这个问题之前,我们首要需求简略了解下,这次的隐私标签里首要触及的是什么?
这个问题不仅仅对 Flutter ,其实关于 iOS 来说 2024 在 Xcode15 上也归于最重要的适配需求。
隐私清单
**聊隐私清单,首要最首要是便是第三方隐私清单(privacy manifest) **,归于让 SDK 开发人员供给他们 SDK 的一些数据搜集行为,然后 App 开发者在集成各种 SDK 之后,能够得到一份具体的隐私清单,如下图是 SDK 里声明的隐私清单。
隐私清单的效果是帮助开发者了解第三方 SDK 如何运用数据,这样开发者在向 App Store 提交审阅时,Xcode 能够将第三方 SDK 中的隐私清单兼并,然后导出一个 PDF 报告汇总。
经过这份隐私清单报告,开发者就能够在 App Store 提交审阅时,更方便地供给「隐私标签」,如下图所示便是 iOS 14 时 App Store 推出的功用,当时就要求 App 开发者在 App Store 后台声明运用的数据搜集和运用场景,让用户在运用详情页面知道 App 搜集了什么和做了什么。
那么首要能够知道,SDK 隐私清单的效果,便是让 App 开发者能够依据生成的清单,更好准确和方便地办理自己 App 的隐私标签,一般情况下大约会有:
-
搜集的数据类型
-
数据是否能关联到用户
-
数据是否用于盯梢活动
-
搜集此数据的理由
其间关于数据类型可见:developer.apple.com/documentati…
那假如我不需求隐私清单来办理隐私标签,就能够理会这次的隐私清单的工作了呢?那答案肯定不是,由于隐私标签还包含了其他东西,比方必要理由的 API 声明、声明盯梢域名和第三方 SDK 签名等。
必要理由的 API 声明
首要这个首要是 Apple 新搞了一个 API 分类, 运用这一个 API 分类你需求在隐私清单里阐明运用理由, Apple 这么做的意图是首要是想规范 App 随意经过这些 API 做 fingerprinting 辨认的行为,相关的 API 也不多,大约触及:
- File timestamp APIs
- System boot time APIs
- Disk space APIs
- Active keyboard APIs
- User defaults APIs
假如 SDK 和 App 里用到了分类里的这些 API ,你就需求在隐私列表里填写原因,例如:
运用了 Disk space APIs 的
systemFreeSize
,在写入前判别磁盘空间巨细,那么就需求引证列表里的E174.1
条款,如下图写明运用的原因。
从现在看,相似 UserDefaults
、stat
等 API 仍是很简略被运用到,所以 Required Reason API 这部分应该都是跑不掉的。
声明盯梢域名
隐私清单其实必定程度也算是运用盯梢透明度 (ATT) 的内容之一,而本次更新,假如用户未经过 App Tracking Transparency (ATT) 授予权限, Apple 就会阻挠对追寻域(Tracking Domains)的网络请求。
简略来说,便是需求界说一个 NSPrivacyTrackingDomains
列表,这样但用户不赞同 ATT 权限时, 系统就会阻挠这些域名的任何调用,所以 SDK 上假如有相似相关盯梢的域名调用,也需求区别声明好盯梢域名和非盯梢域名。
当然,不管你是否利用 ATT 的界说进行盯梢,你都必须在隐私清单中列出搜集的数据类型和原因,由于这个和 ATT 没有必然关系,仅仅假如运用了 ATT 的域名,在这儿需求额定声明来契合权限, ATT 在 iOS 17 上实际并没有什么改变。
这儿的盯梢界说是:能狗将你搜集的数据与其他公司 App 搜集的数据相关联,比方运用了 IDFV 也算盯梢,。
仅仅这儿我有个疑问,假如我不把 ATT 的相关搜集域名放到 NSPrivacyTrackingDomains
列表,其实 Apple 是审阅是不是也无法明晰发现呢?那么我不做是不是也是能够?
第三方 SDK 签名
本次跟从隐私清单而来的还有第三方 SDK 签名,这是我们曾经一直忽略的东西,而 Apple 的意图也很直接,便是希望经过签名认证的方法来确保 SDK 不会被篡改,简略的说便是 SDK 发布时带有 _CodeSignature
。
需求签名,肯定是 SDK 包含了二进制依靠,没有二进制依靠其实并不需求考虑签名问题。
这儿的签名其实分 Apple Developer Program 签名和自签名,假如你的 SDK 运用的是 Apple Developer Program ,简略来说便是能够得到更安全可靠的认知加持,安全性拉满,可是假如你选用的是 codesign 自签名,那么也不是不行,便是你自己保管好签名认证的方法。
echo "Build Archive Device Slice"
xcodebuild clean archive -sdk iphoneos -destination 'generic/platform=iOS'[...]
echo "Build Archive Simulator Slice"
xcodebuild clean archive -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' [...]
echo "Create XCFramework"
xcodebuild -create-xcframework [...] -output <YOUR.xcframework>
echo "Codesign XCFramework"
codesign --timestamp -v --sign "<YOUR CERTIFICATE (ABCXYZ)>" "<YOUR.xcframework>"
经过签名认证后的 SDK ,在 Xcode15 会显现对应的 Signature 信息,假如一旦发现本次前面和前次不一致,那么Xcode 就会让编译失利并弹出警告。
当然,假如 SDK 的签名改变契合你预期,比方 SDK 维护人员发生了改变,从而导致证书发生改变,那么你也能够经过接受改变的方法也赞同更改。总的来说现在这个阶段签名并不是必定要官方,乃至不必定就强制要签名,Apple 「鼓舞】所有 SDK 运用签名,但影响隐私的 SDK 必定要签名,特别是前面说到列表里的。
现在来说,App Store 现已开端查看最近提交的 App 是否包含影响隐私的 SDK ,假如影响隐私的 SDK 不包含签名和隐私清单,Apple 将向运用开发人员发送提醒邮件,包含供给必要理由的 API 部分,最后会在 2024 年春季开端要求审阅。
更多官方资料:
Flutter
那本次隐私清单关于 Flutter 来说,最大的影响便是大量 Flutter Plugin 被挂上了 Apple 官方的用户隐私产生严重影响的第三方 SDK 列表,由于上了列表,就被认定为是影响隐私的 SDK,那么隐私清单是跑不了的了,别的假如有二进制依靠还需求满意签名条件,所以这关于 Flutter 来说在 iOS 17的适配上无疑「落井下石」,能够看到现在官方开了许多关于官方 package 的 iOS 隐私清单适配 issue 。
关于 Flutter Engine 部分,其实官方适配隐私清单难度并不大,现在调查完 iOS 上 Flutter Engine 首要需求适配的有:
-
File timestamps :
-
C617.1
用于FlutterAppDelegate.mm
里的运用状态恢复 -
0A2A.1
用于实施相关File
包装器
-
-
System boot time:
-
35F9.1
用于各种事情计时和经过时间的核算
-
现在官方在 #131494 现已表明,会将 PrivacyInfo.xcprivacy
包含在未来 Flutter.framework
中,所以这部分并不需求担心。
而在 flutter/packages 部分现在却是有棘手的问题,例如 shared_preferences
,它被列入影响隐私 SDK 列表的原因是由于 NSUserDefaults
,可是 shared_preferences
它本身仅仅 API 的封装,为了方便 Flutter 开发者调用,它本身是不知道如何/为什么运用它,在 SDK 层面很难在隐私清单描绘给出所谓的「搜集原因」。
别的第三方 Plugin 也可能运用 shared_preferences
,可是 App 开发并不知道它用来做什么,那么假如让 pub 的 Plugin 能描绘好隐私清单的内容?
现在官方文档提及:
If you use the API in your third-party SDK’s code, then you need to report the API in your third-party SDK’s privacy manifest file
这听起来像是只需具有它的代码就需求标记出它的原因,可是实际上 Plugin 不知道该层存储的数据是什么或如何被运用。
关于 “搜集” 的界说现在很含糊,相似的还有 webview_flutter
,webview_flutter
本身不搜集任何内容,可是App 能够用来 webview_flutter
搜集浏览历史记录,然后这如何在 SDK 的隐私清单里去体现?
感觉现在的 iOS 要求没有很明晰,适配方向不行明晰。
最后,现在文档说他们「鼓舞」每个人都选用该清单,而关于在隐私列表的 SDK 看起来是强制的,可是如何挑选这些 SDK 的规则现在也看不到,所以只能等待后续和 Apple 的交流回复。
更多进展可见:
最后
总结一下,本次 iOS 隐私清单首要覆盖的有:
- SDK 供给隐私清单的数据搜集类型、运用描绘和用途
- 必要理由的 API 需求供给运用“代码”和原因
- ATT 盯梢增加域名区别
- 第三方 SDK 签名
这儿面 SDK 供给的隐私清单,我个人理解:
- 首要是用来给 App 打包后,经过导出的 pdf 参考办理隐私标签
- 其次关于必要理由的 API 的运用附带运用阐明
- 关于 ATT 搜集相关的数据域名增加到清单进行区别,至于你不写是否会被抓住不好说
- 第三方 SDK 签名不是强制,也能够自签名,条件是你不是在官方影响隐私 SDK 列表中
- 假如你 SDK 没有二进制,没有运用必要理由的 API,理论上其实乃至能够不管什么隐私清单和签名,由于你正常也进不去官方的影响隐私 SDK 列表。
本次更多是讨论,由于官方的描绘和文档内容上其实并不严谨,乃至有许多含糊的地方。