Skip to content

Commit 6734be4

Browse files
echo-loopclaude
andcommitted
FIX: 修复 Release 工作流失败并补齐 iOS 相机权限文案
- Android:Flutter 3.47.9 要求 Gradle ≥ 8.14、AGP ≥ 8.11.1、Kotlin ≥ 2.2.20, 原配置(8.12 / 8.9.1 / 2.1.0)在配置阶段即中止,升级 Gradle、AGP、Kotlin 对齐 - iOS 上传:altool 瞬时 500 重试成功后日志仍残留 ERROR 行,改以 "UPLOAD SUCCEEDED with no errors" 判定成功,避免误判失败 - iOS:补充 NSCameraUsageDescription(ITMS-90683),同步 en / zh-Hans 文案 - docs:记录 7.35 / 7.36 踩坑 Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 22e0707 commit 6734be4

7 files changed

Lines changed: 25 additions & 5 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,10 @@ jobs:
465465
echo "::error::altool exited with status $STATUS" >&2
466466
exit "$STATUS"
467467
fi
468-
if grep -E '^[0-9-]+ [0-9:.]+ ERROR' "$LOG" >/dev/null; then
469-
echo "::error::altool reported ERROR despite exit 0 — failing step" >&2
468+
# 上传链路的 500 等瞬时错误会被 altool 内部重试,成功后日志里仍留有 ERROR 行,
469+
# 因此不能仅凭 ERROR 关键字判失败;以 "UPLOAD SUCCEEDED with no errors" 作为成功依据。
470+
if ! grep -q 'UPLOAD SUCCEEDED with no errors' "$LOG"; then
471+
echo "::error::altool did not report UPLOAD SUCCEEDED — failing step" >&2
470472
grep -E '^[0-9-]+ [0-9:.]+ ERROR' "$LOG" >&2 || true
471473
exit 1
472474
fi

‎android/gradle/wrapper/gradle-wrapper.properties‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
4+
networkTimeout=10000
5+
validateDistributionUrl=true
36
zipStoreBase=GRADLE_USER_HOME
47
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip

‎android/settings.gradle.kts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ pluginManagement {
1919

2020
plugins {
2121
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
22-
id("com.android.application") version "8.9.1" apply false
23-
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
22+
id("com.android.application") version "8.11.1" apply false
23+
id("org.jetbrains.kotlin.android") version "2.2.20" apply false
2424
id("com.google.gms.google-services") version "4.4.2" apply false
2525
}
2626

‎docs/troubleshooting.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,3 +559,15 @@
559559
- 语言标识参与提醒快照去重(`locale|<tag>`),切换语言后即使提醒不变也会重新调度。
560560
- 回归测试:`download_provider_test.dart`(fr_CN 回退)、`background_file_download_service_test.dart`(解析抛异常仍可入队)、`review_reminder_service_test.dart`「本地化文案」组、`paddle_billing_repository_test.dart`(checkout locale 注入)、`settings_provider_test.dart`「resolveUiLocale」组。
561561
- 排查日志:`[BackgroundFileDownload] plugin initialization failed`,`cause=AppLocalizations.delegate failed to load unsupported locale "<locale>"`。
562+
563+
### 7.35 Release 工作流失败:Flutter SDK 对 Gradle / AGP / Kotlin 有最低版本门槛,升级 Flutter 后构建直接中止
564+
565+
- 根因:CI 的 Flutter 升到 3.47.9 后,`flutter-gradle-plugin` 校验项目的 Gradle ≥ 8.14、AGP ≥ 8.11.1、Kotlin ≥ 2.2.20,原配置(Gradle 8.12 / AGP 8.9.1 / Kotlin 2.1.0)全部不满足,`app/build.gradle.kts` 应用插件时即失败。三项门槛按顺序逐个暴露,需要一次性对齐。
566+
- 规则:升级 `FLUTTER_VERSION` 时,先在本地 `./gradlew help` 验证 Android 配置阶段,再打 tag;不要只看 Flutter 版本号。
567+
- 排查日志:`Your project's Gradle version (8.12.0) is lower than Flutter's minimum supported version`。
568+
569+
### 7.36 iOS 上传 altool 日志残留瞬时 500 的 ERROR 行 → 误判失败(上传实际已成功)
570+
571+
- 根因:App Store Connect 偶发 500 时 altool 内部重试并最终 `UPLOAD SUCCEEDED with no errors`,但日志里仍保留 `ERROR:` 行。工作流以「日志含 ERROR 即失败」判定,把已成功的上传标红。
572+
- 规则:判定上传成功以 `UPLOAD SUCCEEDED with no errors` 为准,不以 ERROR 关键字为准;该构建号已入库,重跑同一 commit 会因构建号重复失败,需要新 commit 打新 tag。
573+
- 同一次上传 Apple 还邮件提示 `ITMS-90683`:`file_picker` 等依赖引入相机 API,Info.plist 缺 `NSCameraUsageDescription` 即使应用不使用相机也会被拒,须补齐并同步 `en` / `zh-Hans` 的 InfoPlist.strings。

‎ios/Runner/Info.plist‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@
8787
<true/>
8888
<key>UIFileSharingEnabled</key>
8989
<true/>
90+
<key>NSCameraUsageDescription</key>
91+
<string>This app needs camera access only when you choose to capture a photo or video for your study materials.</string>
9092
<key>NSPhotoLibraryUsageDescription</key>
9193
<string>This app needs access to your photo library to select audio files.</string>
9294
<key>NSAppleMusicUsageDescription</key>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
"CFBundleName" = "Echo Loop";
2+
"NSCameraUsageDescription" = "This app needs camera access only when you choose to capture a photo or video for your study materials.";
23
"NSMicrophoneUsageDescription" = "This app needs microphone access so you can record your spoken English practice.";
34
"NSSpeechRecognitionUsageDescription" = "This app needs speech recognition access to compare your spoken English with the target sentence.";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
"CFBundleName" = "Echo Loop";
2+
"NSCameraUsageDescription" = "仅当你选择拍摄照片或视频作为学习材料时,才需要相机权限。";
23
"NSMicrophoneUsageDescription" = "需要麦克风权限,以便录下你的英语跟读。";
34
"NSSpeechRecognitionUsageDescription" = "需要语音识别权限,以便对比你的英语跟读和目标句子。";

0 commit comments

Comments
 (0)