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

iOS问题记录 - App Store审核新政策:隐私清单 SDK签名(持续更新)

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
    • 1. 隐私清单 & SDK签名
      • 1.1. 隐私清单 - 数据使用声明
      • 1.2. 隐私清单 - 所用API原因描述
      • 1.3. SDK签名
    • 2. 即将发布的第三方SDK要求
  • 解决方案
  • 最后


前言

前段时间用Flutter开发的iOS App提交了新版本,结果刚过两分钟就收到了一封问题邮件,我还以为审核被拒了,结果并没有。

粗略看了看,只是出了审核新政策,2024/05/01开始才会被拒。那还早,当时我就不慌了,继续忙其他事情,直到现在才有空研究一番这个问题。

注意:文中有很多描述没有官方中文,所以可能存在翻译不够准确的情况。

开发环境

  • Xcode: 15.3
  • Flutter: 3.19.4
  • macOS: 14.4

问题描述

审核问题邮件内容:

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.

问题分析

1. 隐私清单 & SDK签名

从邮件内容看,问题很明确,缺少API声明,看了看链接指向的文档,原来是新政策要求提供隐私清单,并声明所用API的原因。

If you upload an app to App Store Connect that uses required reason API without describing the reason in its privacy manifest file, Apple sends you an email reminding you to add the reason to the app’s privacy manifest. Starting May 1, 2024, apps that don’t describe their use of required reason API in their privacy manifest file aren’t accepted by App Store Connect.

更多详情请看这个视频介绍:WWDC2023 - Get started with privacy manifests,右下角字幕可以切换为简体中文

screenshot1

视频可以简单概括两点:

  1. App的大部分隐私情况往往取决于第三方SDK,这就可能导致App的隐私标签不够准确,所以要求第三方SDK也提供隐私清单用于生成隐私报告,帮助App开发者更准确地创建隐私标签
  2. 第三方SDK以二进制文件的形式依赖时要求签名,更多详情请看视频WWDC2023 - Verify app dependencies with digital signatures

补充:隐私标签的创建位于App Store ConnectApp 隐私页面。

找了找隐私清单相关的官方文档:

  • Describing data use in privacy manifests
  • Describing use of required reason API

结合前面的视频,可知隐私清单主要包含数据使用声明所用API原因描述,先逐个看看都是些什么。

1.1. 隐私清单 - 数据使用声明

官方文档中的概述:

Record the categories of data that your app or third-party SDK collects about the person using the app, and the reasons it collects the data. App developers can use Xcode to create a privacy report, summarizing the information about collected data in their app and the third-party SDKs the app links to.
记录您的应用或第三方SDK收集的有关应用使用者的数据类别,以及收集数据的原因。应用程序开发人员可以使用Xcode创建隐私报告,总结有关应用程序中收集的数据以及应用程序链接到的第三方SDK的信息。

需要填写的内容:

KeyDescription
NSPrivacyCollectedDataType用于标识您的应用或第三方SDK收集的数据类型
NSPrivacyCollectedDataTypeLinked指示您的应用程序或第三方SDK是否将此数据类型关联到用户的身份
NSPrivacyCollectedDataTypeTracking指示您的应用程序或第三方SDK是否使用此数据类型进行跟踪
NSPrivacyCollectedDataTypePurposes列出您的应用或第三方SDK收集数据的原因

NSPrivacyCollectedDataType列举的部分数据类型:

screenshot2

NSPrivacyCollectedDataTypePurposes的可选项:

screenshot3

不知道你有没有感觉很熟悉,如果你上架过应用,那应该不会陌生,创建隐私标签时的选项不就是这些。打开App Store ConnectApp 隐私页面,找到数据类型并编辑:

screenshot4

上图中的选项对应着NSPrivacyCollectedDataType列举的数据类型。再看看下面这些,分别对应着NSPrivacyCollectedDataTypeLinkedNSPrivacyCollectedDataTypeTrackingNSPrivacyCollectedDataTypePurposes

screenshot5

