当前位置: 首页 > news >正文

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

文章目录

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


前言

在早些时候,提交应用到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。

相关文章:

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

文章目录 前言开发环境项目地址下载安装隐私访问报告隐私清单模板最后 前言 在早些时候&#xff0c;提交应用到App Store审核&#xff0c;大家应该都收到过类似这样的邮件&#xff1a; Although submission for App Store review was successful, you may want to correct th…...

html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>

1.代码 <ul><li>电话&#xff1a;<a href"tel:18888888888">188-8888-8888</a></li><li>邮箱&#xff1a;<a href"mailto:10000qq.com">10000qq.com</a></li><li>邮箱&#xff1a;<a hre…...

clickhouse-副本和分片

1、副本 1.1、概述 集群是副本和分片的基础&#xff0c;它将ClickHouse的服务拓扑由单节点延伸到多个节点&#xff0c;但它并不像Hadoop生态的某些系统那样&#xff0c;要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活&#xff0c;用户既可以将所有节点组成…...

2009 ~ 2019 年 408【计算机网络】大题解析

2009 年 路由算法&#xff08;9’&#xff09; 讲解视频推荐&#xff1a;【BOK408真题讲解-2009年&#xff08;催更就退网版&#xff09;】 某网络拓扑如下图所示&#xff0c;路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 &#xff0c;通过接口 L0 连接路由器 R2 &…...

vue2使用render,js中写html

1、js部分table.js export default {name: "dadeT",data() {return {dades: 6666};},render(h) {return h(div, [h(span, 组件数据&#xff1a;${this.dades}), // 利用data里的dades数据&#xff0c;展示在页面上h(span, 89855545)]);} };2、vue部分 <templat…...

如何有效划分服务器磁盘空间?具体的步骤和流程

有效划分服务器磁盘空间对于提升系统性能、管理方便性和数据安全性至关重要。合理的磁盘分区不仅有助于提高服务器的运行效率&#xff0c;还能在数据恢复、系统故障修复和存储管理方面提供更高的灵活性。以下是如何有效划分服务器磁盘空间的几个关键步骤和注意事项。 磁盘分区的…...

labelme标签批量转换数据集json_to_dataset

文章目录 labelme标签批量转换数据集json_to_dataset转换原理单张图片转换多张图片批量转换bat脚本循环法 标注图片提取标注图片转单通道 labelme标签批量转换数据集json_to_dataset 转自labelme批量制作数据集教程。 转换原理 在安装了labelme的虚拟环境中有一个labelme_js…...

Fisco-Bcos-java-SDK 利用java与fisco-Bcos区块链上的智能合约交互(以HelloWorld为例)

Fisco-Bcos-java-SDK 利用java与fisco-Bcos区块链上的智能合约交互&#xff08;以HelloWorld为例&#xff09; 一、部署智能合约 1、编写智能合约 此处用最简单的HelloWorld合约作为例子 包含两个方法和一个构造函数 构造函数&#xff1a;当合约部署的时候 执行构造函数 将…...

OpenHarmony-3.HDF Display子系统(6)

Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多&#xff0c;各厂商的显示屏器件也各有不同&#xff0c;随之针对器件的驱动代码也不尽相同&#xff0c;往往是某一款器件驱动&#xff0c;只适用于某单一内核系统或 SOC&#xff0c;如果要迁移到其他内核或者…...

Nginx中Server块配置的详细解析

Nginx中Server块配置的详细解析 一、Server块简介 在Nginx配置文件中&#xff0c;server块是非常关键的部分。它用于定义虚拟主机&#xff0c;一个server块就代表一个虚拟主机。这使得我们可以在一台Nginx服务器上通过不同的配置来处理多个域名或者基于不同端口的服务请求。 …...

php学习资料分享

php学习资料分享&#xff1a;夸克网盘分享...

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3

Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 3_Day5-Day6 (12.15-12.16)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Guid…...

Eureka学习笔记-服务端

Eureka学习笔记 服务端 模块设计 Resources &#xff1a;这部分对外暴露了一系列的 Restful 接口。Eureka Client 的注册、心跳、获取服务列表等操作都需要调用这些接口。另外&#xff0c;其他的 Server 在同步 Registry 时也需要调用这些接口。Controller &#xff1a;这里提…...

无限次使用 cursor pro

github地址 cursor-vip 使用方式 在 MacOS/Linux 中&#xff0c;请打开终端&#xff1b; 在 Windows 中&#xff0c;请打开 Git Bash。 然后执行以下命令来安装&#xff1a; 部分电脑可能会误报毒&#xff0c;需要关闭杀毒软件/电脑管家/安全防护再进行 方式1&#xff1a;通过…...

网站运维之整站同步

网站运维之整站同步 1、使用rsync安装rsync工具子服务器生成密钥子服务器发送公钥到服务端&#xff08;需要root允许ssh登录&#xff09;服务端添加密钥子服务器尝试免密登录子服务器添加任务计划 2、开启root用户远程ssh3、ubuntu开启root用户 1、使用rsync 很多时候由于访问…...

【机器人】Graspness 端到端 抓取点估计 | 论文解读

在复杂场景中实现抓取检测&#xff0c;Graspness是一种端到端的方法&#xff1b; 输入点云数据&#xff0c;输出抓取角度、抓取深度、夹具宽度等信息。 开源地址&#xff1a;GitHub - rhett-chen/graspness_implementation: My implementation of Graspnet Graspness. 论文地…...

力扣2300.咒语和药水的成功对数(二分法)

根据 灵茶山艾府 题解所写 题目描述&#xff1a; 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表示第 i 个咒语的能量强度&#xff0c;potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药…...

WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现

一、前言 罗马不是一天建成的。 每个全栈工程师都是从HELLO WORLD 起步的。 之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。 今天我们用更简单的来实现&#xff1a; Python。 我们将用Python来实现一个学生管理应用&#xff0…...

云原生周刊:Kubernetes v1.32 正式发布

开源项目推荐 Helmper Helmper 简化了将 Helm Charts导入OCI&#xff08;开放容器倡议&#xff09;注册表的过程&#xff0c;并支持可选的漏洞修复功能。它确保您的 Helm Charts不仅安全存储&#xff0c;还能及时应用最新的安全修复。该工具完全兼容 OCI 标准&#xff0c;能够…...

京准电钟:电厂自控NTP时间同步服务器技术方案

京准电钟&#xff1a;电厂自控NTP时间同步服务器技术方案 京准电钟&#xff1a;电厂自控NTP时间同步服务器技术方案 随着计算机和网络通信技术的飞速发展&#xff0c;火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分析和应用…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...