diff --git a/.gitea/workflows/server-build.yml b/.gitea/workflows/server-build.yml new file mode 100644 index 0000000..f428db4 --- /dev/null +++ b/.gitea/workflows/server-build.yml @@ -0,0 +1,101 @@ +name: Build and Push Server Docker Image + +# 手动触发 workflow:从哪个分支运行,就打包哪个分支的代码 +on: + workflow_dispatch: + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + # 1️⃣ Checkout 仓库代码 + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + # 需要能 push tag(请在仓库 Secrets 配置 RUNNER_TOKEN) + token: ${{ secrets.RUNNER_TOKEN }} + persist-credentials: true + + # 2️⃣ 自动递增 tag 并推送回 Gitea 仓库(默认按 vX.Y.Z 的 patch +1) + - name: Auto bump tag and push to repository + shell: bash + run: | + set -euo pipefail + + # 配置提交信息(用于创建注释 tag) + git config user.name "gitea-actions" + git config user.email "actions@local" + + # 确保本地有最新 tags + git fetch --tags --force + + # 取最新的 semver tag(vX.Y.Z),按版本号排序 + LATEST_TAG="$(git tag --list 'v*' --sort=-v:refname | head -n 1 || true)" + echo "LATEST_TAG=${LATEST_TAG}" + + if [[ -z "${LATEST_TAG}" ]]; then + NEXT_TAG="v1.0.0" + else + if [[ "${LATEST_TAG}" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then + MAJOR="${BASH_REMATCH[1]}" + MINOR="${BASH_REMATCH[2]}" + PATCH="${BASH_REMATCH[3]}" + NEXT_TAG="v${MAJOR}.${MINOR}.$((PATCH + 1))" + else + # 如果最新 tag 不符合 vX.Y.Z,回退到 v1.0.0,避免误解析 + NEXT_TAG="v1.0.0" + fi + fi + + echo "NEXT_TAG=${NEXT_TAG}" + + # 如果 tag 已存在则直接复用(避免重复运行失败) + if git rev-parse -q --verify "refs/tags/${NEXT_TAG}" >/dev/null; then + echo "Tag ${NEXT_TAG} 已存在,跳过创建。" + else + git tag -a "${NEXT_TAG}" -m "Release ${NEXT_TAG}" + git push origin "${NEXT_TAG}" + fi + + # 输出给后续步骤使用 + if [[ -n "${GITHUB_ENV:-}" ]]; then + echo "IMAGE_TAG=${NEXT_TAG}" >> "$GITHUB_ENV" + fi + # 兼容部分 Gitea Runner 环境变量命名 + if [[ -n "${GITEA_ENV:-}" ]]; then + echo "IMAGE_TAG=${NEXT_TAG}" >> "$GITEA_ENV" + fi + + # 3️⃣ 设置 Docker 镜像名称 + - name: Set image variables + shell: bash + run: | + # 修改为你的 Docker Hub 仓库名,例如:yourname/mindfulness-server + IMAGE_NAME=docker.damer.fun/damer/mindfulness-server + if [[ -n "${GITHUB_ENV:-}" ]]; then + echo "IMAGE_NAME=$IMAGE_NAME" >> "$GITHUB_ENV" + fi + if [[ -n "${GITEA_ENV:-}" ]]; then + echo "IMAGE_NAME=$IMAGE_NAME" >> "$GITEA_ENV" + fi + + # 4️⃣ 登录 Docker Hub + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # 5️⃣ 构建 Docker 镜像(使用 server/ 作为构建上下文) + - name: Build Docker Image + shell: bash + run: | + docker build -f server/Dockerfile -t "$IMAGE_NAME:$IMAGE_TAG" server + + # 6️⃣ 推送 Docker 镜像到 Docker Hub + - name: Push Docker Image + shell: bash + run: | + docker push "$IMAGE_NAME:$IMAGE_TAG" diff --git a/client/app.json b/client/app.json index 6c4afd0..a16fdeb 100644 --- a/client/app.json +++ b/client/app.json @@ -15,7 +15,7 @@ }, "ios": { "supportsTablet": true, - "bundleIdentifier": "com.anonymous.client" + "bundleIdentifier": "com.damer.mindfulness" }, "android": { "adaptiveIcon": { diff --git a/client/ios/Podfile b/client/ios/Podfile index d83acbf..3a8876b 100644 --- a/client/ios/Podfile +++ b/client/ios/Podfile @@ -59,5 +59,13 @@ target 'client' do :mac_catalyst_enabled => false, :ccache_enabled => ccache_enabled?(podfile_properties), ) + + # 生成并随归档产物携带 dSYM(用于崩溃符号化与 Upload Symbols Failed 修复) + installer.pods_project.targets.each do |target| + target.build_configurations.each do |build_config| + build_config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf-with-dsym' + build_config.build_settings['DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT'] = 'YES' + end + end end end diff --git a/client/ios/Podfile.lock b/client/ios/Podfile.lock index 23e87b7..fd749bf 100644 --- a/client/ios/Podfile.lock +++ b/client/ios/Podfile.lock @@ -2397,6 +2397,6 @@ SPEC CHECKSUMS: RNWorklets: 9ccdc8112b17af6eee2c85a233891cb80db150ad Yoga: 5934998fbeaef7845dbf698f698518695ab4cd1a -PODFILE CHECKSUM: dfe3cc75dee014a0abd367bc9e1bdbab0ba64ee3 +PODFILE CHECKSUM: 4d5c52f9fa870c1d398cf59e37c149f66700c061 COCOAPODS: 1.16.2 diff --git a/client/ios/client.xcodeproj/project.pbxproj b/client/ios/client.xcodeproj/project.pbxproj index 4a11c49..99cfd9b 100644 --- a/client/ios/client.xcodeproj/project.pbxproj +++ b/client/ios/client.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 77; objects = { /* Begin PBXBuildFile section */ @@ -17,6 +17,8 @@ EB3DAF812F2A4B8E00450593 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB3DAF802F2A4B8D00450593 /* WidgetKit.framework */; }; EB3DAF832F2A4B8E00450593 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB3DAF822F2A4B8E00450593 /* SwiftUI.framework */; }; EB3DAF942F2A4B8F00450593 /* 情绪小组件Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = EB3DAF7F2F2A4B8D00450593 /* 情绪小组件Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + EB630B302F30BE2700DC761A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EB630B2F2F30BE2700DC761A /* Assets.xcassets */; }; + EB630B312F30BE2700DC761A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EB630B2F2F30BE2700DC761A /* Assets.xcassets */; }; F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; }; /* End PBXBuildFile section */ @@ -59,6 +61,7 @@ EB3DAF802F2A4B8D00450593 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; EB3DAF822F2A4B8E00450593 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; EB3DAF9A2F2A4D0900450593 /* MindfulnessWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MindfulnessWidget.swift; sourceTree = ""; }; + EB630B2F2F30BE2700DC761A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = client/AppDelegate.swift; sourceTree = ""; }; F11748442D0722820044C1D9 /* client-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "client-Bridging-Header.h"; path = "client/client-Bridging-Header.h"; sourceTree = ""; }; @@ -156,6 +159,7 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + EB630B2F2F30BE2700DC761A /* Assets.xcassets */, 13B07FAE1A68108700A75B9A /* client */, 832341AE1AAA6A7D00B99B32 /* Libraries */, EB3DAF842F2A4B8E00450593 /* 情绪小组件 */, @@ -305,6 +309,7 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, 0BE245B56A79D95AB0A7B4BA /* PrivacyInfo.xcprivacy in Resources */, + EB630B312F30BE2700DC761A /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -312,6 +317,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + EB630B302F30BE2700DC761A /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -475,9 +481,11 @@ baseConfigurationReference = FFF632A94C7A551AAA096858 /* Pods-client.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = client/client.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = WS92GPX9H2; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -489,14 +497,14 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = com.anonymous.client; + PRODUCT_BUNDLE_IDENTIFIER = com.damer.mindfulness; PRODUCT_NAME = client; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -505,7 +513,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "client/client-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -515,23 +523,27 @@ baseConfigurationReference = 3C76CA16D0801CBF0D731C7C /* Pods-client.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = client/client.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = WS92GPX9H2; + DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT = YES; INFOPLIST_FILE = client/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = com.anonymous.client; + PRODUCT_BUNDLE_IDENTIFIER = com.damer.mindfulness; PRODUCT_NAME = client; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -539,7 +551,7 @@ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "client/client-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; @@ -676,8 +688,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = WS92GPX9H2; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -695,7 +708,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = com.anonymous.client.emotionwidget; + PRODUCT_BUNDLE_IDENTIFIER = com.damer.mindfulness.emotionwidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -709,7 +722,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Debug; }; @@ -728,8 +741,9 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = WS92GPX9H2; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -746,7 +760,7 @@ MARKETING_VERSION = 1.0.0; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = com.anonymous.client.emotionwidget; + PRODUCT_BUNDLE_IDENTIFIER = com.damer.mindfulness.emotionwidget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -759,7 +773,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Release; }; diff --git a/client/ios/client/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/client/ios/client/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png index 2732229..1e1d338 100644 Binary files a/client/ios/client/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png and b/client/ios/client/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png differ diff --git a/client/ios/client/Info.plist b/client/ios/client/Info.plist index eb75ce6..ba93343 100644 --- a/client/ios/client/Info.plist +++ b/client/ios/client/Info.plist @@ -1,81 +1,81 @@ - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - client - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - client - com.anonymous.client - - - - CFBundleVersion - 1 - LSMinimumSystemVersion - 12.0 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - NSUserActivityTypes - - $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route - - RCTNewArchEnabled - - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - arm64 - - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleDefault - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Automatic - UIViewControllerBasedStatusBarAppearance - - - \ No newline at end of file + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + client + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + client + $(PRODUCT_BUNDLE_IDENTIFIER) + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSMinimumSystemVersion + 12.0 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSUserActivityTypes + + $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route + + RCTNewArchEnabled + + UILaunchStoryboardName + + UIRequiredDeviceCapabilities + + arm64 + + UIRequiresFullScreen + + UIStatusBarStyle + UIStatusBarStyleDefault + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Automatic + UIViewControllerBasedStatusBarAppearance + + + diff --git a/client/ios/client/client.entitlements b/client/ios/client/client.entitlements index 018a6e2..dec5aa2 100644 --- a/client/ios/client/client.entitlements +++ b/client/ios/client/client.entitlements @@ -3,6 +3,6 @@ aps-environment - development + production \ No newline at end of file diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 0000000..fac0965 --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,20 @@ +.venv +__pycache__/ +*.pyc +*.pyo +*.pyd +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ + +# 本地/测试数据 +.test.db +*.db + +# 测试与开发脚本(按需移除) +tests/ +.env* + +# Git 元数据 +.git/ +.gitignore diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..23318fe --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,27 @@ +FROM python:3.11-slim + +# 运行时基础环境 +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 + +WORKDIR /app + +# 系统依赖(按需扩展;多数依赖为纯 Python) +RUN apt-get update \ + && apt-get install -y --no-install-recommends build-essential curl \ + && rm -rf /var/lib/apt/lists/* + +# 先复制依赖清单以利用 Docker layer cache +COPY requirements.txt /app/requirements.txt +RUN python -m pip install -U pip \ + && pip install --no-cache-dir -r /app/requirements.txt + +# 复制后端代码与迁移配置 +COPY app /app/app +COPY alembic /app/alembic +COPY alembic.ini /app/alembic.ini + +EXPOSE 8000 + +# 生产镜像默认不开启 reload +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/spec_kit/iOS Widget/plan.md b/spec_kit/iOS Widget/plan.md index c3cfe08..a32f47e 100644 --- a/spec_kit/iOS Widget/plan.md +++ b/spec_kit/iOS Widget/plan.md @@ -46,5 +46,5 @@ ## 6. 风险与注意事项 - **Expo Go 不支持**:必须用 Xcode 运行预构建后的 App(或后续 EAS Build) -- **Bundle Identifier**:当前 `client/app.json` 使用 `com.anonymous.client`,仅适合本地验证;上线前需替换为真实 bundle id,并同步证书/签名 +- **Bundle Identifier**:当前工程已统一为主 App `com.damer.mindfulness`,Widget Extension `com.damer.mindfulness.emotionwidget`;上线前仍需在 Apple Developer / App Store Connect 侧确保 App ID、证书与签名匹配 diff --git a/spec_kit/iOS Widget/tasks.md b/spec_kit/iOS Widget/tasks.md index 9bb237b..33a5eef 100644 --- a/spec_kit/iOS Widget/tasks.md +++ b/spec_kit/iOS Widget/tasks.md @@ -65,7 +65,7 @@ npx expo prebuild -p ios - **排查**: - 桌面搜索不到:通常是没有 Run 安装过主 App,或 Widget target 未加入编译 - 点击不跳转:确认 Widget 里 `widgetURL` 为 `client:///(app)/home`,且 `app.json` 的 `scheme` 为 `client` - - 仍然搜不到:检查 Widget Extension 的 Bundle Identifier 是否有效(本仓库已修正为 `com.anonymous.client.emotionwidget`),然后 Clean + 重新安装 App + - 仍然搜不到:检查 Widget Extension 的 Bundle Identifier 是否有效(本仓库已修正为 `com.damer.mindfulness.emotionwidget`),然后 Clean + 重新安装 App ## 6. 文档补充(可选但建议) diff --git a/spec_kit/overview.md b/spec_kit/overview.md index b01b929..41f50b7 100644 --- a/spec_kit/overview.md +++ b/spec_kit/overview.md @@ -36,6 +36,9 @@ - 安全:真实 IP/账号/密码/Token 不写入仓库,仅提供 `.env.example` 结构 - **阶段产物**: - `spec_kit/Project Bootstrap/spec.md` +- **近期变更**: + - 新增后端镜像构建基础:`server/Dockerfile`、`server/.dockerignore` + - 新增后端镜像打包与推送工作流:`.gitea/workflows/server-build.yml`(自动递增 semver tag 并推送到 Docker Hub) ## Onboarding App Shell @@ -54,6 +57,10 @@ - `spec_kit/iOS Widget/spec.md` - `spec_kit/iOS Widget/plan.md` - `spec_kit/iOS Widget/tasks.md` +- **近期变更**: + - iOS 主 App Bundle ID 已统一为 `com.damer.mindfulness`,Widget Extension 为 `com.damer.mindfulness.emotionwidget` + - iOS 构建号已提升到 `2`,并将 `client/ios/client/Info.plist` 改为自动跟随 `MARKETING_VERSION` / `CURRENT_PROJECT_VERSION` + - 推送 entitlements 的 `aps-environment` 已切到 `production`(用于 TestFlight/线上包) ## Splash Consent