技术速递|为 .NET iOS 和 .NET MAUI 应用程序添加 Apple 隐私清单支持

作者:Gerald Versluis
排版:Alan Wang

Apple 正在推出一项隐私政策,将隐私清单文件包含在针对 App Store 上的 iOS、iPadOS 和 tvOS 平台的新应用程序和更新应用程序中。请注意,至少目前 macOS 应用程序被排除在外。

隐私清单文件(PrivacyInfo.xcprivacy)列出了 .NET MAUI 应用程序或任何第三方 SDK 和包收集的数据类型,以及使用某些必需原因 API 类别的原因。

截至撰写本文时,Apple 已发出有关将此政策纳入您的应用程序的通知。自 2024 年 5 月 1 日起,为了通过 App Store 审核,这将是强制性的。在这篇文章中,我们将了解您的 .NET MAUI、.NET for iOS 和 Xamarin 应用程序需要什么,才能保持合规性并能够继续发布应用程序的更新。

什么是 Apple 隐私清单?

几年前,Apple 开始向您收集有关您在 iOS 应用程序中收集的数据以及您如何使用这些数据的信息。然后,这些信息会在您的应用程序的 App Store 列表中显示给最终用户。下面是一个例子。
在这里插入图片描述
虽然这是向用户透明和保护他们的隐私迈出的一大步,但作为应用程序开发人员,您可能并不总是清楚您实际收集的数据。您知道您在应用程序中收集的数据是什么以及如何处理这些数据,但您很可能正在使用第三方库,这些库可能会进行自行处理。例如,通过使用 .NET MAUI 构建应用程序,您已经在使用可能需要在隐私报告中进行记录的某些 API 的框架。

为了进一步丰富隐私报告数据,Apple 推出了 Apple 隐私清单。此清单是另一个基于 XML 的元数据文件,应包含在您的应用程序中,而且库开发人员现在也应在需要时将其包含在其库中。

通过这种方式,Apple 可以将框架、库和应用程序中的所有不同的 PrivacyInfo.xcprivacy 文件级联为一份非常完整的隐私报告,然后将其显示在应用程序的 App Store 列表中。

隐私清单和 .NET

这对于基于 .NET 的 iOS 应用程序意味着什么?您的 .NET MAUI 和 .NET for iOS 应用程序中还需要包含隐私清单。幸运的是,这里不需要额外的支持,就像 .NET for iOS 和 .NET MAUI 应用程序一样。您可以使用现有的工具和 SDK 完成所需的一切。

PrivacyInfo.xcprivacy 文件是 XML 格式的元数据文件,很像您可能已经知道的 Info.plist。该文件应填写适用于您的应用程序的隐私条目。当前需要在隐私清单中添加条目的 API 列表可以在 .NET for iOS 存储库中找到,以及有关何时在清单中添加哪个条目以及如何添加的详细说明。

.NET 应用程序的最小隐私清单

根据您使用的 SDK,三层可能会使用任何必需的原因 API:

  • .NET 运行时和基类库 (BCL)
  • 适用于 iOS SDK 的 .NET
  • .NET MAUI SDK

作为上述 SDK 的一部分,我们确定了这些 SDK 中使用的三个类别,需要在隐私清单中添加条目:

  • 文件时间戳 API
  • 系统启动时间 API
  • 磁盘空间 API

因此,所有 .NET 应用程序都必须在隐私清单文件中包含上述类别。以下是当您构建基于 .NET 的 iOS 应用程序时 PrivacyInfo.xcprivacy 文件的内容。

需要澄清的是,所有使用 .NET 构建并在 iOS 上运行的应用程序都至少需要以下清单。最重要的是,您应该识别在自己的代码中使用的 API 以及来自第三方库和框架的条目。

注意:以下内容仅针对 .NET MAUI 版本 8.0.0 及更高版本进行验证。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
        </dict>
        <!--
            The entry below is only needed when you're using the Preferences API in your app.
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict> -->
    </array>
</dict>
</plist>

特别是对于 .NET MAUI,可能需要取消对最后一个条目的注释。仅当您使用 Preferences API 时,才需要 CA92.1 的条目。否则你不需要它的原因是因为编译器将修剪所有未使用的 API,包括 Preferences 使用的 API,除非你在代码中引用它们。

