Flutter 上架如何解决 ITMS-91053 问题

最近,我的 Flutter App 发布到 TestFlight 后,就会收到一封邮件:The uploaded build for YOUR APP has one or more issues.

苹果的提示邮件
上面的邮件主要是说,我的 App 缺少了调用 API 的声明,以前从来没看到过,上网一查,才知道了原委。

一、苹果的提交隐私政策更新

2023 年 WWDC 之后,苹果发布了新的《App Store 提交隐私更新》的政策。该政策分为两部分:第三方 SDK 隐私清单和签名。

意思就是,App 中引入的三方 SDK 可能以开发者和用户不知道的方式,影响了用户隐私。每个开发者都有责任搞清楚引入的第三方 SDK到底收集了何等数据以及如何使用它们。苹果的方式就是增加了一种机制,隐私清单,以及 SDK 签名,帮助开发者更好地理解三方 SDK 如何收集和使用数据,为用户提供隐私保护。从 2024 年春季起,提交到 App Store 的 App 需要为 SDK 包含隐私清单(如果引用了广泛引用的三方 SDK)。如果二进制依赖一个 SDK,则还需要提供 SDK 的签名。

简单说,就是现在提供一个“名单”,榜上有名的三方 SDK 都需要特殊对待,不过看这意思,未来显然是要扩散到所有三方 SDK 的,榜上有名的只是治理的第一步。
在这里插入图片描述
另外,就是有一系列 API 的调用,需要声明理由。不论是 App 自己调用的,还是引用的三方 SDK 调用的,都需要提供理由。如果你没有提供理由,则会收到提示,这就有了文章开头的那封信。也就是 ITMS-91053。而调用这些 API 的理由,则不是任意理由,而是经过苹果审核后,认为直接对用户有益处的理由,才在允许的范围内。

从今年 2024 年春天起,必须要在提交的 App 中包含隐私清单,而且这里应该包含对 API 调用的说明。

苹果的官方说明
上面是 2 月底的一次通知,说明了从 3 月 13 日起,App Store Connect 会发送邮件提醒,你的 App 缺乏了调用 API 的理由。而从 5 月 1 日起,苹果列出的 API 的调用,必须包含理由。如果你找不到理由,就不允许使用 API 了。如果添加了名单上的 SDK,还需要包含这些 SDK 的签名。

相关的 API 有五类:

  1. File timestamp APIs
  2. System boot time APIs
  3. Disk space APIs
  4. Active keyboard APIs
  5. User defaults APIs

更详尽的说明可以看大佬的文章,搜索《Flutter 上了 Apple 第三方重大列表,2024 春季 iOS 的隐私清单究竟是什么?》

二、收到 ITMS-91053 后,怎么操作?

我觉得详细的指引还是可以看大佬的文章,只是太高端了,我有点看不懂。摸索了很久,才大概明白了怎么做。

比如,我明白,我需要提供一个 Privacy 的声明,但是到底怎么做?比如是否要所有的三方 SDK 各自声明就行了?而我作为开发者什么都不用做?事实证明这是错的。

又比如,是不是我运行一下 flutter pub get 或者什么脚本,就会自动替我声明一个 Privacy 文件?事实证明这也是错的。

还比如,我是否要检查所有的三方 SDK,看看他们有没有按照要求在自己的 SDK 里提供隐私声明?不过这个真的很有难度,对于不熟的人来说,找都找不到的,比如我就找不到。好在,到了现在 4 月了,马上到 deadline 了,大部分还在维护的 SDK 都添加了 Privacy manifest 了。还好还好,除非太冷门或者作者早已弃坑的 SDK,我没用到。

然后,还有一个重要问题就是 API 的 reasons,这个我看了很多文章都没说清楚。更可恨的是,绝少有 SDK 主动声明自己调用了什么 API,比如我的将近 30 个三方 SDK,只有一个声明自己调用了两种 API(一共五种)。

那么我作为开发者,我到底要干啥?我怎么知道哪个 SDK 用了什么 API,以及他们的原因呢?搜了很多的文章,都没有什么明确的说法,可能对于开发老手来说,都是不言自明的?

折腾了两整天,我大概明白了一件事情。开发者,应该在自己的 App 里提供一个 PrivacyInfo 声明文件,里面应该包含对指定 5 种 API 调用的声明。至于应该声明哪几种。这个就用投石问路的方法即可,你提交到 TestFlight,它会发邮件提醒你,有哪几种 API 你没声明理由。你就在自己的 PrivacyInfo 文件种,解释这几种即可。

