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

2024-04-24 06:44

本文主要是介绍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 的使用,但是我觉得没啥意义

这篇关于Flutter 上架如何解决 ITMS-91053 问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931028

相关文章

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1