若要将此文件添加到您的 .NET for iOS 项目中,请复制上述内容并将其粘贴到名为 PrivacyInfo.xcprivacy 的文件中,并将其放置在 Resources 文件夹下。这就是将文件打包到 iOS 应用程序的根目录中所需的全部内容。

对于 .NET MAUI 应用程序,将上述内容复制粘贴到名为 PrivacyInfo.xcprivacy 的文件中,并将其放置在 Platforms/iOS 文件夹下。然后使用您喜欢的文本编辑器编辑 .NET MAUI 项目 csproj 文件,并将以下部分添加到 节点下的某处。

<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
    <BundleResource Include="Platforms\iOS\PrivacyInfo.xcprivacy" LogicalName="PrivacyInfo.xcprivacy" />
</ItemGroup>

这将确保清单文件位于捆绑包的根目录中。

有关隐私清单以及您的应用可能需要哪些条目的更多信息,请参阅 Microsoft Learn 文档。

Xamarin.iOS 和 Xamarin.Forms 的隐私清单

上述所有内容也适用于 Xamarin.iOS 和 Xamarin.Forms 应用程序。就像适用于 iOS 的 .NET 和 .NET MAUI 应用程序一样,幸运的是,这里不需要额外的支持,所需的一切都可以使用今天提供的工具和 SDK 来完成。

您可以创建一个 PrivacyInfo.xcprivacy 文件并将其包含在您的项目中,该文件应满足 App Store 要求。确保创建一个完整的隐私清单文件,其中包含描述您的应用程序并将其添加到您的项目所需的所有条目。

请确保对于 Xamarin.iOS 项目和 Xamarin.Forms 项目,文件都标记为捆绑资源(将Build Action设置为 BundleResource),这将正确地添加到生成的二进制文件中。对于 Xamarin.Forms,只需在 iOS 项目中添加清单文件。

有关应用程序可能需要哪些条目以及如何将 PrivacyInfo.xcprivacy 文件添加到 Xamarin 项目的更多说明,可以在 .NET for iOS 存储库中找到。还有适用于 .NET MAUI 的 Microsoft Learn 文档,就隐私清单的外观而言,该文档仍然适用于 Xamarin。

Mac Catalyst 和 macOS 应用程序

目前,包括 Mac Catalyst 在内的 macOS应用程序似乎不需要解释所需原因 API 的隐私清单条目。但是,如果您的应用程序或您在应用程序内部使用的任何 SDK 正在收集个人数据,则仍然需要清单文件和相关条目。有关所需条目的更多信息,请参阅 Apple 文档。

将 PrivacyInfo.xcprivacy 文件添加到项目中的过程与上述相同,但是您应该将该文件放置在 macOS 应用程序包中的 Contents/Resources/ 子文件夹下,而不是像 iOS 那样放置在根目录下。

第三方库

请注意,最终,作为应用程序开发人员,您有责任为您的应用程序提供正确的隐私清单,无论您使用什么库或框架。如果您不断收到来自 App Store 审核系统的警告,请确保您已添加涵盖您的应用程序代码的所有必要条目。

当您确定警告不是由应用程序中的代码触发时,请务必检查您可能正在使用的第三方库和框架,确保它们在需要时也包含清单文件。

对于开源项目,您可以轻松检查代码以查看是否使用了需要清单中条目的任何 API。请参阅 Microsoft Learn 以获取需要在隐私清单中输入的 API 列表。

如果项目作者无法为其产品提供清单文件,您可以通过在您自己的 PrivacyInfo.xcprivacy 文件中添加已识别的所需条目来解决此问题。确保您了解 API 的用途及其用途,以便您可以在需要时自信地将此信息传达给用户。

您是库作者吗?

也许您自己就是库维护者,在这种情况下,本博客文章和链接文档中描述的所有内容也适用于您的项目。

