关于 distributing-tauri-for-ios
distributing-tauri-for-ios 是一份指导 Tauri v2 应用发布到 Apple App Store 的技能指南,适用于负责 iOS 构建与发行的开发者。内容涵盖签名配置、构建上传、TestFlight 测试和商店审核准备。
主要功能
- 01配置 Bundle ID 与版本号
- 02设置证书和配置描述文件
- 03构建并上传 IPA
- 04通过 TestFlight 安排测试
- 05准备商店资料并提交审核
适用场景
- 01为 Tauri iOS 应用配置 App Store 签名
- 02生成并上传 App Store Connect 构建包
- 03准备 TestFlight 测试和商店审核
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dchuk/ claude-code-tauri-skills --skill distributing-tauri-for-ios安装后在 Claude Code 中输入/distributing-tauri-for-ios确认已加载。
详细介绍
面向 iOS 分发 Tauri 应用
本技能涵盖将 Tauri v2 应用分发到 Apple iOS App Store 的完整流程。
前提条件
分发 Tauri iOS 应用前,请确保:
- macOS 开发机器(iOS 构建所必需)
- 已安装包含 iOS SDK 的 Xcode
- 已加入 Apple Developer Program(每年 99 美元)
- 已为 Tauri 项目初始化 iOS(
tauri ios init)
加入 Apple Developer Program
在 developer.apple.com/programs 加入:
- 使用 Apple ID 登录
- 接受 Apple Developer Agreement
- 完成注册(个人或组织)
- 等待审核通过(通常需要 24–48 小时)
配置 Bundle Identifier
Bundle Identifier 必须唯一,并且在所有配置中保持一致。
tauri.conf.json
{
"identifier": "com.yourcompany.yourapp",
"version": "1.0.0",
"bundle": {
"iOS": {
"bundleVersion": "1"
}
}
}
配置说明:
identifier:反向域名格式,必须与 App Store Connect 中的内容一致version:将成为CFBundleShortVersionString(用户可见的版本号)bundleVersion:将成为CFBundleVersion(构建号,每次上传时都必须递增)
在 App Store Connect 中注册 Bundle ID
- 前往 Certificates, Identifiers & Profiles
- 点击“+”注册新的标识符
- 选择“App IDs”,然后选择“App”
- 输入描述和与
tauri.conf.json匹配的显式 Bundle ID - 选择所需功能
- 点击“Register”
设置代码签名
创建证书
分发证书(App Store 必需):
- 在 macOS 上打开“钥匙串访问”
- 选择“钥匙串访问”>“证书助理”>“从证书颁发机构请求证书”
- 输入电子邮件,选择“存储到磁盘”
- 前往 Certificates
- 点击“+”并选择“Apple Distribution”
- 上传证书签名请求
- 下载并双击安装
创建 Provisioning Profile
App Store 分发配置文件:
- 前往 Profiles
- 点击“+”创建新的配置文件
- 在“Distribution”下选择“App Store Connect”
- 选择你的 App ID
- 选择你的分发证书
- 为配置文件命名并生成
- 下载
.mobileprovision文件
安装 Provisioning Profile
# Copy to Xcode provisioning profiles directory
cp ~/Downloads/YourApp_AppStore.mobileprovision \
~/Library/MobileDevice/Provisioning\ Profiles/
也可以双击该文件自动安装。
配置 Xcode 项目
在 Xcode 中打开 Tauri iOS 项目:
tauri ios build --open
在 Xcode 中配置签名
- 在导航器中选择项目
- 选择你的应用目标
- 前往“Signing & Capabilities”选项卡
- 取消勾选“Automatically manage signing”以进行手动控制
- 选择你的 Team
- 选择 App Store Provisioning Profile
所需功能
根据应用需求添加功能:
| 功能 | 需要时机 |
|---|---|
| 推送通知 | 使用 APNs 时 |
| 后台模式 | 执行后台任务时 |
| App Groups | 在扩展之间共享数据时 |
| 关联域名 | 使用通用链接时 |
配置 Info.plist
位于 src-tauri/gen/apple/[AppName]_iOS/Info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>Your App Name</string>
<key>CFBundleName</key>
<string>YourApp</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>NSCameraUsageDescription</key>
<string>This app requires camera access for...</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires photo library access for...</string>
</dict>
</plist>
必需的用途说明(仅当应用使用以下功能时才添加):
NSCameraUsageDescription:相机访问权限NSPhotoLibraryUsageDescription:照片图库NSLocationWhenInUseUsageDescription:位置服务NSMicrophoneUsageDescription:麦克风访问权限
应用图标
从源图像生成 iOS 应用图标(建议使用 1024x1024):
tauri icon /path/to/app-icon.png --ios-color '#ffffff'
这会在 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/ 中生成所有必需尺寸的图标。
构建 App Store 版本
命令行构建
# Build IPA for App Store Connect
tauri ios build --export-method app-store-connect
IPA 生成路径:
src-tauri/gen/apple/build/arm64/[AppName].ipa
构建选项
# Build with specific target
tauri ios build --target aarch64-apple-ios --export-method app-store-connect
# Build in release mode (default for export-method)
tauri ios build --release --export-method app-store-connect
# Build and open in Xcode for manual archive
tauri ios build --open
通过 Xcode 归档(替代方案)
- 打开项目:
tauri ios build --open - 选择“Any iOS Device”作为目标设备
- Product > Archive
- Window > Organizer,查看归档
- 点击“Distribute App”
- 选择“App Store Connect”
- 按照向导操作
App Store Connect API 密钥设置
创建用于自动上传的 API 密钥:
- 前往 App Store Connect > Users and Access
- 选择“Integrations”标签页
- 点击“App Store Connect API”,然后点击“+”
- 为密钥命名,并选择“Admin”或“Developer”角色
- 点击“Generate”
- 下载
.p8文件(仅可下载一次) - 记下 Key ID 和 Issuer ID
存储 API 密钥
# Create directory
mkdir -p ~/.appstoreconnect/private_keys
# Move the key file (rename to include Key ID)
mv ~/Downloads/AuthKey_XXXXXXXXXX.p8 ~/.appstoreconnect/private_keys/
# Alternative location
mkdir -p ~/private_keys
mv ~/Downloads/AuthKey_XXXXXXXXXX.p8 ~/private_keys/
环境变量(可选)
export APPLE_API_KEY_ID="XXXXXXXXXX"
export APPLE_API_ISSUER="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
上传到 App Store Connect
使用 altool
xcrun altool --upload-app \
--type ios \
--file "src-tauri/gen/apple/build/arm64/YourApp.ipa" \
--apiKey "$APPLE_API_KEY_ID" \
--apiIssuer "$APPLE_API_ISSUER"
使用 Transporter 应用
- 从 Mac App Store 下载 Transporter
- 使用 Apple ID 登录
- 拖放 IPA 文件
- 点击“Deliver”
使用 Xcode Organizer
- Window > Organizer
- 选择归档
- 点击“Distribute App”
- 选择“App Store Connect”
- 选择“Upload”或“Export”
- 按照提示操作
TestFlight Beta 测试
上传处理完成后(通常需要 15-30 分钟):
内部测试
- App Store Connect > Your App > TestFlight
- 添加内部测试人员(最多 100 人,必须是 App Store Connect 用户)
- 测试人员会收到电子邮件邀请
外部测试
- 创建测试组
- 将构建版本添加到该组
- 提交 Beta App Review(外部测试人员必须经过此审核)
- 添加外部测试人员(最多 10,000 人)
- 测试人员通过 TestFlight 应用安装
App Store 提交
在 App Store Connect 中创建应用
- 前往 App Store Connect
- My Apps > “+” > New App
- 选择 iOS 平台
- 输入应用名称、主要语言、Bundle ID 和 SKU
- 点击“Create”
准备 App Store 页面
所需素材:
| 素材 | 规格 |
|---|---|
| 屏幕截图 | 6.7"(1290x2796)、6.5"(1284x2778)、5.5"(1242x2208) |
| 应用图标 | 1024x1024 PNG(无 Alpha 通道) |
| 描述 | 最多 4000 个字符 |
| 关键词 | 最多 100 个字符 |
| 支持 URL | 必填 |
| 隐私政策 URL | 必填 |
应用隐私
完成应用隐私问卷:
- App Store Connect > Your App > App Privacy
- 回答有关数据收集的问题
- 指明收集的数据类型
- 说明数据使用目的
提交审核
- 在 App Store Connect 中选择构建版本
- 填写所有必需的元数据
- 回答出口合规性问题
- 点击“Submit for Review”
审核通常需要 24-48 小时。
常见问题与解决方案
代码签名错误
“No signing certificate found”
# List available certificates
security find-identity -v -p codesigning
# Verify certificate is valid
security find-certificate -c "Apple Distribution" -p
“Provisioning profile doesn't match”
- 确保所有位置的 Bundle ID 完全一致
- 如果证书有变更,请重新生成配置描述文件
构建失败
“Unsupported architecture”
# Ensure building for correct target
tauri ios build --target aarch64-apple-ios --export-method app-store-connect
“Missing entitlements”
- 检查 Xcode 中的功能是否与 App ID 功能匹配
- 功能变更后,重新生成配置描述文件
上传错误
“Invalid binary”
- 确保正确设置最低 iOS 版本
- 确认所有必需的图标均已提供
- 检查 Info.plist 是否包含必需的键
“Missing compliance” 如果未使用加密,请添加到 Info.plist:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
CI/CD 集成
GitHub Actions 示例
name: iOS Release
on:
push:
tags:
- 'v*'
jobs:
build-ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Rust
uses: dtolnay/rust-action@stable
with:
targets: aarch64-apple-ios
- name: Install dependencies
run: npm ci
- name: Install certificate
env:
CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
run: |
CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
echo -n "$CERTIFICATE_BASE64" | base64 --decode > $CERTIFICATE_PATH
security create-keychain -p "" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "" $KEYCHAIN_PATH
security import $CERTIFICATE_PATH -P "$CERTIFICATE_PASSWORD" \
-A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
- name: Install provisioning profile
env:
PROVISIONING_PROFILE_BASE64: ${{ secrets.PROVISIONING_PROFILE_BASE64 }}
run: |
PP_PATH=$RUNNER_TEMP/profile.mobileprovision
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode > $PP_PATH
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles/
- name: Build iOS
run: npm run tauri ios build -- --export-method app-store-connect
- name: Upload to App Store Connect
env:
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
run: |
mkdir -p ~/.appstoreconnect/private_keys
echo "$APPLE_API_KEY" > ~/.appstoreconnect/private_keys/AuthKey_$APPLE_API_KEY_ID.p8
xcrun altool --upload-app --type ios \
--file src-tauri/gen/apple/build/arm64/*.ipa \
--apiKey $APPLE_API_KEY_ID \
--apiIssuer $APPLE_API_ISSUER
版本管理
递增版本号
每次提交到 App Store 时,都应按需递增版本号:
{
"version": "1.0.0",
"bundle": {
"iOS": {
"bundleVersion": "1"
}
}
}
version:用户可见变更时递增(1.0.0 -> 1.0.1 或 1.1.0)bundleVersion:每次上传都必须递增(1 -> 2 -> 3)
版本脚本示例
#!/bin/bash
# increment-build.sh
CONFIG="src-tauri/tauri.conf.json"
CURRENT=$(jq -r '.bundle.iOS.bundleVersion' $CONFIG)
NEW=$((CURRENT + 1))
jq ".bundle.iOS.bundleVersion = \"$NEW\"" $CONFIG > tmp.json && mv tmp.json $CONFIG
echo "Bundle version incremented to $NEW"