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说明处理的,尽量加上。

相关推荐
Jinkey5 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
程序猿看视界11 小时前
如何在 UniApp 中实现 iOS 版本更新检测
ios·uniapp·版本更新
dr李四维15 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
️ 邪神15 小时前
【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
flutter·ios·鸿蒙·reactnative·anroid
比格丽巴格丽抱1 天前
flutter项目苹果编译运行打包上线
flutter·ios
网络安全-老纪1 天前
iOS应用网络安全之HTTPS
web安全·ios·https
1024小神1 天前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
lzhdim1 天前
iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录
ios·iphone
安和昂1 天前
【iOS】知乎日报第四周总结
ios
麦田里的守望者江1 天前
KMP 中的 expect 和 actual 声明
android·ios·kotlin