截至撰写本文时,我们仍在研究如何才能最好地帮助您(以及您的用户)满足 Apple 的这些新要求。目前我们的建议是检查您的代码库,识别需要在隐私清单中输入条目的代码,并将该信息提供给您的用户,以便他们可以将其添加到他们的应用程序清单中。您可能需要包含一些关于为什么需要这些条目的解释。

如果您维护绑定库,您将需要考虑更新本机库。很可能其中已包含隐私清单文件。但是,绑定该新版本的库不会自动在最终用户应用程序中包含所需的清单文件。请暂时仍将此信息传递给用户,以便他们可以手动添加。

验证添加清单

为了验证隐私清单是否已正确添加,请将包含清单的应用程序提交到 App Store 进行审核。Apple 系统将对提供的二进制文件进行大量自动检查。如果出现问题,他们会向您注册 Apple 开发者帐户的电子邮件地址发送一封电子邮件。

如果您没有收到任何电子邮件,或者电子邮件没有具体说明有关隐私清单的任何内容,您可以放心地假设它已正确添加。

总结

请参阅我们对 Apple 隐私清单的详细描述,并确保您了解您的应用程序所需内容。归根结底,您有责任告知用户您如何处理他们的数据,并以正确的方式向 Apple 提供这些信息。

为了确保您的应用程序发布不受影响,请现在开始将其添加到您的应用程序中。在 2024 年 5 月 1 日截止日期之前做好准备,您将确保在此之后可以继续发布您的应用程序。

请记住,作为开发人员,您始终有责任确保隐私清单是正确的、最新的并包含在您的应用程序中。在撰写本文时(2024 年 3 月),我们已经确定了需要在清单中添加条目的所有 API,但这些 API 可能会随着时间的推移而发生变化。请务必检查 Apple 文档以了解最新要求。

如果您有任何疑问,请在 .NET for iOS 存储库上查看此问题,以查找其他开发人员的经验以及我们工程团队对问题的解答。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这部经典之作,时隔六年迎来重磅升级!

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…

Niobe WiFi IoT开发板OpenHarmony内核编程开发——Semaphore

本示例将演示如何在Niobe WiFi IoT开发板上使用cmsis 2.0 接口进行信号量开发 Semaphore API分析 osThreadNew() osThreadId_t osThreadNew(osThreadFunc_t func, void *argument,const osThreadAttr_t *attr )描述&#xff1a; 函数osThreadNew通过将线程添加到活动线程列表…

TG-12F使用SDK对接阿里生活物联网平台

文章目录 前言一、注意二、准备1. 安装Ubuntu&#xff08;版本20.04 X64&#xff09;程序运行时库。按顺序逐条执行命令&#xff1a;2. 安装Ubuntu&#xff08;版本20.04 X64&#xff09;依赖软件包。按照顺序逐条执行命令&#xff1a;3. 安装Python依赖包。按照顺序逐条执行命…

vscode 打代码光标特效

vscode 打代码光标特效 在设置里面找到settings 进入之后在代码最下方加入此代码 "explorer.confirmDelete": false,"powermode.enabled": true, //启动"powermode.presets": "fireworks", // 火花效果// particles、 simple-rift、e…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…

eclipse导入maven项目与配置使用本地仓库

前言 本人润国外了&#xff0c;发现不能用收费软件IDEA了&#xff0c;需要使用eclipse&#xff0c;这个免费。 但是早忘了怎么用了&#xff0c;在此总结下。 一、eclipse导入本地项目 1.选这个&#xff1a;open projects from file system… 2.找到项目文件夹&#xff0c;…

如何编写易于访问的技术文档 - 最佳实践与示例

当你为项目或工具编写技术文档时&#xff0c;你会希望它易于访问。这意味着它将为全球网络上的多样化受众提供服务并可用。 网络无障碍旨在使任何人都能访问网络内容。设计师、开发人员和撰写人员有共同的无障碍最佳实践。本文将涵盖一些创建技术内容的最佳实践。 &#xff0…

KIVY 学习1

环境 python 3.6 3.7 对应Kivy 1.11.1版本各依赖 python -m pip install docutils pygments pypiwin32 kivy_deps.sdl20.1.22 kivy_deps.glew0.1.12 这是一个用于安装Python包的命令&#xff0c;它会安装一些特定的包。具体来说&#xff0c;这个命令会安装以下包&#xff1a; …

