jamiechoo

 

[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">
    <application
    android: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: true
  ios: true
  image_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>
    <bitmap
    android: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:

    <activity
    android:name=".MainActivity"
    android:theme="@style/LaunchTheme"
      ...>
      ...
    </activity>
2.iOS
在 iOS 中,启动页可以通过故事板(Storyboard)来配置。

在 Xcode 中,打开 Runner 工作区。

选择 Runner 目录下的 Assets.xcassets,将启动图拖入其中。

项目目录中,添加一个新的故事板(LaunchScreen.storyboard)。

在故事板中设置你的启动页布局。

在项目设置中将启动页设置

 

 包括用下面的插件配置的启动页,很多时候都需要到LaunchScreen.storyboard来调整UIImageView的Content Model. 这里选择的Aspect Fill表示图片比例不变填满屏幕,超过部分剪切掉。

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.png
    android: true

  ios: true

# 从 Android 12 开始,在所有应用的冷启动和温启动期间,系统一律会应用 Android 系统的默认启动画面。默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground(如果是单色)构成。
# 官网说明https://developer.android.google.cn/develop/ui/views/launch/splash-screen?hl=zh-cn
android_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.使用编译模式
详细介绍参见另一文https://blog.csdn.net/wsyx768/article/details/137119615

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 {
@override
Widget 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 {
@override
Widget 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 Studio打包的话参见另一文https://blog.csdn.net/wsyx768/article/details/137050386

或者直接看官方文档

https://developer.android.com/studio/publish

下面介绍用Flutter打包

要将 APK 上传到应用商店(如 Google Play 商店),您需要先对 APK 进行签名。在 Android 平台上,未签名的 APK 无法安装到用户设备上,也不能发布到应用商店。

打包 Android 应用 (APK或AAB)

生成一个秘钥库(keystore)
如果您还没有密钥库文件,您可以使用 keytool 命令来生成一个。这个工具包含在 Java Development Kit (JDK) 中。运行以下命令来生成密钥库:

$ keytool -genkey -v -keystore /path/to/your_keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias your_key_alias
将/path/to/your_keystore.jks改成你实际的位置和命名,将your_key_alias换成你真是的别名。

然后回车,按照提示设置密码和相关信息。

在您的 Flutter 项目中创建密钥配置文件
在项目的 android 目录下创建一个名为 key.properties 的文件,将您的密钥库信息添加到该文件中:

storePassword=your_keystore_password
keyPassword=your_key_alias_password
keyAlias=your_key_alias
storeFile=/path/to/your_keystore.jks
这个文件包含敏感信息,不应该被提交到版本控制系统中。

配置 build.gradle 文件
在项目的 android/app 目录下的 build.gradle 文件中,配置签名信息。您需要修改 buildTypes 部分以使用 key.properties 中的信息:

android {
...
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
在 build.gradle 文件的顶部,您还需要添加代码来加载 key.properties 文件:

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
更新应用版本
更新您的pubspec.yaml文件中的版本号。

构建签名的 APK
使用以下命令来生成APK或AAB:

生成APK:

$ flutter build apk

$ flutter build apk --release
生成适用于Google Play的AAB:

$ flutter build appbundle
找到生成的文件
打包完成后,您可以在项目目录下的build/app/outputs/flutter-apk/或build/app/outputs/bundle/release/中找到APK或AAB文件。

上传到Android应用市场
完成这些步骤后,您将得到一个已签名的 APK 文件,可以上传到 Android 应用市场。确保您遵循每个应用商店的具体指南来发布您的应用。

如果要上传到Google Play,您需要打包的成AAB,这样才可以上传到Google Play Console进行分发。

 

2.iOS

1.直接使用Xcode运行iOS工程
不用flutter构建,在Xcode中是可以独立进行构建运行和打包发布的。

1).运行项目
先将flutter的build清理

$ flutter clean
$ flutter pub get
然后立即用XCode打开iOS工程运行

运行会报错:

error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
提示你需要先打开终端,cd到iOS工程目录执行pod install,然后再运行项目。

$ pod install
到这里,项目就已经正常运行到手机。

2).查看构建内容
Commond + Shift + G 进入~/Library/Developer/Xcode/DerivedData目录,查看构建内容。

我们会在Debug-iphoneos中看到一个Runner.app,这个Runner.app 是一个iOS应用程序包。它是一个可执行的应用程序目录,包含了所有的资源和编译后的代码,用于在 iOS 设备或模拟器上运行。

 

右键选择“显示包内容”,我们会看到一个名为“Runner”的Mach-O文件。Mach-O (Mach Object) 文件格式是 macOS 和 iOS 操作系统用于可执行文件、目标代码、共享库和核心转储的文件格式。

另外,还可看到所有的资源和依赖的框架。

 

 

3).打包

在Xcode,进入Product -> Scheme -> Edit Scheme

 左边选择“Archive”,右侧设置“Build Configuration”控制打包出来的IPA是什么环境

 然后,到Product选择Archive以构建和归档应用。

 

 

 归档完成后,在 Organizer 中选择您的归档。

点击 Distribute App。

选择分发方法,例如 Ad Hoc 或 App Store,根据您打包的目的。

按照提示操作,选择签名证书和配置文件。

选择一个位置保存导出的 IPA 文件。

 

 

2.使用flutter构建能在模拟器运行的包

为了在模拟器上安装应用程序,你需要构建一个专门为 iOS 模拟器架构(如 x86_64 或 arm64 )编译的版本。

$ flutter build ios --simulator
将Runner.app拖入iPhone模拟器就可以运行。缺少真机时,就可以用这种方式打包,让测试人员安装模拟器来测试。

3.使用flutter构建能在iPhone真机运行的包
1).构建Runner.app
使用flutter build ios命令,默认会构建一个release环境的Runner.app程序包。

