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

news2024/11/22 7:45:23

作者: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 存储库上查看此问题,以查找其他开发人员的经验以及我们工程团队对问题的解答。

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

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

相关文章

javaWeb项目-外面点餐系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

云服务器降价,阿里腾讯华为京东云优惠价格表整理

现在租一个服务器多少一个月&#xff1f;优惠价格低至3.8元1个月&#xff0c;租用一个月云服务器收费价格表&#xff1a;阿里云和腾讯云2核2G3M服务器优惠价格61元一年&#xff0c;折合一个月5元&#xff0c;京东云轻量云主机5.8元一个月&#xff0c;华为云服务器优惠价格3.8元…

状态模式【行为模式C++】

1.概述 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 2.结构 State(抽象状态类)&#xff1a;定义一个接口用来封装与上下文类的一个特定状态相关的行为&#xff0c;可以有一个或多…

家居网购项目(权限验证+事务管理)

文章目录 1.过滤器权限认证1.程序框架图2.web.xml3.编写AdminAuthorization4.编写MemberAuthorization5.细节6.结果展示1.未登录可以任意浏览商品2.点击添加购物车提示登录3.点击后台管理&#xff0c;提示管理员登录4.也做了其余资源的访问验证 2.事务管理1.思路分析2.重写JDBC…

AI大模型日报#0415:贾佳亚团队新作王炸、马斯克首款多模态大模型、ChatGPT to B

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 融合ChatGPTDALLE3&#xff0c;贾佳亚团队新作开源&#xff1a;识图推理生图一站解决 摘要: 贾佳亚团队推出了多模态模型Mini-Gem…

Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码&#xff0c;写了不少&#xff0c;所以这一块觉得不是问题&#xff1a; 判断版本&#xff0c;Android8.0判断是否有未知来源安装全选&#xff0c;没有则打开未知来源安装权限设置界面去开启…

pdf预览空白问题解决。第一次预览正常,再重新打开就空白的问题。是因为cmaps没有更新

文章目录 问题描述问题解决问题总结曾经参考过的文章&#xff08;也未能解决&#xff09; 问题描述 我用的是pdfjs作为PDF预览工具使用。 预览有电子签章的PDF后(如下图的水印、签章)&#xff0c;再重新预览没有电子签章的PDF&#xff0c;就会空白。 如上图&#xff0c;第一个…

【Linux】磁盘管理和文件系统

目录 一、硬盘 1.硬盘结构 2.结构类型 二、MBR与磁盘分区 1.MBR主引导记录 2.磁盘分区结构 三、文件系统类型 四、linux系统添加并使用新硬盘的步骤 1.添加新的硬盘 2.刷新识别 3.进行分区 4.格式化&#xff0c;创建文件系统 5.挂载使用 一、硬盘 1.硬盘结构…

什么是人力资源成本?人力资源成本有哪些?

人力资源成本是企业运营成本的重要组成部分&#xff0c;对企业的财务状况和经营效率有着直接影响&#xff0c;如今企业面临着持续的成本压力和效率挑战。人力资源成本不仅直接关联企业的运营效率&#xff0c;还影响着企业的长期战略发展。因此&#xff0c;如何优化人力资源成本…

二、变量和引用

目录 2.1 什么是变量 2.2变量的命名 2.3 变量的类型 2.3.1 根据数据类型分类 2.3.2 根据作用域分类 2.4 变量的定义 2.5 shell中的引用 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理…

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难&#xff0c;可以转换为一维的字符串&#xff0c;在一维字符串中考虑较为简单&#xff0c;要注意本题中两个字符交换位置时只能是x和另外字符交换&#xff0c;本题另外一个难点在于如何…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代&#xff0c;社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而&#xff0c;如何有效利用社交裂变&#xff0c;实现用户快速增长&#xff0c;却是许多品牌面临的挑战。今天&#xff0c;我们将为大家介绍一个强大的社交裂变引擎——Xinstall&#xff0c;它…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定&#xff0c;导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台&#xff0c;包括无人机app以及仿司空2的管理平台&#xff0c;集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

包装类初识泛型

一.包装类 在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型) 1.基本类型对应的包装类 byte -- Byteshort -- Shortint -- Integerlong -- Longfloat -- Floatdouble -- Doublech…

20V/3A大电流线性稳压器替代MIC29302/MIC29300

概述(替代MIC29302/MIC29300) PCD3942 是一款低压差稳压器&#xff0c;专为快速瞬态响应而优化。该装置能够提供 3A 的输出电流&#xff0c;典型压降为 325mV。工作静态电流为 1mA&#xff0c;关机时降至 1μA 以下&#xff0c;同时压差模式下静态电流控制良好。除了快速瞬态响…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

《HF经理》:二认知误区

一、管理者掌握重要权力&#xff1a; 二、全力来自管理者的职位&#xff1a; 三、管理者必须控制自己的直接下属&#xff1a; 对策&#xff1a;展示自己的品质&#xff0c;能力和影响力 四、管理者必须建立良好的个人关系&#xff1a; 五、管理这必须确保一切运行正常&…

深度学习框架

深度学习框架 1 引言 在当今技术加速发展的时代&#xff0c;深度学习已经成为了人工智能领域内最为引人注目的子领域之一。其在图像识别、自然语言处理、自动驾驶等多个行业中的成功应用&#xff0c;已经证明了深度学习在解决复杂问题方面的巨大潜力。然而&#xff0c;深度学习…

31、链表-K个一组反转链表

思路&#xff1a; 首先知道如何反转链表&#xff0c;其次找出每组的开始节点和结束节点&#xff0c;然后对于不足与k个的链表保持原状。 代码如下&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (headnull||k1){return head;}ListN…

一个小小逻辑符的错误使用,资损几万块?

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 这是一个真实事件&#xff0c;三年前老猫负责公司的支付资产业务。为了响应上级号召&#xff0c;加强国央企之间的合作&#xff0c;公司新谈了一个支付对接的渠道&#xff08;当然这个支付渠道其实很…