iOS - 超好用的隐私清单修复脚本(持续更新)

ops/2024/12/26 0:58:26/

文章目录

  • 前言
  • 开发环境
  • 项目地址
  • 下载安装
  • 隐私访问报告
  • 隐私清单模板
  • 最后


前言

在早些时候,提交应用到App Store审核,大家应该都收到过类似这样的邮件:

Although submission for App Store review was successful, you may want to correct the following issues in your next submission for App Store review. Once you've corrected the issues, upload a new binary to App Store Connect.ITMS-91053: Missing API declaration - Your app’s code in the “Runner” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryDiskSpace. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.ITMS-91053: Missing API declaration - Your app’s code in the “Runner” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryFileTimestamp. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.ITMS-91053: Missing API declaration - Your app’s code in the “Runner” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategorySystemBootTime. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.ITMS-91053: Missing API declaration - Your app’s code in the “Runner” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

因为这个问题,分别写了两篇文章,其中一篇介绍审核新政策,另一篇介绍隐私清单分析脚本:

  • iOS问题记录 - App Store审核新政策:隐私清单 & SDK签名(持续更新)
  • iOS - 超好用的隐私清单分析脚本(持续更新)

当时还有点担心一些SDK到期(2024/05/01)还没适配咋搞,特别是我还维护着一些老项目,实在是一点也不想升级那些SDK增加额外工作量。那时候就想,要不写个快速修复隐私清单的脚本?

结果时间到了,苹果也没贯彻执行审核新政策,该提交的提交,甚至我手头有个老项目连应用的隐私清单都没有也能正常提交。我不经在想,难道苹果也知道这东西不好执行放弃了?写了个大概的隐私清单修复脚本就此封存。

时间来到10月底,有人在隐私清单分析脚本文章中评论了一个问题,同时也有人收到新的警告邮件:

ITMS-91061: Missing privacy manifest - Your app includes “Frameworks/MBProgressHUD.framework/MBProgressHUD”, which includes MBProgressHUD, an SDK that was identified in the documentation as a privacy-impacting third-party SDK. Starting November 12, 2024, if a new app includes a privacy-impacting SDK, or an app update adds a new privacy-impacting SDK, the SDK must include a privacy manifest file. Please contact the provider of the SDK that includes this file to get an updated SDK version with a privacy manifest. For more details about this policy, including a list of SDKs that are required to include signatures and manifests, visit: https://developer.apple.com/support/third-party-SDK-requirements.

我就好奇苹果是不是又开始执行审核新政策,于是找到官方文档瞅了一眼:

screenshot1

这是机翻:

包含无效隐私清单文件的应用程序提交可能会被拒绝。如果您将应用程序上传到App Store Connect,其中包含具有意外键或值的隐私清单文件,您将收到一封电子邮件,其中包含应用程序包中无效文件的名称和路径。从2024年11月12日开始,不包含所需隐私清单的应用程序无法在App Store Connect中提交审核。您需要获取该电子邮件中提到的所有隐私清单文件的有效版本并将其包含在您的应用程序中。如果无效文件来自第三方SDK,请联系其开发人员以获取包含有效隐私清单的SDK更新版本。使用Xcode再次构建、存档并提交您的应用程序。有关更多信息,请参阅分发应用程序以进行Beta测试和发布。

截止时间变为了2024/11/12,同时还强调隐私清单不能包含意外键或值。什么意思呢?当时我猜测是不能把全部所需原因API都在隐私清单声明一遍,必须用了才能声明,不然就是无效的隐私清单。现在不用猜,因为当我写下这篇文章的时候,苹果又更新了文档:

screenshot2

从2025年2月12日开始,提交审核的应用,其中一部分常用第三方SDK必须包含有效的隐私清单文件(个人理解,仅供参考)。从文档看,苹果是打算逐步推进。阅读TN3181: Debugging an invalid privacy manifest文档可以知道关于无效隐私清单的一些信息。

提交的应用包含无效的隐私清单会收到如下警告邮件:

ITMS-91056: Invalid privacy manifest - The PrivacyInfo.xcprivacy file from the following path
is invalid: "PrivacyInfo.xcprivacy". Keys and values in your app's privacy manifests must be
valid. For more details about privacy manifest files, visit: 
https://developer.apple.com/documentation/bundleresources/privacy_manifest_files.

如此看来这些错误代码分别对应不同的隐私清单问题:

  • ITMS-91053:API声明缺失
  • ITMS-91056:隐私清单无效
  • ITMS-91061:隐私清单缺失

关于常用SDK支持隐私清单的最低版本,可以在这里查看。

无效的隐私清单分为两种(更详细内容请看官方文档):

  1. 包含无效键或值:类型不对(例如不是字符串/字典数组)、空字符串或和预期值不匹配(例如声明的原因不属于这个API类别)等
  2. 格式不正确:指plist文件的内容格式不正确,用Xcode编辑通常不会出现该问题

补充一点:据观察可用于声明的原因会随着Xcode版本变化,之前Xcode版本声明的原因假如后面的版本移除了它,不知道会不会被视作无效隐私清单。

至于说全部声明一遍会不会导致隐私清单无效,文档并没有明确说明,不过在结尾提了一句:如果您的隐私清单的键和值与App Store Connect期望的值不匹配,您的隐私清单仍然可能无效。

screenshot3