比如,开头我贴的邮件,里面涉及了 4 种 API 调用的原因缺乏。你只要声明这四种 API 的调用原因即可。至于到底是哪个 SDK 用的?真实基于什么原因用的,我觉得不太需要关心。因为我自己关心过,我发现,完全是毫无意义的。很难探究,无论是查看 sdk 的源码还是用扫描工具,很难得到什么有益的提示,至于具体的调用原因,就更难搞清楚了。你要做的就是,它说什么有问题,你就声明什么,至于理由,只有少数几种允许的理由,你只要选一个你觉得合理的就行了。具体是什么好像也并不重要。再说太阳底下无新鲜事,难道还有什么神奇理由么?无非就那么几种。

在这里插入图片描述
选中你的 Runner 项目,点 File 菜单,New,然后点 File...
在这里插入图片描述
这样就会在你的项目里创建了一个文件,叫 PrivacyInfo.xcprivacy,和你的 info.plist 在一个目录下。这里我有一个点要提示,因为困扰了我很久,就是一定要把文件选入进 target,在右侧面板,能看到:

在这里插入图片描述
在 XCode 15 右侧的面板上能看到(选中 PrivacyInfo 文件)。这个选项的意思是,将这个文件编译进包里的意思。如果你不勾,相当于没有提供这个文件,我已经试过了。

然后,你用 XCode 15 的编辑工具,用鼠标点选,就可以创建这个文件了。按照我现在的理解,你只要处理好这部分就行了:

在这里插入图片描述
因为我提交到 TestFlight 只提示了四种 API,我就声明了这四种。上面三个声明,据实填写即可。似乎也不用填写 SDK 相关的,只填写你自己编写的部分即可。因为我试过,在 Organizer 里,它会自动的从三方 SDK 里提取到隐私相关的,但是 API 的却不会,必须要你自己声明。

比如,那个 Privacy Nutrition Label Types,其实我自己的 App 是没用的,一个 Google 的包里,用到了。但是我不声明,在 Organizer 里,你选择导出报告的时候,是自动包含了 Google 的声明的。

在这里插入图片描述
创建好 PrivacyInfo 文件,重新打包,提交到 App Store 后,如果没有收到提示邮件那就是成功了。如果明明创建了文件,还是收到提示邮件,就是主要我前文提到的 Target Membership 是否勾选。

总结

本文介绍了,如果收到了 ITMS-91053 提示后,如何添加隐私声明文件,以及怎么创建隐私声明文件。希望对大家有帮助。

引用:
https://forums.developer.apple.com/forums/thread/731541 关于那个 Target Membership
https://github.com/bytebai920/check_privacy 号称可以扫描 API 的使用,但是我觉得没啥意义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+Vue开发记录(三)

说明:本篇文章的主要内容为需求分析。需求分析这一部分很重要,也稍微有点子难搞,所以本篇文章里的有些内容会有失偏颇。 一、准备步骤 我打算做一个刷题项目,但是具体这个项目该怎么做,我是一头雾水。 所以就要先进行…

消灭AI“耗电巨兽”?暴雨服务器推出液冷节能降耗算力方案

在科技飞速发展的今天,人工智能已成为驱动未来的重要力量。随着AI及大模型技术的进一步普及和应用场景的拓宽,相关算力需求呈指数级增长,大规模的AI训练和推理过程均需消耗大量电力,如同一个巨大的电力黑洞,吞噬着海量…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机,用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

docker容器内彻底移除iptables服务的实现方法

背景 我创建的容器使用的是centos6的标准镜像,所以内置了iptables服务。容器启动后iptables服务默认就启动了。iptables设置的规则默认是所有流量都无法通行。而对于服务器的管理使用的是宿主机的防火墙。这样就导致在实现用iptables动态给容器添加端口映射时不成功…

coredns部署

coredns部署 coredns部署 一:coredns-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata:name: corednsnamespace: kube-systemlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcile --- apiVersion: rbac…

Hive服务详解

