Xcode15适配隐私清单

背景

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
​

使用方法:

  1. cd /Users/xxx/xxx/demo_project (cd到项目工程目录下)
  2. sh /Users/xxx/xxx/check_xcprivacy.sh (执行匹配脚本)
  3. 请输入必要理由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说明处理的,尽量加上。

相关推荐
传奇开心果编程1 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程1 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
黑科技iOS上架1 小时前
iOS隐私合规扫描工具
ios·审核
传奇开心果编程2 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
传奇开心果编程2 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
可乐鸡翅yeah_2 小时前
hls.js 缓冲区参数 maxBufferLength、maxBufferSize 通俗讲解与业务调参
开发语言·javascript·ios·音视频·safari·m3u8
茶底世界之下21 小时前
Metal 冷启动并发下,Pipeline Cache 为什么必须合并在途编译
ios·swift
weixin_403810131 天前
用 Python 调 EasyClick iOS 免越狱脚本:开放接口对接步骤与参数
ios·iphone
weixin_403810131 天前
EasyClick iOS 免越狱自动化脚本怎么写:从环境判断到跑通第一个脚本
运维·ios·自动化
weixin_403810131 天前
不用越狱也能批量控制 iPhone:EasyClick iOS 免越狱脚本实战
ios·iphone