综合以上内容,审核新政策还在不断推进,并没有马上一刀切。考虑到迟早会全面推进,我把封存的隐私清单修复脚本项目进行了完善,支持对隐私清单进行修复以及生成隐私访问报告,推荐用于无法升级的SDK或者想保持现状的项目。

开发环境

  • macOS: 15.2

项目地址

  • GitHub

下载安装

首先下载最新版本,然后解压。建议解压到iOS项目根目录,一是方便为每个项目单独自定义隐私清单模板,二是避免运行在不同设备出现路径问题。

然后解压后执行安装命令:

sh install.sh <project_path>

建议使用--install-builds-only选项,这样修复工具通常只会运行在打包(Archive)时的项目构建,日常开发不运行可以加速项目构建:

sh install.sh <project_path> --install-builds-only

安装完成后在项目构建时会自动运行,更多用法请看:Installation Guide。

隐私访问报告

当未启用静默模式(默认不启用)时,会在Build目录下输出每次运行生成的隐私访问报告。

从报告中可以快速看到哪些SDK缺隐私清单、SDK声明了哪些API类型及SDK修复用的是哪个隐私清单模板。后续考虑生成完整的隐私报告以及在报告中呈现隐私清单问题(检测是否无效隐私清单)。

应用修复前的报告应用修复后的报告
Original App ReportFixed App Report

当然,你也可以手动执行命令给某个应用生成报告:

sh Report/report.sh <app_path> <report_output_path>
# <app_path>: Path to the app (e.g., /path/to/App.app)
# <report_output_path>: Path to save the report file (e.g., /path/to/report.html)

隐私清单模板

隐私清单模板放在Templates目录,自定义模板放在Templates/UserTemplates目录。

如果不存在应用隐私清单,将按照如下优先级获取隐私清单模板用于修复:

Templates/UserTemplates/AppTemplate.xcprivacy > Templates/AppTemplate.xcprivacy

如果某个SDK不存在隐私清单,将按照如下优先级获取隐私清单模板用于修复:

Templates/UserTemplates/FrameworkName.xcprivacy > Templates/UserTemplates/FrameworkTemplate.xcprivacy > Templates/FrameworkTemplate.xcprivacy

FrameworkName一般就是SDK的名称,但是也有不相同的情况。如果不清楚,可以检查构建后的应用程序包或者隐私访问报告找出SDK对应的framework。当然,如果SDK的API使用分析足够准确,通过自带的默认模板FrameworkTemplate.xcprivacy修复就可以了,无需自定义。

隐私清单模板更多介绍请看:Privacy Manifest Templates。

最后

如果这篇文章对你有所帮助,点赞👍收藏🌟支持一下吧,谢谢~


本篇文章由@crasowas发布于CSDN。


http://www.ppmy.cn/ops/144980.html

相关文章

重温设计模式--单例模式

文章目录 单例模式&#xff08;Singleton Pattern&#xff09;概述单例模式的实现方式及代码示例1. 饿汉式单例&#xff08;在程序启动时就创建实例&#xff09;2. 懒汉式单例&#xff08;在第一次使用时才创建实例&#xff09; 单例模式的注意事项应用场景 C代码懒汉模式-经典…

Go语言zero项目部署后启动失败问题分析与解决

在部署一个Go语言项目时&#xff0c;很多时候会遇到服务无法启动的情况&#xff0c;尤其是当项目配置或环境稍有问题时。这篇文章将帮助你分析和解决 systemctl start classin.service 命令启动失败的问题&#xff0c;具体错误信息如下&#xff1a; systemctl status classin.…

鸿蒙项目云捐助第十七讲云捐助我的页面上半部分的实现

鸿蒙项目云捐助第十七讲云捐助我的页面上半部分的实现 在一般的应用app中都会有一个“我的”页面&#xff0c;在“我的”页面中可以完成某些设置&#xff0c;也可以完成某些附加功能&#xff0c;如“修改密码”等相关功能。这里的鸿蒙云捐助也有一个“我的”功能页面。这里对“…

Spring Boot 实战:构建一个简单的 Web 应用

在 Java 开发领域&#xff0c;Spring Boot 凭借其简洁高效的开发模式&#xff0c;成为了众多开发者的首选框架。今天&#xff0c;我们就一起来通过实际代码示例&#xff0c;构建一个简单的 Spring Boot Web 应用&#xff0c;感受它的魅力。 一、准备工作 在开始之前&#xff…

LeetCode 343.整数拆分

1.题目要求: 2.题目代码: class Solution { public:int integerBreak(int n) {//先确定dp数组vector<int> dp;//1.确定dp数组的含义//2.确定dp的递推公式//3.初始化dp数组//4.遍历顺序dp.resize(n 1);dp[0] 0;dp[1] 0;dp[2] 1;for(int i 3;i < n;i){for(int j …

ECharts散点图-SymbolShapeMorph,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

macos自动制作dmg安装包脚本

macos下&#xff0c;使用脚本制作dmg安装包脚本&#xff1a; 目录结构&#xff1a; % tree helloworld/ test |-- Applications -> /Applications -- Helloworld.app-- Contents|-- Frameworks| |-- QtCore.framework| | |-- QtCore -> Versions/Current/QtCore|…

【JetPack】Navigation知识点总结

Navigation的主要元素&#xff1a; 1、Navigation Graph&#xff1a; 一种新的XML资源文件,包含应用程序所有的页面&#xff0c;以及页面间的关系。 <?xml version"1.0" encoding"utf-8"?> <navigation xmlns:android"http://schemas.a…