Hive服务 HiveServer2、Hive Metastore 服务服务共同构成了 Hive 生态系统中的核心功能,分别负责管理元数据和提供数据查询服务,为用户提供了一个方便、高效的方式来访问和操作存储在 Hive 中的数据。 1. Hive 查询服务(HiveServer2&#xf…

关于路由过滤、路由策略的实验eNSP

具体接口IP地址如下图所示 第一步:配置IP R1: [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip ad [R1-GigabitEthernet0/0/0]ip address 100.1.1.1 24 Apr 23 2024 19:35:38-08:00 R1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP on the interface Giga…

【论文笔记】RS-Mamba for Large Remote Sensing Image Dense Prediction(附Code)

论文作者提出了RS-Mamba(RSM)用于高分辨率遥感图像遥感的密集预测任务。RSM设计用于模拟具有线性复杂性的遥感图像的全局特征,使其能够有效地处理大型VHR图像。它采用全向选择性扫描模块,从多个方向对图像进行全局建模,从多个方向捕捉大的空间…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇,我们已学习:【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图: 本篇:把Gui Guider设计好的界面,移植到STM32工程。 特别地: 在使用Gui Guider进行界面设计时,应…

微信小程序 讯飞录音 点击按钮录音内容转文字

<page-meta page-style"{{ showPolish ? overflow: hidden; : }}" /> <view class"wrap"> <view class"header-tab" style"justify-content: {{typeList.length > 2 ? start : center}}"><view class&quo…

S-Edge网关:柔性部署,让物联网接入更统一

S-Edge网关是什么&#xff1f; 网关是在实际物理世界与虚拟网络世界相连接的交叉点&#xff0c;为了让这个交叉点尽可能的复用&#xff0c;无需每种设备都配套一种连接方式&#xff0c;边缘网关主要就是用于传感器等物理设备与网络实现数据交互的通用设备&#xff0c;也称为物…

贪心算法-活动安排问题和背包问题

实验6贪心算法-活动安排问题和背包问题 实验目的&#xff1a; 理解贪心算法的基本思想运用贪心算法解决实际问题 实验内容&#xff1a; 采用贪心方法编程实现以下问题的算法 1.如何安排下列活动使得使用的活动场所最少&#xff0c;并给出具体的安排方法。 活动 a b c …

Leetcode算法训练日记 | day34

专题九 贪心算法 一、K次取反后最大化的数组和 1.题目 Leetcode&#xff1a;第 1005 题 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个…

【大语言模型LLM】- Meta开源推出的新一代大语言模型 Llama 3

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

git常见命令(成长版)

ps&#xff1a;所谓成长版就是后续可能还会添加命令&#xff1a; 1.删除本地分支&#xff1a; git branch -d 分支名 2.拉取代码后默认master分支&#xff0c;切换到线上其他分支&#xff1a; &#xff08;1&#xff09;查看线上所有分支&#xff1a; git branch -a &#…

【STM32+HAL+Proteus】系列学习教程4---GPIO输入模式(独立按键)

实现目标 1、掌握GPIO 输入模式控制 2、学会STM32CubeMX配置GPIO的输入模式 3、具体目标&#xff1a;1、按键K1按下&#xff0c;LED1点亮&#xff1b;2、按键K2按下&#xff0c;LED1熄灭&#xff1b;2、按键K3按下&#xff0c;LED2状态取反&#xff1b; 一、STM32 GPIO 输入…

基于小程序实现的查寝打卡系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

[Algorithm][前缀和][模板 一维前缀和][模板 二维前缀和][寻找数组中心下标][除自身以外数组的乘积] + 前缀和原理 + 前缀和模板

目录 0.原理讲解1.[模板]一维前缀和1.题目链接2.模板代码实现 2.[模板]二维前缀和1.题目链接2.算法原理讲解3.模板代码实现 3.寻找数组的中心下标1.题目链接2.算法原理详解3.代码实现 4.除自身以外数组的乘积1.题目链接2.算法原理详解3.代码实现 0.原理讲解 前缀和&#xff1a;…

Docker学习(二十五)构建 Arthas 基础镜像

目录 一、简介二、构建基础镜像2.1 下载 Arthas2.2 编写 Dockerfile2.3 构建镜像2.4 创建容器2.5 测试 一、简介 Arthas 是一款由 阿里巴巴 开发的 线上监控诊断工具。通过全局视角实时查看应用负载、内存、GC、线程等信息&#xff0c;能在不修改代码的情况下&#xff0c;对业…

Pytorch常用的函数(八)常见优化器SGD,Adagrad,RMSprop,Adam,AdamW总结

Pytorch常用的函数(八)常见优化器SGD,Adagrad,RMSprop,Adam,AdamW总结 在深度学习中&#xff0c;优化器的目标是通过调整模型的参数&#xff0c;最小化&#xff08;或最大化&#xff09;一个损失函数。 优化器使用梯度下降等迭代方法来更新模型的参数&#xff0c;以使损失函数…