screenshot6

screenshot7

所以给App创建隐私清单后,关于数据使用声明的填写,可以参考以前创建的隐私标签,毕竟以前创建的隐私标签基本没包含第三方SDK(如果以前有包含,填写时不需要涵盖)。下面举个简单例子,更多填写细节可以参考前面的视频介绍:

screenshot8

项目打包后生成的隐私报告(截取部分):

screenshot9

如图,如果第三方SDK有填写,也会整合在隐私报告中,以后隐私标签的创建可以直接参考隐私报告。那如果不想填数据使用声明可以吗?目前可以。

一是官方文档中没有明确声明会拒绝未填写数据使用声明的应用;二是提交审核暂时也没有收到这方面的问题邮件。隐私清单中的数据使用声明更多是为了帮助App开发者更准确的创建隐私标签。

1.2. 隐私清单 - 所用API原因描述

官方文档中的概述:

Some APIs that your app uses to deliver its core functionality — in code you write or included in a third-party SDK — have the potential of being misused to access device signals to try to identify the device or user, also known as fingerprinting. Regardless of whether a user gives your app permission to track, fingerprinting is not allowed. Describe the reasons your app or third-party SDK on iOS, iPadOS, tvOS, visionOS, or watchOS uses these APIs, and check that your app or third-party SDK only uses the APIs for the expected reasons.
您的应用程序用来提供其核心功能的某些API(在您编写的或包含在第三方SDK中的代码中)有可能被滥用来访问设备信号以尝试识别设备或用户,也称为指纹识别。无论用户是否授予您的应用跟踪权限,都不允许进行指纹识别。描述您的iOS、iPadOS、tvOS、visionOS或watchOS上的应用或第三方SDK使用这些API的原因,并检查您的应用或第三方SDK是否仅出于预期原因使用这些API。

需要填写的内容:

KeyDescription
NSPrivacyAccessedAPIType用于标识您的应用程序使用的所需原因API的类别
NSPrivacyAccessedAPITypeReasons用于标识您的应用程序使用API的原因

可选API类别及原因列表:

最后更新日期:2024/03/31

NSPrivacyAccessedAPITypeNSPrivacyAccessedAPITypeReasons
NSPrivacyAccessedAPICategoryFileTimestampDDA9.1声明此原因以向使用该设备的人员显示文件时间戳。

出于此原因访问的信息或任何派生信息可能不会发送到设备外。
C617.1声明此原因以访问应用程序容器、应用程序组容器或应用程序的CloudKit容器内文件的时间戳、大小或其他元数据。
3B52.1声明此原因以访问用户明确授予访问权限的文件或目录的时间戳、大小或其他元数据,例如使用文档选择器视图控制器。
0A2A.1如果您的第三方SDK提供文件时间戳API的包装函数供应用程序使用,并且您仅在应用程序调用您的包装函数时才访问文件时间戳API,请声明此原因。此原因只能由第三方SDK声明。如果您的第三方SDK主要是为了包装所需的原因 API 而创建的,则可能不会声明此原因。

出于此原因访问的信息或任何派生信息不得用于您的第三方SDK自身的目的,也不得由您的第三方SDK发送至设备外。
NSPrivacyAccessedAPICategorySystemBootTime35F9.1声明此原因以访问系统启动时间,以便测量应用程序内发生的事件之间经过的时间量或执行计算以启用计时器。

出于此原因访问的信息或任何派生信息可能不会发送到设备外。有关应用程序内发生的事件之间经过的时间量的信息有一个例外,该信息可能会发送到设备外。
8FFB.1声明此原因以访问系统启动时间,以计算应用程序内发生的事件的绝对时间戳,例如与UIKit或AVFAudio框架相关的事件。

您的应用内发生的事件的绝对时间戳可能会发送到设备外。出于此原因访问的系统启动时间或从系统启动时间派生的任何其他信息可能不会发送到设备外。
3D61.1声明此原因以在使用设备的人选择提交的可选错误报告中包含系统启动时间信息。系统启动时间信息必须作为报告的一部分显着地向人员显示。

