[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
一、设置应用包名
在Flutter开发中,修改应用程序的包名(也称作Application ID)涉及几个步骤,因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作:
1.Android
Flutter工程中全局搜索替换包名
首先,打开您的 android/
app/
build.gradle 文件,搜索"applicationId",查看当前android工程使用的包名。
然后,快捷键Command + Shift + F全局搜索使用的包名,全部替换成新包名。
2.iOS
方式1:Flutter工程中全局搜索替换包名
首先,打开您的 ios/
Runner.xcodeproj/
project.pbxproj 文件,搜索PRODUCT_BUNDLE_IDENTIFIER,查看当前iOS使用的包名。
然后,快捷键Command + Shift + F全局搜索使用的包名,全部替换成新包名。
方式2:用Xcode打开iOS工程在Signing & Capabilities
标签页修改 Bundle Identifier
打开您的Flutter项目的
ios/Runner.xcodeproj
文件,或者如果您使用的是xcworkspace
,打开ios/Runner.xcworkspace
。在Xcode中,选择项目的根目录然后选择
Runner
项目。在
Signing&Capabilities
标签页,修改Bundle Identifier
至您的新包名。如果有必要的话,修改
Info.plist
文件中的引用。
二、设置应用名称
在Flutter开发中,设置应用程序的名称,需要去更新Android/iOS 特定的配置文件。
1.Android
编辑 android/app/src/main/
AndroidManifest.xml 文件,并设置`android:label` 属性:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><applicationandroid:label="Your App Name"android:name="${applicationName}"android:icon="@mipmap/ic_launcher">...</application>
</manifest>
2.iOS
打开您的 ios/Runner/Info.plist
文件,并设置CFBundleDisplayName和CFBundleName:
<key>CFBundleDisplayName</key>
<string>Your App Display Name</string>
<key>CFBundleName</key>
<string>BundleName</string>
在 Xcode 中,
CFBundleName
和CFBundleDisplayName
是应用程序的两个属性,用于指定应用程序的名称。它们有以下区别:
CFBundleName
:CFBundleName
是应用程序的内部名称,通常用作程序包标识符的一部分。它是在应用程序的 Info.plist 文件中定义的一个键。CFBundleName
的值是一个字符串,用于在文件系统中标识应用程序的文件夹和可执行文件。它通常是一个简短的、不包含特殊字符的名称,可以用于标识应用程序的唯一性。例如,如果应用程序的 Bundle Identifier 是com.example.myapp
,那么CFBundleName
可能是 "MyApp"。
CFBundleDisplayName
:CFBundleDisplayName
是应用程序的用户可见名称,用于显示在设备上的主屏幕或应用程序列表中。它也是在应用程序的 Info.plist 文件中定义的一个键。CFBundleDisplayName
的值是一个字符串,用于提供给用户一个有意义的应用程序名称。它通常是一个更加友好和描述性的名称,可以包含特殊字符和空格。例如,应用程序的CFBundleDisplayName
可以是 "My App"。总结起来,
CFBundleName
是应用程序的内部标识符,用于文件系统中的标识和唯一性。而CFBundleDisplayName
是应用程序的用户可见名称,用于在设备上显示给用户。在大多数情况下,开发者会将CFBundleDisplayName
设置为更友好和描述性的名称,以便用户能够轻松识别和使用应用程序。
三、设置应用版本号
在 pubspec.yaml
文件中,您可以使用 version
字段来设置版本号和构建号。格式是 version: major.minor.patch+build
,其中 major
、minor
和 patch
表示不同的发布级别,build
是构建号。
version: 1.0.0+1
这里 1.0.0
是版本号,+1
是构建号。每次发布新版本到应用程序商店时,您都应该至少增加构建号。
在 Android 的 android/app/build.gradle
文件中,versionCode
和 versionName
通常从 pubspec.yaml
文件中自动获取:
android {...defaultConfig {...versionCode flutterVersionCode.toInteger()versionName flutterVersionName}
}
在 iOS 中,Flutter也会自动更新项目的 Info.plist
文件,但如果您需要手动更新,您可以编辑 CFBundleShortVersionString
(版本号)和 CFBundleVersion
(构建号):
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
确保在更新版本并构建发布版本之前提交了这些更改。在Flutter中运行构建命令时,这些值将被用来构建最终的应用程序包。
四、设置最低支持系统版本和目标版本
在Flutter开发中,设置应用的最低支持系统版本和目标版本需要在特定平台的项目设置中进行。这里分别介绍如何为Android和iOS设置这些版本。
1.Android
在Android中,你需要修改android/app/build.gradle
文件。在这个文件中,你可以找到defaultConfig
部分,然后设置minSdkVersion
和targetSdkVersion
:
android {...defaultConfig {// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).applicationId "com.example.myapp"minSdkVersion 16 // 最低支持版本targetSdkVersion 30 // 目标版本versionCode flutterVersionCode.toInteger()versionName flutterVersionName}...
}
Android SDK版本查询 https://developer.android.google.cn/tools/releases/platforms?hl=zh-cn
注意: 在此示例中,minSdkVersion
设置为16表示应用程序最低支持Android 4.1(Jelly Bean)。targetSdkVersion
设置为30表示应用程序针对的是Android 11。你应该根据实际需要设置这些值。
2.iOS
方式1:全局搜索替换
Command + Shift + F 全局搜索IPHONEOS_DEPLOYMENT_TARGET, 然后修改部署目标版本。
方式2:通过Xcode来设置
- 打开你的Flutter项目目录下的
ios/Runner.xcworkspace
文件。- 在Xcode中,选择项目导航器中的
Runner
项目。- 在项目编辑器中,选择
Runner
目标,然后选择General
标签。- 在
Deployment Info
部分,你可以设置iOS Deployment Target
,这相当于应用的最低支持系统版本。
对于目标版本,一般默认设置为Xcode当前支持的最新SDK。
注意: 在Xcode中设置最低支持系统版本时,确保你的Flutter插件也支持这个版本,否则可能会出现兼容性问题。
3.更新pubspec.yaml
在某些情况下,Flutter插件可能需要特定版本的平台SDK。这些要求通常在插件的pubspec.yaml文件中指定。确保你的项目pubspec.yaml文件中列出的所有依赖项都支持你设置的最低平台版本。查询最低支持,Flutter Packages 网站(https://pub.dev)。
五、设置应用Icon
在Flutter中更改应用图标涉及更新每个平台(Android和iOS)的项目资源。以下是两个平台上修改应用图标的基本步骤:
1.Android
准备你的图标文件。Android通常需要多个图标大小以适应不同的设备屏幕密度。图标通常放在
android/app/src/main/res/
目录下的不同的mipmap-
文件夹中。替换所有的
mipmap-
文件夹中的ic_launcher.png
文件(如mipmap-hdpi
,mipmap-mdpi
,mipmap-xhdpi
, 等)为你自己的图标文件。确保你的图标文件名保持为
ic_launcher.png
,除非你计划改变 AndroidManifest.xml 中的配置。如果你的图标名称或位置有所不同,更新
android/app/src/main/AndroidManifest.xml
文件中的<application>
标签的android:icon
属性。
2.iOS
准备你的图标文件。iOS需要一系列不同大小的图标来适应不同的设备和屏幕。
打开你的Flutter项目中的
ios/Runner.xcworkspace
文件来使用Xcode。在Xcode中,选择项目导航器中的
Runner
项目,然后选择Assets.xcassets
。找到
AppIcon
资源集,你将看到许多不同大小的槽位准备放置你的图标。将你的图标拖放到对应的槽位中或者通过右键点击AppIcon来选择新的图像进行替换。
3.使用自动化工具
你也可以使用第三方工具来自动化这一过程。例如,flutter_launcher_icons
包提供了一种简单的方式来同时为Android和iOS生成应用图标。
要使用此工具,请按照以下步骤操作:
将 flutter_launcher_icons
添加到你的 pubspec.yaml
文件中的 dev_dependencies
部分:
dev_dependencies:flutter_launcher_icons: "^0.9.2"flutter_icons:android: trueios: trueimage_path: "assets/icon/app_icon.png"# 你也可以为不同的平台指定不同的图标文件# image_path_android: "assets/icon/app_icon_android.png"# image_path_ios: "assets/icon/app_icon_ios.png"# 可以添加更多的配置项,如适用于Android的adaptive_icon_background等
然后,你可以运行以下命令来生成应用图标:
flutter pub get
flutter pub run flutter_launcher_icons
运行上述命令后,flutter_launcher_icons 将根据你指定的源图标文件 app_icon.png 自动生成需要的各种尺寸的图标,并替换 iOS 和 Android 项目中的现有图标。
对于 iOS,它会更新 Assets.xcassets/AppIcon.appiconset 中的图标集合。 对于 Android,它会替换 android/app/src/main/res/mipmap-*/ 目录中的 ic_launcher.png 文件,并可能更新 android/app/src/main/res/values/ic_launcher_background.xml 文件(如果你使用了自适应图标的话)。
这样,你就不需要手动进入 Xcode 或 Android Studio 设置应用图标,flutter_launcher_icons 已经为你自动完成了这些步骤。不过,请确保在运行上述命令之前关闭 Xcode 和 Android Studio,因为这些工具可能会锁定一些文件,导致 flutter_launcher_icons 无法正确写入新图标。
运行flutter pub run flutter_launcher_icons报错
192:app_teleprompter gamin$ dart run flutter_launcher_icons:main
Building package executable... (5.9s)
Built flutter_launcher_icons:main.
════════════════════════════════════════════
FLUTTER LAUNCHER ICONS (v0.9.3)
════════════════════════════════════════════
✓ Successfully generated launcher icons
Unhandled exception:✗ ERROR: InvalidConfigException
Cannot not find minSdk from android/app/build.gradle or android/local.propertiesSpecify minSdk in either android/app/build.gradle or android/local.properties
#0 createIconsFromConfig (package:flutter_launcher_icons/main.dart:96:7)
#1 createIconsFromArguments (package:flutter_launcher_icons/main.dart:60:7)
#2 main (file:///Users/gamin/.pub-cache/hosted/pub.flutter-io.cn/flutter_launcher_icons-0.9.3/bin/main.dart:7:26)
#3 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:294:33)
#4 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:189:12)
出现的错误信息表示 flutter_launcher_icons 遇到了一个 InvalidConfigException,具体是找不到 Android 的 minSdk 版本设置。这通常是在 android/app/build.gradle 文件或 android/local.properties 文件中指定的。参照前面序号4设置
六、设置启动页
1.Android
在 Android 中,启动页通常是一个名为 "splash screen" 的 XML 布局文件,它被设置在应用的 styles.xml
文件中。以下是一个简单的例子。
在 res/drawable
目录下创建一个名为 launch_background.xml
的文件,并添加以下内容,以显示一个纯色背景和中间的应用图标:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/splash_color"/> <!-- Background color --><item><bitmapandroid:gravity="center"android:src="@mipmap/launcher_icon"/> <!-- Replace 'launcher_icon' with your app icon --></item>
</layer-list>
在 res/values/colors.xml
中定义 splash_color
:
<resources><color name="splash_color">#FFFFFF</color> <!-- Replace '#FFFFFF' with your desired background color -->
</resources>
在 res/values/styles.xml
中定义一个新的 theme,它使用了刚才创建的 launch_background.xml
:
<resources><style name="LaunchTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowBackground">@drawable/launch_background</item></style>
</resources>
在 AndroidManifest.xml
中,将 MainActivity
的 theme
设置为刚才创建的 LaunchTheme
:
<activityandroid:name=".MainActivity"android:theme="@style/LaunchTheme"...>...
</activity>
2.iOS
在 iOS 中,启动页可以通过故事板(Storyboard)来配置。
在 Xcode 中,打开
Runner
工作区。选择
Runner
目录下的Assets.xcassets
,将启动图拖入其中。项目目录中,添加一个新的故事板(Storyboard)。
在故事板中设置你的启动页布局。
在项目设置中将启动页设置为你添加的故事板。
3.使用flutter_native_splash插件
设置
https://pub.dev/packages/flutter_native_splash
flutter_native_splash
是一个流行的 Flutter 插件,用于轻松地生成和配置本地化的启动页。以下是使用 flutter_native_splash
插件设置启动页的步骤:
添加依赖
首先,你需要在你的 Flutter 项目的 pubspec.yaml
文件中添加 flutter_native_splash
作为一个开发依赖项。确保使用最新版本:
dev_dependencies:flutter_native_splash: ^2.3.7
配置启动页
在 pubspec.yaml
文件中,你可以配置启动页的各种属性,如背景颜色、图片、文字等。例如:
flutter_native_splash:color: "#42a5f5"image: assets/splash.pngandroid: trueios: true# 从 Android 12 开始,在所有应用的冷启动和温启动期间,系统一律会应用 Android 系统的默认启动画面。默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground(如果是单色)构成。# 官网说明https://developer.android.google.cn/develop/ui/views/launch/splash-screen?hl=zh-cnandroid_12:# image参数设置闪屏图标图像。 如果不指定该参数,# 将使用应用程序的启动器图标。# 请注意,初始屏幕将被裁剪为屏幕中心的圆圈。# 带有图标背景的应用程序图标:这应该是 960×960 像素,并且适合一个圆圈# 没有图标背景的应用程序图标:这应该是 1152×1152 像素,并且适合一个圆圈image: "assets/icons/icon_launch.jpg"# 启动画面背景颜色。color: "#161517"# 应用程序图标背景颜色。#icon_background_color: "#111111"# 品牌属性允许您指定在启动屏幕中用作品牌的图像。#branding: assets/dart.png
在这个例子中,color
定义了启动页的背景颜色,image
指定了启动页中心显示的图片,android
和 ios
表示启动页将同时为这两个平台生成。
确保你已经将 splash.png
图片添加到你的资产目录中,并在 pubspec.yaml
中引用了这个资产。
生成启动页
配置好 pubspec.yaml
文件后,运行以下命令以生成启动页:
flutter pub get
dart run flutter_native_splash:create
恢复 Flutter 默认的白色启动页
dart run flutter_native_splash:remove
注意事项
- 如果你需要不同的配置,
flutter_native_splash
支持许多其他定制选项。查看插件的文档获取完整的配置选项。 - 某些配置可能需要在原生代码中额外的步骤,如修改 Android 的
styles.xml
或 iOS 的 LaunchScreen.storyboard。 - 如果你在使用此插件后更新了应用图标或其他资源,你可能需要重新运行
flutter_native_splash
命令来更新启动页。
运行到iPhone报错CocoaPods is installed but broken. Skipping pod install.
运行到Android手机没问题,运行到iPhone就报错。
经过测试,我Mac电脑终端flutter doctor检测的CocoaPods是正常的,在flutter项目中flutter doctor检测报错flutter doctor还是会报错CocoaPods installed but not working.
导致添加flutter_native_splash后就运行报错。
Warning: CocoaPods is installed but broken. Skipping pod install.
You appear to have CocoaPods installed but it is not working.
This can happen if the version of Ruby that CocoaPods was installed with is different from the one being used to invoke it.
This can usually be fixed by re-installing CocoaPods.
To re-install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
Exception: CocoaPods not installed or not in valid state.
问题如下,每次重启终端和Flutter项目都需要重新执行$ source ~/.rvm/scripts/rvm不然flutter doctor会报错CocoaPods installed but not working.
192:~ gamin$ rvm -v
-bash: rvm: command not found
192:~ gamin$ source ~/.rvm/scripts/rvm
192:~ gamin$ rvm -v
rvm 1.29.12 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
这意味着RVM的环境设置没有正确添加到你的shell配置文件中。为了解决这个问题,你需要将RVM的环境初始化命令永久添加到你的shell配置文件中。
根据你使用的终端shell(比如 Bash 或 Zsh),你可以按照以下步骤操作:
对于Bash用户
1).打开你的 .bash_profile
或者 .bashrc
文件。你可以使用文本编辑器或者在终端中使用如下命令:
$ open -a TextEdit ~/.bash_profile
或者
$ open -a TextEdit ~/.bashrc
2).在文件的末尾添加以下内容:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
3).保存并关闭文件。
4).为了使更改生效,你可以重新加载配置文件,通过运行:
$ source ~/.bash_profile
或者
$ source ~/.bashrc
对于Zsh用户
1).打开你的 .zshrc
文件:
$ open -a TextEdit ~/.zshrc
2).同样在文件的末尾添加:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
3).保存并关闭文件。
4).重新加载配置文件:
$ source ~/.zshrc
完成这些步骤后,每次你打开一个新的终端会话时,RVM都会自动初始化,这样你就不需要每次都手动运行 source ~/.rvm/scripts/rvm
了。
七、环境判断
在Flutter中,你可以通过几种方式来判断应用是在开发环境还是生产环境。一种常见的做法是在编译应用时使用不同的入口点,或者根据编译模式(debug或release)来设置环境。
1.使用编译模式
Flutter为我们提供了kReleaseMode
、kDebugMode
和kProfileMode
常量,它们可以告诉我们应用当前的编译模式。这些常量位于foundation
库中。
import 'package:flutter/foundation.dart';void main() {if (kReleaseMode) {// 这里是生产环境runApp(MyAppProduction());} else {// 这里是开发环境runApp(MyAppDevelopment());}
}
在上面的示例中,当应用在生产环境下编译时(即以release模式编译),kReleaseMode
会被设置为true
。如果是在debug模式下编译,那么kDebugMode
会被设置为true
。
请注意,kProfileMode
是用于性能分析时的特殊编译模式,通常你不会在代码逻辑中用到它。
2.使用不同的main入口
在实际项目中,你可能会有多个main文件,分别用于开发和生产环境。例如,你可以创建main_dev.dart
和main_prod.dart
两个文件,分别为开发环境和生产环境配置不同的设置。
// main_dev.dart
import 'package:flutter/material.dart';void main() {runApp(MyAppDevelopment());
}// main_prod.dart
import 'package:flutter/material.dart';void main() {runApp(MyAppProduction());
}
在运行或构建时,你可以指定使用哪个入口点文件:
# 对于开发环境
flutter run -t lib/main_dev.dart# 对于生产环境
flutter run --release -t lib/main_prod.dart
或者在构建时:
# 构建开发环境的APK
flutter build apk --debug -t lib/main_dev.dart# 构建生产环境的APK
flutter build apk --release -t lib/main_prod.dart
3.使用环境配置
另一种方法是使用不同的环境配置文件。例如,你可以有一个.env.dev
文件用于开发环境的设置,以及一个.env.prod
文件用于生产环境。然后你可以使用flutter_dotenv
这样的包来加载不同的环境文件。
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';Future<void> main() async {// 加载不同的环境配置await dotenv.load(fileName: kReleaseMode ? ".env.prod" : ".env.dev");runApp(kReleaseMode ? MyAppProduction() : MyAppDevelopment());
}
在上面的示例中,你需要添加flutter_dotenv
依赖,并创建不同的环境配置文件。这种方法提供了更多灵活性,允许你根据环境设置不同的变量。
无论哪种方法,关键是在编译时确定应用的环境,并据此配置相应的设置。记得始终在发布应用之前彻底测试以确保环境配置的正确性。
八、平台判断
在Flutter中,你可以使用Platform
类来检测应用程序正在哪个操作系统平台上运行。这个类位于dart:io
库中。下面是如何使用Platform
类来确定操作系统平台的例子:
import 'dart:io' show Platform;void main() {if (Platform.isAndroid) {// Android平台的代码} else if (Platform.isIOS) {// iOS平台的代码} else if (Platform.isLinux) {// Linux平台的代码} else if (Platform.isMacOS) {// macOS平台的代码} else if (Platform.isWindows) {// Windows平台的代码} else if (Platform.isFuchsia) {// Fuchsia平台的代码}// 运行Flutter应用runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// ...构建Flutter应用的UI}
}
Flutter还提供了Theme
类中的一些其他属性和方法,这些可以帮助你确定当前的设计语言,比如Material Design或Cupertino,这通常与平台相关(Android通常使用Material Design,iOS通常使用Cupertino)。例如:
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {final ThemeData theme = Theme.of(context);if (theme.platform == TargetPlatform.iOS) {// iOS样式的代码} else if (theme.platform == TargetPlatform.android) {// Android样式的代码}// ...构建Flutter应用的UI}
}
另外,flutter/foundation.dart
库提供了kIsWeb
常量来判断应用是否在web平台上运行。
import 'package:flutter/foundation.dart';void main() {if (kIsWeb) {// Web平台的代码} else {// 移动或桌面平台的代码}// 运行Flutter应用runApp(MyApp());
}
这些检查可以帮助你为不同的平台编写特定的代码,例如使用平台特有的插件或者调整UI来匹配用户的期望。确保在多平台上充分测试你的应用,以确保每个平台上都提供良好的用户体验。
九、打包APP
在Flutter中打包APP分为两个主要的平台:Android和iOS。以下是为两个平台打包应用程序的基本步骤:
1.Android
打包 Android 应用 (APK或AAB)
设置签名
在发布Android应用之前,您需要给您的应用程序签名。创建一个密钥库并添加到android/app
目录下的build.gradle
文件中。
更新应用版本
更新您的pubspec.yaml
文件中的版本号。
运行 Flutter build
使用以下命令来生成APK或AAB:
生成APK:
flutter build apk
生成适用于Google Play的AAB:
flutter build appbundle
找到生成的文件
打包完成后,您可以在项目目录下的build/app/outputs/flutter-apk/
或build/app/outputs/bundle/release/
中找到APK或AAB文件。
上传到Google Play (如果适用)
如果您打包的是AAB,可以直接将文件上传到Google Play Console进行分发。
2.iOS
打包 iOS 应用 (IPA)
安装Xcode
确保您安装了Xcode,并且您有一个有效的Apple Developer账户。
配置签名和证书
在Xcode中打开您的iOS项目,并配置签名和团队设置。
更新应用版本
同样,更新您的pubspec.yaml
文件中的版本号,也更新Xcode项目中的版本号和build号。
运行 Flutter build
使用以下命令来生成IPA:
flutter build ios
打包完成后,您可以在项目目录build/ios/iphoneos/Runner.app.
Flutter命令flutter build ios
生成的Runner.app
是一个iOS应用程序的文件夹,而不是一个直接可用于安装的.ipa
文件。.ipa
文件实际上是一个包含了Runner.app
和其他一些必要元数据的压缩包。
要将Runner.app
转换为.ipa
文件,你可以使用Xcode的归档工具来创建一个可分发的.ipa
文件。
要注意的是,直接使用Runner.app
进行分发(例如通过邮件或网站下载)通常不是一个好主意,因为它不包含安装所需的签名和证书。正确的分发方式是通过Xcode生成一个包含签名的.ipa
文件,或者通过App Store进行官方分发。
最后,即使Runner.app
可以直接在设备或模拟器上运行,出于安全和分发的原因,苹果要求所有通过App Store分发的应用都必须是通过苹果的审查并打包为.ipa
格式的。
打开Xcode进行归档
使用Xcode打开ios/Runner.xcworkspace
,然后选择Product > Archive来创建一个归档。
上传到App Store Connect
一旦归档完毕,在Xcode中的Organizer中选择您的归档并上传到App Store Connect。
通过TestFlight进行测试 (如果适用)
在App Store Connect中设置TestFlight以供测试人员测试。
提交审核
完成所有的测试后,您可以提交您的应用程序进行审核,一旦审核通过,您的应用就会在App Store上线。
相关文章:

[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
一、设置应用包名 在Flutter开发中,修改应用程序的包名(也称作Application ID)涉及几个步骤,因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作: 1.Android Flutter工程中全局搜索替换包名 …...

electron-release-server部署electron自动更新服务器记录
目录 一、前言 环境 二、步骤 1、下载上传electron-release-server到服务器 2、宝塔新建node项目网站 3、安装依赖 ①npm install ②安装并配置postgres数据库 ③修改项目配置文件 ④启动项目 ⑤修改postgres的认证方式 ⑥Cannot find where you keep your Bower p…...

贪心(基础算法)--- 区间选点
905. 区间选点 思路 (贪心)O(nlogn) 根据右端点排序 将区间按右端点排序 遍历区间,如果当前区间左端点不包含在前一个区间中,则选取新区间,所选点个数加1,更新当前区间右端点。如果包含,则跳…...

JAVA计算表达式
需求: 1、例如if(score>85){return 1;}else if(score>70){return 2;}else if(score>60){return 3;}else{return 4;}有这一串字符串,要执行这个字符串, 如果score为86分,则能得到1;如果score为30分ÿ…...

【复现】宏景HCM 任意文件读取漏洞_63
目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 宏景HCM 将人才标签技术应用于员工招聘、人才选拔等环节,通过多维度的标签体系,形成不同专业序列的人才画…...

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)(2)
安装k8有多种方式如: minikube kubeadm 二进制安装 命令行工具 我这里就使用kubeadm进行安装 环境 3台centos7 master ip :192.168.113.120 2G运存 2内核 node1 ip :192.168.113.121 2G运存 2内核 node2 ip :192.168.1…...
Web应用安全威胁与防护措施
本文已收录至《全国计算机等级考试——信息 安全技术》专栏 由于极其容易出现漏洞、并引发安全事故,因此数据隐私的保护是目前绝大多数企业不可绕过的运维环节。不过,许多中小型企业往往会错误地认为只有大型企业才会成为黑客的目标。而实际统计数字却截…...

MySQL相关知识汇总
MySQL是一个广泛使用的开源关系型数据库管理系统,它以其高性能、稳定性和易用性而备受开发者喜爱。在软件开发领域,无论是大型项目还是小型应用,MySQL都扮演着重要的角色。本文将对MySQL的一些关键知识点进行汇总,帮助读者更好地了…...

【旧文搬运】为你的 Laravel 应用添加一个基于 Swoole 的 WebSocket 服务
做了一个基于 Swoole 的 WebSocket 扩展包,可以用来做实时状态推送,或者自定义消息处理实现 im,有需要的可以看看: [giorgio-socket] 使用方法 安装 安装扩展包 composer require wu/giorgio-socket发布配置文件 php artisan vendor:pu…...

vue项目从后端下载文件显示进度条或者loading
//API接口 export const exportDownload (params?: Object, peCallback?: Function) > {return new Promise((resolve, reject) > {axios({method: get,url: ,headers: {access_token: ${getToken()},},responseType: blob,params,onDownloadProgress: (pe) > {peC…...

[技巧]Arcgis之图斑四至点批量计算
前言 上一篇介绍了arcgis之图斑四至范围计算,这里介绍的图斑四至点的计算及获取,两者之间还是有差异的。 [技巧]Arcgis之图斑四至范围计算 这里说的四至点指的是图斑最东、最西、最南、最北的四个地理位置点坐标,如下图: 四至点…...

【java】20:枚举
枚举的二种实现方式 1) 自定义类实现枚举 2) 使用 enum 关键字实现枚举 自定义实现枚举: 1.不需要提供setXxx方法,因为枚举对象值通常为只读. 2.对枚举对象/属性使用final static共同修饰,实现底层优化. 3.枚举对象名通常使用全部大写&…...

★【二叉搜索树(中序遍历特性)】【 ★递归+双指针】Leetcode 98. 验证二叉搜索树
★【二叉搜索树(中序遍历特性)】【 ★递归双指针】Leetcode 98. 验证二叉搜索树 二叉搜索树 98. 验证二叉搜索树解法1 笨 中序递归遍历为一个数组 然后判断数组是不是升序排列就可以★解法2 不使用数组 递归法 ---------------🎈Ἰ…...
打造无缝滚动体验:JavaScript中的scrollIntoView()方法实战指南
在现代Web开发中,提升用户体验是至关重要的。通过JavaScript的scrollIntoView()方法,我们可以为用户创造出流畅而令人愉悦的滚动体验。本文将深入研究scrollIntoView()的强大功能,并结合实例演示如何在项目中巧妙应用,以打造出无缝…...
实战:如何将Oracle单实例数据库转换成Oracle RAC数据库
导读 本文介绍如何将Oracle单实例数据库转换成Oracle RAC数据库 环境说明: 数据库节点2上有个单实例数据库zlxdb2,现在要将zlxdb2转换成RAC数据库,RAC数据库的两个实例分别是lzydb1和lzydb2。 以下是详细的操作步骤: 1、查看zlxdb…...

基于华为atlas的分类模型实战
分类模型选用基于imagenet训练的MobileNetV3模型,分类类别为1000类。 pytorch模型导出为onnx: 修改mobilenetv3.py中网络结构,模型选用MobileNetV3_Small模型,网络输出节点增加softmax层,将原始的return self.linear4…...
编程语言:SQL Server数据库使用教程,SQL Server增删改查语句
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全自学教程》 SQL Server是微软提供的一种关系型数据库,…...

【tableau学习笔记】tableau无法连接数据源
【tableau学习笔记】tableau无法连接数据源 背景: 学校讲到Tableau,兴奋下载Kaggle Excel,一看后缀CSV,导入Tableau发现报错“tableau无法连接数据源”,自作聪明改为后缀XLSX,bug依旧。 省流:…...

cetos7 Docker 安装 gitlab
一、gitlab 简单介绍和安装要求 官方文档:https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建起来的Web服务平台,通过该平…...

无极低码:无极低码部署版操作指南
无极低码 :https://wheart.cn 无极低码是一个面向开发者的工具,旨在为开发者、创业者或研发企业,提供快速,高效,标准化,可定制,私有化部署的平台,在兼顾开发速度的同时,兼…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...