// 构建一个release环境的包
$ flutter build ios

// 构建一个release环境的包
$ flutter build ios --release
构建一个debug环境的包:

$ flutter build ios --debug
因为还没签名,所以是无法直接安装到真机上,又因为架构不同也无法安装到模拟器上。

如果你再用Xcode打开iOS项目运行项目到真机,会发现Xcode会重新构建一个Runner.app来进行安装。

那么有人就会问了,既然安装不了,那么用flutter build ios构建的Runner.app有什么用呢,还不如到Xcode直接打包生成ipa文件来进行分发。是的,可以这样理解,对初学者来说用Xcode打包是最简单的。

实际上,我们拿到Runner.app后,还可以使用命令行或第三方工具将其签名打包成IPA。

2).基于命令行手动创建.ipa文件
如果您希望在不使用 Xcode 的情况下将 Flutter 构建的Runner.app转换为.ipa格式,可以使用命令行工具。

a.终端cd到Runner.app所在目录
$ cd /Users/gamin/Desktop/fd
b.创建 Payload 目录
在您的 Runner.app 所在的目录中,创建一个名为 Payload 的文件夹。

$ mkdir Payload
c.将 Runner.app 移动到 Payload 目录
将 Runner.app 文件夹移动到 Payload 文件夹中。

$ mv Runner.app Payload/
d.压缩 Payload 目录
将 Payload 文件夹压缩为 .ipa 文件。确保您的当前工作目录包含 Payload 文件夹。

$ zip -r Runner.ipa Payload/
这样,您就会得到一个名为 Runner.ipa的文件。然而,这个.ipa文件仍需要一个有效的签名才能安装到 iOS 设备上。通常,您需要使用苹果的开发者证书和配置文件来签名应用程序,而这通常通过 Xcode 或其他代码签名工具完成。

3).使用第三方工具对.ipa进行签名
除了使用 Xcode 进行签名之外,还有第三方工具可以用来为 iOS 应用程序(包括 Flutter 构建的

Runner.app)签名。这些工具通常被开发者使用在没有苹果开发者账号的情况下进行测试,或者进行越狱设备上的安装。然而,这些方法通常不被苹果官方支持,而且可能违反苹果的服务条款,因此在商业和生产环境中使用时需要谨慎。

以下是一些第三方签名工具的例子:

爱思助手:

去工具箱中选择“IPA签名”。

Cydia Impactor:

Cydia Impactor 是一个流行的应用程序,可以将 IPA 文件安装到 iOS 设备上。它要求用户提供一个有效的 Apple ID 来签署应用程序,即使没有官方开发者账号也可以使用。

App Signer:

这是一个 macOS 应用程序,可以用来对 iOS 应用程序进行签名。它同样需要一个有效的 Apple ID 和对应的证书来进行签名。

iOS App Signer:

这是一个开源的工具,通过图形用户界面提供了应用程序签名的功能。它可以与 Xcode 生成的证书和配置文件一起使用。

AltDeploy:

类似于 Cydia Impactor,AltDeploy 允许用户在 Mac 上签署并安装 IPA 文件到 iOS 设备。

AltStore:

AltStore 是另一种方法,它允许用户通过一个特殊的应用商店安装非 App Store 应用。它使用用户的 Apple ID 来签署应用程序,以便它们可以安装在未越狱的 iOS 设备上。

4).使用命令行工具 codesign 进行签名
如果您有苹果的开发者证书,您可以使用 codesign 命令行工具来手动签名 Runner.app,然后再打包为 .ipa。以下是 codesign 的基本用法:

$ codesign -s "YourCertificateName" -f --entitlements YourEntitlements.entitlements Runner.app
在这里,“YourCertificateName”是您的开发者证书名称,“YourEntitlements.entitlements”是您的应用特权配置文件。您可以在 Keychain Access 应用中找到您的证书名称。

请注意,手动签名和打包应用程序可能会遇到许多问题,特别是在证书和配置文件管理方面。Xcode 提供了自动化的签名和打包流程,因此如果可能,建议使用 Xcode 来管理这些步骤。

由于这些方法绕过了苹果的正式工具和程序,所以不建议用于生产环境或分发。对于正式的发布,您应该使用 Xcode 或 Apple 提供的其他官方工具来确保您的应用符合苹果的安全和分发要求。


原文链接:https://blog.csdn.net/wsyx768/article/details/137187579

原文链接:https://blog.csdn.net/wsyx768/article/details/136319899

posted on 2024-09-18 23:45  jamiechoo  阅读(3262)  评论(0)    收藏  举报

导航