引言
本章将会带领读者进行项目实战,了解如何从零开始编译一个能同时在Android和iOS运行的App。开发环境一般来说需要使用Macbook,笔者没试过Windows是否能开发。
一、配置开发环境
按command+空格,搜索钥匙串访问。
点击左上角的钥匙串访问->证书助理->从证书颁发机构请求证书。邮件地址填账号邮箱,选择存储到磁盘,点击下载。注意,必须填具有开发者权限的邮箱账号。
进苹果开发者中心,用刚刚下载的文件申请Development证书和Distribution证书,过程略。
双击申请好的证书进行安装,我们再打开钥匙串就能看到刚刚安装的证书了。注意,证书旁边一定要有个右箭头才表示成功。
打开终端,输入以下命令查看开发者id
kdoctor --team-ids
再依次申请Identifiers、Devices、Profiles,过程略。唯一需要注意的是,得申请两个Profile,一个选iOS App Development,另一个选App Store Connect。下载申请到的profile文件,即xxx_dev.mobileprovision和xxx_dis.mobileprovision文件。
二、配置项目环境
点击下载项目模板,我们勾选Android和iOS。
下载后解压,用Android Studio打开,等待加载完成。如果出现以下警告,代表没有加载成功。根据笔者的经验来看,这种一般是代理设置有问题,建议关闭所有代理软件,并且检查~/.gradle/gradle.properties文件,把所有代理相关的配置删除。
打开settings.gradle.kts可以看到有些部分有警告,可以不理睬,但如果想消除,可以在pluginManagement和dependencyResolutionManagement的上一行加上以下代码:
@Suppress("UnstableApiUsage")
同步完成之后,打开iosApp/Configuration/Config.xcconfig,在第一行TEAM_ID后面加上前面通过kdoctor看到的id。
三、运行程序
前面都搞定之后就可以尝试运行程序了,Android Studio已经帮我们配置好了,在右上角选择要运行的平台,要在Android中运行就选择composeApp,要在iOS中运行就选择iosApp。默认情况下,要在Android中运行需要一台Android物理机,进入调试模式并且连接Macbook,这里笔者推荐使用无线调试模式。而在iOS中运行,可以直接以虚拟机的方式启动。
四、发布程序
打开build.gradle.kts,按照如下所示配置ios的构建信息:
kotlin {
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
optimized = true
// 要填写完整包名+TEAM_ID
binaryOptions["bundleId"] = "com.xxx.yyy.zzzid"
}
}
}
这里要改成Release:
用XCode打开项目里的iosApp,进入设置,找到Signing,取消勾选第一个Automatically manage signing,选择前面步骤得到的xxx_dis.mobileprovision(用于上传,如果仅开发使用xxx_dev.mobileprovision)文件,如下所示:
找到Build Settings中的Framework Search Paths设置,将其他项都删除,只留下最后一个有composeApp的项,如下所示:
打开shell,输入export,将里面的CLASSPATH和JAVA_HOME复制出来。回到XCode,进入Build Phrase,找到Compile Kotlin Framework,在cd "$SRCROOT/…"的前面加上刚刚复制的两个环境变量,并且把上面的Shell改成/bin/bash。如下所示:
上方选择Any iOS Device
点击XCode上面的Product中的Archive,等待完成。在弹出的窗口里,点击Distribute App,选Custom,选App Store Connect,选Export,取消勾选upload symbols,Next,Distribution certificate选前面安装的那个,Profile选前面xxx_dis.mobileprovision。等待完成并导出。
进入苹果开发者中心,点击Users and Access
点击集成,在App Store Connect API的团队密钥里,点击创建密钥。下载保存密钥,并复制Issuer ID和密钥ID:
安装fastlane:
brew install fastlane
cd到项目中的iosApp/iosApp.xcodeproj,使用fastlane初始化项目,最后选择4手动管理:
cd iosApp/iosApp.xcodeproj
fastlane init
修改fastlane目录下的Appfile文件,填上自己的APP_IDENTIFIER和开发者账号邮箱。继续编辑Fastfile文件,填写如下脚本:
default_platform(:ios)
platform :ios do
lane :upload_to_appstore do
api_key = app_store_connect_api_key(
key_id: "D384******", # p8密钥ID
issuer_id: "6053b4****", # 发行者ID
key_filepath: "/path/to/AuthKey_D384****.p8", # p8文件路径
)
deliver(
api_key: api_key,
ipa: "path/to/your_app.ipa", # IPA 文件路径
skip_screenshots: true, # 跳过截图上传
skip_metadata: true, # 跳过元数据上传
submit_for_review: false, # 是否提交审核
force: true, # 即使验证失败也上传
precheck_include_in_app_purchases: false # 是否进行应用内购检测
)
end
end
运行脚本上传至appstore:
fastlane upload_to_appstore