Python的国际化和本地化【第162篇—国际化和本地化】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 随着全球化的发展&#xff0c;多语言支持在软件开发中变得越来越重要。Python作为一种流行的…

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

游戏实践:扫雷

一.游戏介绍 虽然很多人玩过这个游戏&#xff0c;但还是介绍一下。在下面的格子里&#xff0c;埋的有10颗雷&#xff0c;我们通过鼠标点击的方式&#xff0c;点出你认为不是雷的地方&#xff0c;等到把所有没有雷的格子点完之后&#xff0c;及视为游戏胜利。 上面的数字的意思…

Linux第90步_异步通知实验

“异步通知”的核心就是信号&#xff0c;由“驱动设备”主动报告给“应用程序”的。 1、添加“EXTI3.c” #include "EXTI3.h" #include <linux/gpio.h> //使能gpio_request(),gpio_free(),gpio_direction_input(), //使能gpio_direction_output(),gpio_get_v…

数据资产管理制度探索——浙江篇

在行政事业单位数据资产管理领域&#xff0c;浙江省以创新性思维与高质量发展的战略眼光&#xff0c;积极探索并构建了具有前瞻性和实效性的数据资产管理制度。作为财政部数据资产管理试点省份&#xff0c;浙江省财政厅与省标准化研究院强强联合&#xff0c;充分运用数据溯源、…

40.原子累加器

java8之后&#xff0c;新增了专门用于计数的类&#xff0c;LongAccumulator,LongAdder的性能高于AtomicLong。 LongAdder 性能 > AtomicLong 性能 性能高的原因&#xff1a;如果都往一个共享变量上面进行累加&#xff0c;那么比较重试的次数肯定就多&#xff1b;如果分成几…

KubeSphere中间件部署

中间件部署实战 语雀 RuoYi-Cloud部署实战 语雀 https://www.bilibili.com/video/BV13Q4y1C7hS?p79 应用部署三要素 应用的部署方式&#xff08;Deployment、StatefulSet、DaemonSet&#xff09; 应用的数据挂载&#xff08;数据、配置文件&#xff09; 应用的可访问性…

【AngularJs】前端使用iframe预览pdf文件报错

<iframe style"width: 100%; height: 100%;" src"{{vm.previewUrl}}"></iframe> 出现报错信息&#xff1a;Cant interpolate: {{vm.previewUrl}} 在ctrl文件中信任该文件就可以了 vm.trustUrl $sce.trustAsResourceUrl(vm.previewUrl);//信任…

二期 1.3 Spring Cloud Alibaba微服务组件Nacos注册中心介绍

文章目录 一、注册中心有什么用?二、注册中心对比三、Nacos是什么?3.1 Nacos 基本概念3.2 Nacos 主要功能3.3 Nacos 优势一、注册中心有什么用? 谈起微服务架构,总会提到注册中心,它是微服务架构必不可少的组件之一,那么注册中心作用到底是什么? 话说微服务架构下 服务…

AI大模型探索之路-应用篇9:Langchain框架LangSmith模块-AI模型监控神器

目录 前言 一、概述 二、准备工作 三、代码实践 二、监控查看 总结 前言 在经过前面多个篇章的学习后&#xff0c;我们已经了解到Langchain框架是一个为开发人员提供的全方位服务方案。从模型封装调用、提示词模板封装、Chain链式操作、检索增强&#xff0c;再到上线部署…

通过Transform与Animation,来探索CSS中的动态视觉效果

在 transform 和 animation 出现之前&#xff0c;前端开发者通常需要编写大量的 JavaScript 代码来实现动态效果。然而&#xff0c;这两个 CSS 属性的引入极大地简化了丰富动效和过渡效果的实现&#xff0c;从而让用户界面更加引人入胜&#xff0c;交互体验更为流畅。本文将深入…

每日OJ题_BFS解决FloodFill④_力扣130. 被围绕的区域

目录 力扣130. 被围绕的区域 解析代码 力扣130. 被围绕的区域 130. 被围绕的区域 难度 中等 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&…