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

[Flutter]打包IPA

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 提供的其他官方工具来确保您的应用符合苹果的安全和分发要求。

相关文章:

  • 大模型量化技术-GPTQ
  • [Pytorch]:PyTorch中张量乘法大全
  • 从零开始学RSA:N不互素
  • 【科研笔记】知识星球不可选择内容爬虫
  • QT中的文件操作QFile、QDataStream、QTextStream、QBuffer
  • Postman和Python Request测试多行Form-data
  • Android 全局配置Gradle依赖及插件仓库
  • Transformer - Outputs(Shifted Right)
  • typdef:深入理解C语言中typdef关键词的用法
  • uniapp切换中英文
  • Linux下docker运行python
  • uniApp使用uview对vuex的二次封装实现全局变量
  • 【Spring Boot 源码学习】ConditionEvaluationReport 日志记录上下文初始化器
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • 【ZZULIOJ】1030: 判断直角三角形(Java)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2017届校招提前批面试回顾
  • 2017年终总结、随想
  • Android系统模拟器绘制实现概述
  • Angularjs之国际化
  • JS基础之数据类型、对象、原型、原型链、继承
  • php中curl和soap方式请求服务超时问题
  • React的组件模式
  • 读懂package.json -- 依赖管理
  • 普通函数和构造函数的区别
  • 深度学习中的信息论知识详解
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 写给高年级小学生看的《Bash 指南》
  • 学习笔记:对象,原型和继承(1)
  • 一些css基础学习笔记
  • 通过调用文摘列表API获取文摘
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​虚拟化系列介绍(十)
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2)STM32单片机上位机
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)Spring源码解析:Spring MVC
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (六)Hibernate的二级缓存
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • ./和../以及/和~之间的区别
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 药厂业务系统 CPU爆高分析
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET委托:一个关于C#的睡前故事
  • @EnableAsync和@Async开始异步任务支持
  • @Validated和@Valid校验参数区别
  • []Telit UC864E 拨号上网
  • [100天算法】-目标和(day 79)
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件