背景
2023年WWDC上苹果列出了需要隐私清单和签名的三方SDK,从2024年春季开始,在App Store Connect中提交包含这些SDK的应用,必须包含相应的隐私清单。在使用列出的SDK作为二进制依赖项的情况下,也需要提供签名。对于列出的SDK的任何版本,以及对这些列表上SDK进行重新打包的任何SDK,都适用此要求。3月份Apple会将未在隐私清单中提供原因的API通过邮件通知,5月1号以后则会强制要求。
隐私清单(privacy manifest)
升级至Xcode 15,可以创建App Privacy文件
主工程添加的xcprivacy使用默认文件名PrivacyInfo.xcprivacy
。不要更改,更改以后苹果识别不到还会继续发邮件。
xcprivacy文件中主要包含四项内容:
privacy中的相关字段说明
- NSPrivacyTracking (
Privacy Tracking Enabled
):bool值,是否开启隐私跟踪。有关更多信息,请参阅用户隐私和数据使用。 - NSPrivacyTrackingDomains (
Privacy Tracking Domains
):字符串数组,列出您的应用或第三方 SDK连接到的参与跟踪域名。 - NSPrivacyCollectedDataTypes (
Privacy Nutrition Label Types
):字典数组,描述您的应用程序或第三方 SDK 收集的数据类型的。有关字典中使用的键和值的信息,请参阅描述隐私清单中的数据使用。 - NSPrivacyAccessedAPITypes (
Privacy Accessed API Types
):字典,描述您的应用或第三方 SDK 访问的 API 类型,这些类型已被指定为需要访问原因的 API。有关字典中要使用的键和值的信息,请参阅描述所需原因 API 的使用。
导出隐私清单
导出以后的PDF如图所示,通过隐私清单,开发者可以在appStore提交审核时更方便的提供「隐私标签」
匹配使用必要原因的API列表的脚本
对上面的声明必要原因的api列表,可以通过下面提供的脚本在项目中进行匹配是否引用了对应的API:
脚本:check_xcprivacy.sh
bash
# 提示用户输入包含搜索字符串的文件路径
read -p "请输入必要理由api的文件路径:" file_path
# 检查文件是否存在
if [ ! -f "$file_path" ]; then
echo "错误:文件不存在。"
exit 1
fi
# 逐行读取文件中的搜索字符串,并执行搜索操作
while IFS= read -r search_string; do
# 检查搜索字符串是否以 "----" 开头
if [[ "$search_string" == ----* ]]; then
echo "${search_string}"
else
# 检查搜索字符串是否为空或只包含空格
if [ -n "$(echo "$search_string" | tr -d '[:space:]')" ]; then
# 指定要搜索的目录为当前目录
search_directory="."
# 对搜索字符串进行处理,确保空格被保留
# 使用 printf 格式化字符串,%s 表示字符串
formatted_search_string=$(printf "%s" "$search_string")
# 使用 find 命令查找目录下的所有文件,并使用 grep 查找包含指定字符串的文件
# -type f 表示只查找文件
# -exec grep -H -i "$formatted_search_string" {} + 表示对每个找到的文件执行 grep 命令,输出包含匹配字符串的文件路径和匹配的行
result=$(find "$search_directory" -type f -exec grep -H -i "$formatted_search_string" {} +)
# 检查结果是否为空
if [ -n "$result" ]; then
echo "找到包含${formatted_search_string}符串的文件:"
echo "$result"
echo "------------------------end------------------------"
else
echo "未找到包含${formatted_search_string}字符串的文件。"
echo "------------------------------------------------"
fi
fi
fi
done < "$file_path"
必要原因的api列表:PrivacyAPI.txt
diff
----1.File timestamp APIs----
creationDate
modificationDate
fileModificationDate
contentModificationDateKey
creationDateKey
getattrlist
getattrlistbulk
fgetattrlist
st_atimespec
st_blksize
st_blocks
st_ctimespec
st_dev
st_flags
st_gen
st_gid
st_ino
st_lspare
st_mode
st_mtimespec
st_nlink
st_qspare
st_rdev
st_size
st_uid
fstat
fstatat
lstat
getattrlistat
----2.System boot time APIs----
systemUptime
mach_absolute_time
----3.Disk space APIs----
volumeAvailableCapacityKey
volumeAvailableCapacityForImportantUsageKey
volumeAvailableCapacityForOpportunisticUsageKey
volumeTotalCapacityKey
systemFreeSize
systemSize
statfs
statvfs
fstatfs
fstatvfs
getattrlist
fgetattrlist
getattrlistat
----4.Active keyboard APIs----
activeInputModes
----5.User defaults APIs----
UserDefaults
使用方法:
- cd /Users/xxx/xxx/demo_project (cd到项目工程目录下)
- sh /Users/xxx/xxx/check_xcprivacy.sh (执行匹配脚本)
- 请输入必要理由api的文件路径:/Users/xxx/xxx/PrivacyAPI.txt (根据控制台提示输入
必要原因的api列表
文件的路径)
可以通过脚本扫描工程中是否使用上述API,并根据扫描结果添加对应的使用原因。
第三方SDK隐私协议
苹果官网列出了需要包含隐私协议的三方SDK
若引用的三方SDK不在苹果列出的名单里,则理论上可以不对SDK进行添加privacy manifest文件和必要理由api说明处理。
若引用的三方SDK在名单里,则需要对SDK进行添加privacy manifest和必要理由api说明处理,处理方法参考如下:
-
将SDK更新到包含privacy manifest的版本,常用的三方都会在新版本适配privacy manifest
-
若不想更新sdk,则可以:
- 将对应的SDK下载到本地
- 本地新增privacy manifest文件(可以参考最新的sdk中的privacy manifest文件)
- 推送到自己的github上
- 通过cocoapods引入新增privacy manifest文件的SDK
提交AppStore审核经验分享
项目做适配时遇到三方库FMDB(最新版本没有适配隐私协议)和AFNetworking(已停止更新维护,现有版本没有适配隐私协议)的最新版本没有做隐私协议和必要理由api说明处理。
由于时间关系来不及进行本地添加privacy manifest文件处理,就抱着试试看的心里直接提交审核了,于5月7号通过审核。
注意:虽然有2个SDK没有添加隐私协议处理通过了苹果审核,猜测是刚开始执行政策比较宽松,不排除后续慢慢收紧的可能,能做添加privacy manifest文件和必要理由api说明处理的,尽量加上。