仅在用户肯定选择提交包括系统启动时间信息的特定错误报告之后,并且仅出于调查或响应错误报告的目的,才可以将出于此原因访问的信息或任何派生信息发送到设备外。
NSPrivacyAccessedAPICategoryDiskSpace85F4.1声明此原因以向使用该设备的人员显示磁盘空间信息。磁盘空间可以以信息单位(例如字节)或与媒体类型结合的时间单位(例如高清视频的分钟)来显示。

出于此原因访问的信息或任何派生信息可能不会发送到设备外。有一个例外,允许应用程序通过本地网络将磁盘空间信息发送到同一个人操作的另一台设备,仅用于显示该设备上的磁盘空间信息;此例外仅适用于用户明确允许发送磁盘空间信息的情况,并且该信息不得通过Internet发送。
E174.1声明此原因是为了检查是否有足够的磁盘空间来写入文件,或者检查磁盘空间是否不足,以便应用程序可以在磁盘空间不足时删除文件。应用程序必须根据磁盘空间以用户可观察到的方式表现不同。

出于此原因访问的信息或任何派生信息可能不会发送到设备外。有一个例外,允许应用程序在磁盘空间不足时避免从服务器下载文件。
7D9E.1声明此原因以在使用设备的人员选择提交的可选错误报告中包含磁盘空间信息。磁盘空间信息必须作为报告的一部分突出地显示给相关人员。

仅在用户明确选择提交包括磁盘空间信息的特定错误报告之后,并且仅出于调查或响应错误报告的目的,因此访问的信息或任何派生信息才可以发送到设备外。
B728.1如果您的应用程序是健康研究应用程序,并且您访问此API类别来检测并通知研究参与者磁盘空间不足影响研究数据收集,请声明此原因。

您的应用程序必须符合应用程序商店审核指南§5.1.3。除了提供有关健康研究的信息并允许人们参与健康研究之外,您的应用程序不得提供任何其他功能。
NSPrivacyAccessedAPICategoryActiveKeyboards3EC4.1如果您的应用程序是自定义键盘应用程序,并且您访问此 API 类别以确定设备上处于活动状态的键盘,请声明此原因。

为用户提供系统范围的自定义键盘必须是应用程序的主要功能。
出于此原因访问的信息或任何派生信息可能不会发送到设备外。
54BD.1声明此原因以访问活动键盘信息,以便向使用该设备的人员呈现正确的自定义用户界面。应用程序必须具有用于输入或编辑文本的文本字段,并且必须以用户可观察到的方式根据活动键盘采取不同的行为。

出于此原因访问的信息或任何派生信息可能不会发送到设备外。
NSPrivacyAccessedAPICategoryUserDefaultsCA92.1声明此原因以访问用户默认读取和写入只能由应用程序本身访问的信息。

此原因不允许读取其他应用程序或系统写入的信息,或写入可由其他应用程序访问的信息。
1C8F.1声明此原因以访问用户默认值以读取和写入仅可由与应用程序本身属于同一应用程序组的成员的应用程序、应用程序扩展和应用程序剪辑访问的信息。

此原因不允许读取由同一应用程序组外部的应用程序、应用程序扩展或应用程序剪辑或系统写入的信息。如果系统提供来自全局域的信息,则您的应用程序不承担责任,因为当您的应用程序尝试读取应用程序的应用程序组中的应用程序、应用程序扩展或应用程序剪辑写入的信息时,您请求的域中不存在密钥。

此原因也不允许写入可由同一应用程序组外部的应用程序、应用程序扩展或应用程序剪辑访问的信息。
C56D.1如果您的第三方SDK围绕用户默认API提供包装函数供应用程序使用,并且您仅在应用程序调用您的包装函数时才访问用户默认API,请声明此原因。此原因只能由第三方SDK声明。如果您的第三方SDK主要是为了包装所需的原因API而创建的,则可能不会声明此原因。

