diff --git a/docs/releases/2026-03-24-app-encryption-compliance-draft.md b/docs/releases/2026-03-24-app-encryption-compliance-draft.md
index 7f35fed7..20b1f0e2 100644
--- a/docs/releases/2026-03-24-app-encryption-compliance-draft.md
+++ b/docs/releases/2026-03-24-app-encryption-compliance-draft.md
@@ -3,7 +3,7 @@
Date: 2026-03-24
App: XWorkmate
Platforms: iOS, macOS
-Related setting: `ITSAppUsesNonExemptEncryption = YES`
+Related setting: `ITSAppUsesNonExemptEncryption = NO`
## Purpose
@@ -11,10 +11,10 @@ This note is a practical drafting aid for App Store Connect export compliance an
## Recommended App Store Connect Position
-- The app should be treated as using encryption beyond a pure "Apple OS only" transport case.
-- The safer declaration path is:
+- The app should be treated as using standard encryption algorithms for transport, authentication, and credential protection.
+- The recommended declaration path is:
- App uses standard encryption algorithms.
- - `ITSAppUsesNonExemptEncryption` remains `YES`.
+ - `ITSAppUsesNonExemptEncryption` is `NO` (no non-exempt encryption declared in Info.plist).
- If the app is distributed in France, the publisher should assume the France-specific encryption documentation path applies unless counsel or a qualified compliance reviewer confirms otherwise.
## Implementation Basis
@@ -87,4 +87,3 @@ This app uses standard cryptographic algorithms and secure transport protocols,
- [`ios/Runner/Info.plist`](/Users/shenlan/workspaces/cloud-neutral-toolkit/XWorkmate.svc.plus/ios/Runner/Info.plist)
- [`macos/Runner/Info.plist`](/Users/shenlan/workspaces/cloud-neutral-toolkit/XWorkmate.svc.plus/macos/Runner/Info.plist)
-
diff --git a/docs/releases/appstore/2026-03-24-appstore-encryption-form-draft.md b/docs/releases/appstore/2026-03-24-appstore-encryption-form-draft.md
index 71d79ae2..e123fbe7 100644
--- a/docs/releases/appstore/2026-03-24-appstore-encryption-form-draft.md
+++ b/docs/releases/appstore/2026-03-24-appstore-encryption-form-draft.md
@@ -12,7 +12,7 @@ This document is a practical filling guide for the App Store Connect encryption
- Select: `代替在 Apple 操作系统中使用或访问加密,或与这些操作同时使用的标准加密算法`
- English meaning: standard cryptographic algorithms used in addition to or alongside Apple operating system encryption
- `ITSAppUsesNonExemptEncryption`:
- - Set to: `YES`
+ - Set to: `NO`
- France distribution:
- If France is included in sales regions, select: `是 / Yes`
@@ -102,4 +102,3 @@ This app uses standard cryptographic algorithms and secure transport protocols,
- [`lib/runtime/runtime_bootstrap.dart`](/Users/shenlan/workspaces/cloud-neutral-toolkit/XWorkmate.svc.plus/lib/runtime/runtime_bootstrap.dart)
- [`lib/runtime/secure_config_store.dart`](/Users/shenlan/workspaces/cloud-neutral-toolkit/XWorkmate.svc.plus/lib/runtime/secure_config_store.dart)
- [`lib/runtime/secret_store.dart`](/Users/shenlan/workspaces/cloud-neutral-toolkit/XWorkmate.svc.plus/lib/runtime/secret_store.dart)
-
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 14d2cc40..c5709c3c 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -290,7 +290,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n/bin/sh \"${PROJECT_DIR}/../scripts/ensure-framework-dsyms.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index f09668bc..d7a158b4 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -25,7 +25,7 @@
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
ITSAppUsesNonExemptEncryption
-
+
LSRequiresIPhoneOS
NSLocalNetworkUsageDescription
diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj
index 885b1ac1..f8139fda 100644
--- a/macos/Runner.xcodeproj/project.pbxproj
+++ b/macos/Runner.xcodeproj/project.pbxproj
@@ -422,7 +422,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n/bin/sh \"${PROJECT_DIR}/../scripts/ensure-framework-dsyms.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist
index adf0718a..69618676 100644
--- a/macos/Runner/Info.plist
+++ b/macos/Runner/Info.plist
@@ -21,7 +21,7 @@
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
ITSAppUsesNonExemptEncryption
-
+
LSMinimumSystemVersion
$(MACOSX_DEPLOYMENT_TARGET)
LSApplicationCategoryType
diff --git a/scripts/ensure-framework-dsyms.sh b/scripts/ensure-framework-dsyms.sh
new file mode 100755
index 00000000..9e2143a6
--- /dev/null
+++ b/scripts/ensure-framework-dsyms.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# Keep release/profile uploads resilient by generating missing framework dSYMs
+# after embed phases. This is a no-op for debug builds.
+if [[ "${CONFIGURATION:-}" != "Release" && "${CONFIGURATION:-}" != "Profile" ]]; then
+ exit 0
+fi
+
+if [[ -z "${FRAMEWORKS_FOLDER_PATH:-}" || -z "${TARGET_BUILD_DIR:-}" ]]; then
+ exit 0
+fi
+
+if [[ -z "${DWARF_DSYM_FOLDER_PATH:-}" ]]; then
+ exit 0
+fi
+
+frameworks_dir="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+if [[ ! -d "${frameworks_dir}" ]]; then
+ exit 0
+fi
+
+mkdir -p "${DWARF_DSYM_FOLDER_PATH}"
+
+for framework_path in "${frameworks_dir}"/*.framework; do
+ [[ -d "${framework_path}" ]] || continue
+
+ framework_name="$(basename "${framework_path}" .framework)"
+ binary_path="${framework_path}/${framework_name}"
+ [[ -f "${binary_path}" ]] || continue
+
+ # Most Flutter and pod frameworks already produce dSYMs in normal archive
+ # flow. Keep this pass narrow to known stragglers observed in distribution.
+ case "${framework_name}" in
+ objective_c|App|A) ;;
+ *) continue ;;
+ esac
+
+ dsym_path="${DWARF_DSYM_FOLDER_PATH}/${framework_name}.framework.dSYM"
+ if [[ -d "${dsym_path}" ]]; then
+ continue
+ fi
+
+ if ! xcrun dwarfdump --uuid "${binary_path}" >/dev/null 2>&1; then
+ continue
+ fi
+
+ echo "Generating missing dSYM for ${framework_name}.framework"
+ if ! xcrun dsymutil "${binary_path}" -o "${dsym_path}" >/dev/null 2>&1; then
+ echo "warning: Failed to generate dSYM for ${framework_name}.framework" >&2
+ rm -rf "${dsym_path}" || true
+ fi
+done