出于此原因访问的信息或任何派生信息不得用于您的第三方SDK自身的目的,也不得由您的第三方SDK发送至设备外。
AC6B.1声明此原因以访问用户默认读取com.apple.configuration.managed键以检索MDM设置的托管应用程序配置,或设置com.apple.feedback.managed键来存储要通过MDM查询的反馈信息,如Apple移动设备管理协议参考文档中所述。

可以看到,问题邮件中提到的API在这都有列出来。按道理说照着官方文档填写就能解决当前问题了,可问题是我这是Flutter项目,业务逻辑代码编译后是放在了App.framework,Flutter项目默认的主程序文件Runner被检查出用了这些API没声明,我咋知道它用来干啥了?

首先要确定Runner可执行文件中的这些API调用怎么来的,本身Flutter项目中的iOS工程就没写几行代码,所以严重怀疑是来自静态库(.a)或静态框架(设置了s.static_framework = trueframework)。

使用Shell脚本扫描项目,果然一堆静态框架使用了这些API。大致根据实际用途,在App的隐私清单中选择填写:

screenshot10

第三方SDK没有隐私清单暂时先不管,重新提交审核,不再收到问题邮件!由此,暂时可以得出以下两个结论:

  1. 目前审核主要针对主程序文件,督促App开发者增加隐私清单
  2. 由于静态库和静态框架在项目构建时会被静态链接到主程序可执行二进制文件,所以这些库的所用API原因描述需要在App的隐私清单中填写

1.3. SDK签名

根据视频介绍,个人理解这个第三方SDK要求签名的检查应该是由Xcode完成,并不是在提交审核阶段。理由如下:

  1. 第三方SDK签名校验允许SDK提供者自签名,App开发者完全可以自行对第三方SDK进行签名
  2. Xcode打包时会用本机的证书对这些第三方SDK进行签名,所以提交审核的包不会存在没有签名的情况
  3. 第三方SDK如果已有签名,实测Xcode打包时也会用本机的证书重签名覆盖,所以提交审核的包不会存在原有签名的情况

可以通过以下命令查看框架的签名信息:

codesign -d --verbose=4 <framework-path>

当然,以上只是当前的个人理解,以后也许会有变化。

2. 即将发布的第三方SDK要求

从WWDC2023到2024年5月,苹果给了将近一年的时间给开发者适配。时间虽然足够,可是第三方SDK众多,甚至有很多已经停止更新,那该怎么办?

从前面的问题邮件可以看出,暂时还只是督促App开发者填写隐私清单,并没有指出第三方SDK的问题。更重要的是有这个即将发布的第三方SDK要求:

screenshot11

注意:以上只截取了部分名单,诸多Flutter的库在列(Flutter库一般是下划线命名,iOS原生库一般是大驼峰命名)。

个人理解,对于第三方SDK,目前还是以抓典型为主,不在名单内的不符合要求不一定抓。如果你用了名单内的,别担心,大部分已经适配,更新版本即可;如果不在名单内,已经适配的也尽量更新版本;如果已经停止更新,那没办法只能自己手动适配。

解决方案

新建隐私清单文件:

screenshot12

不要忘了勾选Targets,不然不会打包进应用程序:

screenshot13

参考前面的问题分析填写缺失的所用API原因描述。如果你不清楚这些API是在哪里调用的,可以使用Shell脚本扫描项目。

最后

如果这篇文章对你有所帮助,点赞👍收藏🌟支持一下吧,谢谢~


本篇文章由@crasowas发布于CSDN。

相关文章:

iOS问题记录 - App Store审核新政策:隐私清单 SDK签名(持续更新)

文章目录 前言开发环境问题描述问题分析1. 隐私清单 & SDK签名1.1. 隐私清单 - 数据使用声明1.2. 隐私清单 - 所用API原因描述1.3. SDK签名 2. 即将发布的第三方SDK要求 解决方案最后 前言 前段时间用Flutter开发的iOS App提交了新版本&#xff0c;结果刚过两分钟就收到了…...

ES学习日记(二)-------集群设置

上一节写了elasticsearch单节点安装和配置,现在说集群,简单地说就是在多台服务器上搭建单节点,在配置文件里面增加多个ip地址即可,过程同单节点部署,主要说集群配置 注意:不建议在之前单节点es上修改配置为集群,据说运行之后会生成很多文件,在单点基础上修改容易出现未知问题,…...

农村集中式生活污水分质处理及循环利用技术指南

立项单位&#xff1a;生态环境部土壤与农业农村生态环境监管技术中心、山东文远环保科技股份有限公司、北京易境创联环保有限公司、中国环境科学研究院、广东省环境科学研究院、中铁第五勘察设计院集团有限公司、中华环保联合会水环境治理专业委员会 本文件规定了集中式村镇生活…...

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…...

移动硬盘损坏打不开?别急,这里有解决方案!

在日常工作和生活中&#xff0c;移动硬盘几乎成为了我们必不可少的存储设备&#xff0c;它小巧便捷&#xff0c;能够容纳大量的数据。然而&#xff0c;当移动硬盘突然损坏打不开时&#xff0c;那份焦虑与无助几乎无法用言语来形容。那些重要的文件、珍贵的照片&#xff0c;似乎…...

微信小程序【从入门到精通】——服务器的数据交互

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

Python爬虫-懂车帝城市销量榜单

前言 本文是该专栏的第23篇,后面会持续分享python爬虫干货知识,记得关注。 最近粉丝留言咨询某汽车平台的汽车销量榜单数据,本文笔者以懂车帝平台为例,采集对应的城市汽车销量榜单数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码…...

《QDebug 2024年3月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Qt5 ApplicationWindow 不能使用父组件 Window 的 transientParent 属性 ApplicationWindow 使用 transientParent 报错&#xff1a; "ApplicationWindow.transientParent" is not available due to compone…...

C# OpenCvSharp-HoughCircles(霍夫圆检测) 简单计数

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using O…...

MybatisPlus速成

MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义 快速入门 入门案例 <dependency…...

【Django开发】0到1美多商城项目md教程第4篇:图形验证码,1. 图形验证码接口设计【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…...

八股 -- C#

面向对象 &#xff08;三大特性&#xff09; 三大特性目的是为了提供更好的代码组织、可维护性、扩展性和重用性 C#基础——面向对象 - 知乎 (zhihu.com) 封装 理解&#xff1a; 你不需要了解这个方法里面写了什么代码&#xff0c;你只需要了解这个方法能够给你返回什么数据&…...

科创新格局·共赢双循环“2024上海智能科技与创新展览会”

2024上海智能科技与创新展览会&#xff0c;将于6月中旬在上海新国际博览中心隆重召开。作为一场盛大的科技盛会&#xff0c;此次展览会将汇聚科技前瞻趋势&#xff0c;融合产业贸易优势&#xff0c;布局初创投资赛道&#xff0c;提供全方位场景生态的跨界合作&#xff0c;构建“…...

Chatopera 云服务的智能问答引擎实现原理,如何融合 #聊天机器人 技术 #Chatbot #AI #NLP

观看视频 Bilibili: https://www.bilibili.com/video/BV1pZ421q7EH/YouTube: https://www.youtube.com/watch?vx0d1_0HQa8o 内容大纲 提前在浏览器打开网址&#xff1a; Chatopera 云服务&#xff1a;https://bot.chatopera.comChatopera 入门教程&#xff1a;https://dwz…...

基于CNN-RNN的动态手势识别系统实现与解析

一、环境配置 为了成功实现基于CNN-RNN的动态手势识别系统&#xff0c;你需要确保你的开发环境已经安装了以下必要的库和工具&#xff1a; Python&#xff1a;推荐使用Python 3.x版本&#xff0c;作为主要的编程语言。TensorFlow&#xff1a;深度学习框架&#xff0c;用于构建…...

华为鲲鹏认证考试内容有哪些

华为鲲鹏认证考试的内容主要包括理论考核和实践考核两大部分。 在理论考核部分&#xff0c;主要考察考生对云计算、大数据、人工智能等相关领域的理论知识掌握情况&#xff0c;具体涉及体系结构、技术原理、应用场景等方面的内容。考生需要深入了解鲲鹏计算的特点&#xff0c;…...

Gitlab CI---could not read username for xxx: no such device or address

0 Preface/Foreword 项目开发中&#xff0c;经常会使用第三方的算法或者功能&#xff0c;那么就需要把对应的repo以子模块的方式添加到当前repo中。 添加命令&#xff1a; git submodule add <URL> 1 问题表现 子模块添加成功&#xff0c;但是GitLab CI阶段&#xff…...

三个AI创业方向各有特点和市场潜力

“AI 客户支持”乃成熟市场——B “AI 社交关系”属新旧交织之领域&#xff1b;——C “AI 企业知识”为专业化且对企业运营至要之领域——B AI 客户支持&#xff08;Al customer support&#xff09;&#xff1a;此方向着重借助 AI 大模型技术&#xff0c;以改良和提升客户服务…...

C语言学习笔记二

文章目录 进制的代码表示数字数据类型字符类型输出字符例子 进制的代码表示 #include <stdio.h> int main() {short a 0100; // 八进制int b -0x1; // 十六进制long c 720; //十进制unsigned short m 0xffff; //十六进制unsigned int n 0x80000000; //十…...

Sublime Text4 4169 安装激活【亲测可用】

此教程用于Windows 下Sublime Text4 4169版本的安装和激活。 无需安装其他软件&#xff0c;无需下载替换文件&#xff0c;无需注册机等。 官网&#xff1a; https://www.sublimetext.com 下载地址 64位&#xff1a;https://download.sublimetext.com/sublime_text_build_41…...

【数据结构与算法初阶(c语言)】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序-全梳理(万字详解,干货满满,建议三连收藏)

目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的排序算法 2.插入排序 2.1 原理演示&#xff1a;​编辑 2.2 算法实现 2.3 算法的时间复杂度和空间复杂度分析 3.希尔排序 3.1算法思想 3.2原理演示 3.3代码实现 3.4希尔算法的时间复杂度 4.冒泡排序 4.1冒泡排…...

[蓝桥杯 2019 省赛 AB] 完全二叉树的权值

# [蓝桥杯 2019 省 AB] 完全二叉树的权值 ## 题目描述 给定一棵包含 $N$ 个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从上到下、从左到右的顺序依次是 $A_1,A_2, \cdots A_N$&#xff0c;如下图所示&#xff1a; 现在小明要把相同深度的节点的权值…...

亮数据Bright Data,引领高效数据采集新体验

随着互联网和大数据的日益普及&#xff0c;我们对于高速、安全和无限畅通的网络体验追求越发迫切&#xff0c;随之而来的网络安全和隐私保护变得越来越重要。IP代理作为一种实用的代理工具&#xff0c;可以高效地帮我们实现网络数据采集&#xff0c;有效解决网络安全问题&#…...

C#学习笔记

一、事件派发器 在C#中&#xff0c;事件派发器通常是指事件委托和事件处理程序的组合&#xff0c;用于实现一种观察者设计模式。它允许对象在状态发生变化时通知其他对象&#xff0c;从而实现对象之间的解耦。 事件派发器的基本组成部分&#xff1a; 事件委托&#xff08;Ev…...

【A-006】基于SSH的新闻发布系统(含论文)

【A-006】基于SSH的新闻发布系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库&#xff1a; MySQL 技术&#xff1a; SpringStruts2HiberanteJSPJquery 适用于&#xff1a; 课程设计&#xff0c;毕业设计&…...

c语言-static

static作用&#xff1a;修饰变量和函数 修饰局部变量-静态局部变量 static未修饰局部变量 #include <stdio.h>void print() {int a 0;a;printf("%d ", a); }int main() {int i 0;for (i 0; i < 10; i){print();}return 0; }运行结果 static修饰局部变…...

zuul的性能调优

文章目录 zuul的性能调优Zuul参数剖析semaphore(信号量)ribbonhystrix高并发下常见Zuul异常熔断 zuul 1.x 与2.x的区别与总结 zuul的性能调优 在项目实践中&#xff0c;使用jemeter多线程并发访问微服务中的接口时候&#xff0c;在Zuul层出现异常、超时等&#xff0c;从而导致整…...

C++中的动态内存管理

1.C中动态内存管理 C语言内存管理方式在C中可以继续使用&#xff0c;但有些地方就无能为力&#xff0c;而且使用起来比较麻烦&#xff0c;因此C又提出了自己的内存管理方式&#xff1a;通过new和delete操作符进行动态内存管理。 1.1 new/delete操作内置类型 c语言和c的动态内存…...

es6的核心语法

在学习低代码时&#xff0c;经常有粉丝会问&#xff0c;低代码需要什么基础&#xff0c;es6就是基础中的一项。我们本篇是做一个扫盲&#xff0c;可以让你对基础有一个概要性的了解&#xff0c;具体的每个知识点可以深入进行了解&#xff0c;再结合官方模板就会有一个不错的掌握…...

Unity | 射线检测及EventSystem总结

目录 一、知识概述 1.Input.mousePosition 2.Camera.ScreenToWorldPoint 3.Camera.ScreenPointToRay 4.Physics2D.Raycast 二、射线相关 1.3D&#xff08;包括UI&#xff09;、射线与ScreenPointToRay 2.3D&#xff08;包括UI&#xff09;、射线与ScreenToWorldPoint …...

贵阳58同城做网站/如何创建一个属于自己的网站

software is a system built up of many parts rebuild that decompositionsee the patterns in codes is a skill that one develops with practice转载于:https://www.cnblogs.com/nn0p/p/4378547.html...

wordpress 边框线/网站百度收录要多久

满意答案fate夏陌2017.06.02采纳率&#xff1a;40% 等级&#xff1a;9已帮助&#xff1a;16人展开全部 首先、仿真时间要设置好&#xff0c;时间太长了就会一直等着。第二、变步长解法器也要设置第三、变步长的最大值也要设置当然越小越好&#xff0c;但是太小了会仿真的时间…...

网站做收录是什么意思/域名权重查询工具

JavaScript之继承什么是继承继承方式属性拷贝原型式继承原型链继承借用构造函数组合继承借用构造函数 深拷贝以下内容转载编辑自LiYajie 什么是继承 js中的继承就是获取存在对象已有属性和方法的一种方式. 继承方式 属性拷贝 就是将对象的成员复制一份给需要继承的对象. …...

上海黄页固定电话查询/seo网站优化工具大全

http://blog.csdn.net/cen616899547/article/details/38336185 在做rpg类游戏的过程中,经常遇到要判断周围怪物相对自身的方位 1.判断目标在自己的前后方位可以使用下面的方法: Vector3.Dot(transform.forward, target.position) 返回值为正时,目标在自己的前方,反之在自己的后…...

做网站怎么看效果/电商运营基础知识

Springboot解决Main方法启动无法注入JNDI上一篇Springboot配置外部容器使用JNDI读取数据源&#xff0c;讲到部署到web容器如何使用JNDI读取数据源。那么在开发时Main方法启动怎么使用JNDI读取数据源&#xff1f;&#xff1f;需求仅在dev环境下解决main方法无法注入JNDI&#xf…...

充值网站建设/怎么做关键词优化排名

1.场景&#xff0c;对于colums都相同的dataframe做过滤的时候 例如&#xff1a; df1 DataFrame([[a, 10, 男], [b, 11, 男], [c, 11, 女], [a, 10, 女], [c, 11, 男]], columns[name, age, sex]) df2 DataFrame([[a, 10, 男], [b, 11, 女]], columns[name, age, sex]) 取交集…...