diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7b73d101..973709fb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -150,9 +150,56 @@ jobs: fi echo "✅ Tauri signing key prepared" + - name: Import Apple signing certificate + if: runner.os == 'macOS' + shell: bash + run: | + set -euo pipefail + # Decode .p12 certificate from base64 + CERT_PATH="$RUNNER_TEMP/certificate.p12" + printf '%s' "${{ secrets.APPLE_CERTIFICATE }}" | (base64 --decode 2>/dev/null || base64 -D) > "$CERT_PATH" + + # Save original default keychain for cleanup + ORIGINAL_DEFAULT_KEYCHAIN=$(security default-keychain -d user | tr -d '"' | xargs) + echo "ORIGINAL_DEFAULT_KEYCHAIN=$ORIGINAL_DEFAULT_KEYCHAIN" >> "$GITHUB_ENV" + + # Create temporary keychain + KEYCHAIN_PATH="$RUNNER_TEMP/build.keychain-db" + security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" "$KEYCHAIN_PATH" + security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" + security default-keychain -s "$KEYCHAIN_PATH" + security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" "$KEYCHAIN_PATH" + + # Import certificate + security import "$CERT_PATH" \ + -k "$KEYCHAIN_PATH" \ + -P "${{ secrets.APPLE_CERTIFICATE_PASSWORD }}" \ + -T /usr/bin/codesign \ + -T /usr/bin/security + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "${{ secrets.KEYCHAIN_PASSWORD }}" "$KEYCHAIN_PATH" + + # Dynamically resolve signing identity (must be "Developer ID Application") + IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN_PATH" \ + | grep "Developer ID Application" | grep -oE '"[^"]+"' | head -1 | tr -d '"') + if [ -z "$IDENTITY" ]; then + echo "❌ No 'Developer ID Application' identity found — listing all identities:" >&2 + security find-identity -v -p codesigning "$KEYCHAIN_PATH" + exit 1 + fi + echo "✅ Signing identity: $IDENTITY" + echo "APPLE_SIGNING_IDENTITY=$IDENTITY" >> "$GITHUB_ENV" + + # Cleanup certificate file + rm -f "$CERT_PATH" + - name: Build Tauri App (macOS) if: runner.os == 'macOS' run: pnpm tauri build --target universal-apple-darwin + env: + APPLE_SIGNING_IDENTITY: ${{ env.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - name: Build Tauri App (Windows) if: runner.os == 'Windows' @@ -169,38 +216,127 @@ jobs: set -euxo pipefail mkdir -p release-assets VERSION="${GITHUB_REF_NAME}" # e.g., v3.5.0 - echo "Looking for updater artifact (.tar.gz) and .app for zip..." - TAR_GZ=""; APP_PATH="" + + # Locate bundle directory + BUNDLE_DIR="" + TAR_GZ=""; APP_PATH=""; DMG_PATH="" for path in \ "src-tauri/target/universal-apple-darwin/release/bundle/macos" \ "src-tauri/target/aarch64-apple-darwin/release/bundle/macos" \ "src-tauri/target/x86_64-apple-darwin/release/bundle/macos" \ "src-tauri/target/release/bundle/macos"; do if [ -d "$path" ]; then - [ -z "$TAR_GZ" ] && TAR_GZ=$(find "$path" -maxdepth 1 -name "*.tar.gz" -type f | head -1 || true) + BUNDLE_DIR="$path" + [ -z "$TAR_GZ" ] && TAR_GZ=$(find "$path" -maxdepth 1 -name "*.tar.gz" -type f | head -1 || true) [ -z "$APP_PATH" ] && APP_PATH=$(find "$path" -maxdepth 1 -name "*.app" -type d | head -1 || true) + [ -z "$DMG_PATH" ] && DMG_PATH=$(find "$path" -maxdepth 1 -name "*.dmg" -type f | head -1 || true) fi done + + # Also search dmg directory (Tauri may put DMGs there) + for path in \ + "src-tauri/target/universal-apple-darwin/release/bundle/dmg" \ + "src-tauri/target/aarch64-apple-darwin/release/bundle/dmg" \ + "src-tauri/target/x86_64-apple-darwin/release/bundle/dmg" \ + "src-tauri/target/release/bundle/dmg"; do + if [ -d "$path" ] && [ -z "$DMG_PATH" ]; then + DMG_PATH=$(find "$path" -maxdepth 1 -name "*.dmg" -type f | head -1 || true) + fi + done + if [ -z "$TAR_GZ" ]; then echo "No macOS .tar.gz updater artifact found" >&2 exit 1 fi - # 重命名 tar.gz 为统一格式 + + # Staple notarization ticket (hard-fail — must succeed before release) + if [ -n "$APP_PATH" ]; then + xcrun stapler staple "$APP_PATH" + echo "✅ .app stapled" + fi + if [ -n "$DMG_PATH" ]; then + xcrun stapler staple "$DMG_PATH" + echo "✅ .dmg stapled" + fi + + # 1) Collect .tar.gz (updater artifact) NEW_TAR_GZ="CC-Switch-${VERSION}-macOS.tar.gz" cp "$TAR_GZ" "release-assets/$NEW_TAR_GZ" [ -f "$TAR_GZ.sig" ] && cp "$TAR_GZ.sig" "release-assets/$NEW_TAR_GZ.sig" || echo ".sig for macOS not found yet" echo "macOS updater artifact copied: $NEW_TAR_GZ" + + # 2) Collect .app as zip (absolute paths, no cd) if [ -n "$APP_PATH" ]; then - APP_DIR=$(dirname "$APP_PATH"); APP_NAME=$(basename "$APP_PATH") NEW_ZIP="CC-Switch-${VERSION}-macOS.zip" - cd "$APP_DIR" - ditto -c -k --sequesterRsrc --keepParent "$APP_NAME" "$NEW_ZIP" - mv "$NEW_ZIP" "$GITHUB_WORKSPACE/release-assets/" + ditto -c -k --sequesterRsrc --keepParent "$APP_PATH" "release-assets/$NEW_ZIP" echo "macOS zip ready: $NEW_ZIP" else echo "No .app found to zip (optional)" >&2 fi + # 3) Collect .dmg + if [ -n "$DMG_PATH" ]; then + NEW_DMG="CC-Switch-${VERSION}-macOS.dmg" + cp "$DMG_PATH" "release-assets/$NEW_DMG" + echo "macOS DMG ready: $NEW_DMG" + else + echo "No .dmg found (optional)" >&2 + fi + + - name: Verify macOS code signing and notarization + if: runner.os == 'macOS' + shell: bash + run: | + set -euo pipefail + APP_PATH=""; DMG_PATH="" + for path in \ + "src-tauri/target/universal-apple-darwin/release/bundle/macos" \ + "src-tauri/target/aarch64-apple-darwin/release/bundle/macos" \ + "src-tauri/target/x86_64-apple-darwin/release/bundle/macos" \ + "src-tauri/target/release/bundle/macos"; do + if [ -d "$path" ]; then + [ -z "$APP_PATH" ] && APP_PATH=$(find "$path" -maxdepth 1 -name "*.app" -type d | head -1 || true) + fi + done + for path in \ + "src-tauri/target/universal-apple-darwin/release/bundle/dmg" \ + "src-tauri/target/aarch64-apple-darwin/release/bundle/dmg" \ + "src-tauri/target/x86_64-apple-darwin/release/bundle/dmg" \ + "src-tauri/target/release/bundle/dmg" \ + "src-tauri/target/universal-apple-darwin/release/bundle/macos" \ + "src-tauri/target/release/bundle/macos"; do + if [ -d "$path" ] && [ -z "$DMG_PATH" ]; then + DMG_PATH=$(find "$path" -maxdepth 1 -name "*.dmg" -type f | head -1 || true) + fi + done + + # Verify .app + if [ -z "$APP_PATH" ]; then + echo "❌ No .app found for verification" >&2 + exit 1 + fi + echo "=== Verifying .app: $APP_PATH ===" + codesign --verify --deep --strict --verbose=2 "$APP_PATH" + echo "✅ codesign verification passed" + spctl -a -t exec -vv "$APP_PATH" + echo "✅ spctl assessment passed" + xcrun stapler validate "$APP_PATH" + echo "✅ .app stapler validation passed" + + # Verify .dmg + if [ -n "$DMG_PATH" ]; then + echo "=== Verifying .dmg: $DMG_PATH ===" + codesign --verify --verbose=2 "$DMG_PATH" + echo "✅ .dmg codesign verification passed" + spctl -a -t open --context context:primary-signature -vv "$DMG_PATH" + echo "✅ .dmg spctl assessment passed" + xcrun stapler validate "$DMG_PATH" + echo "✅ .dmg stapler validation passed" + else + echo "❌ No .dmg found for verification — release would ship without verified DMG" >&2 + exit 1 + fi + - name: Prepare Windows Assets if: runner.os == 'Windows' shell: pwsh @@ -312,13 +448,15 @@ jobs: ### 下载 - - **macOS**: `CC-Switch-${{ github.ref_name }}-macOS.zip`(解压即用)或 `CC-Switch-${{ github.ref_name }}-macOS.tar.gz`(Homebrew) + - **macOS**: `CC-Switch-${{ github.ref_name }}-macOS.dmg`(推荐)或 `CC-Switch-${{ github.ref_name }}-macOS.zip`(解压即用) - **Windows**: `CC-Switch-${{ github.ref_name }}-Windows.msi`(安装版)或 `CC-Switch-${{ github.ref_name }}-Windows-Portable.zip`(绿色版) - **Linux (x86_64)**: `CC-Switch-${{ github.ref_name }}-Linux-x86_64.AppImage` / `.deb` / `.rpm` - **Linux (ARM64)**: `CC-Switch-${{ github.ref_name }}-Linux-arm64.AppImage` / `.deb` / `.rpm` + > `.tar.gz` 为 Tauri updater 自动更新专用,无需手动下载。 + --- - 提示:macOS 如遇"已损坏"提示,可在终端执行:`xattr -cr "/Applications/CC Switch.app"` + macOS 版本已通过 Apple 代码签名和公证,可直接安装使用。 files: release-assets/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -330,6 +468,17 @@ jobs: echo "Listing bundles in src-tauri/target..." find src-tauri/target -maxdepth 4 -type f -name "*.*" 2>/dev/null || true + - name: Clean up Apple signing keychain + if: runner.os == 'macOS' && always() + shell: bash + run: | + if [ -n "${ORIGINAL_DEFAULT_KEYCHAIN:-}" ]; then + security default-keychain -s "$ORIGINAL_DEFAULT_KEYCHAIN" || true + fi + if [ -f "$RUNNER_TEMP/build.keychain-db" ]; then + security delete-keychain "$RUNNER_TEMP/build.keychain-db" || true + fi + assemble-latest-json: name: Assemble latest.json runs-on: ubuntu-22.04 diff --git a/CHANGELOG.md b/CHANGELOG.md index a1acd534..875f0bd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,43 @@ All notable changes to CC Switch will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +Post-v3.12.3 work introduces GitHub Copilot reverse proxy support as a major new feature, adds intelligent reasoning_effort mapping for OpenAI o-series models, optimizes Skills cache invalidation, and delivers critical fixes for WebDAV password safety, tool message parsing, and dark mode. + +**Stats**: 13 commits | 74 files changed | +6,080 insertions | -1,197 deletions + +### Added + +- **GitHub Copilot Reverse Proxy**: Full GitHub Copilot integration as a Claude Code provider via OAuth Device Code flow; includes multi-account management, automatic token refresh, Anthropic ↔ OpenAI format conversion, real-time model list fetching, and usage statistics (#930) +- **Copilot Auth Center**: New Auth Center panel in Settings for managing GitHub accounts globally, with per-provider account binding via `meta.authBinding` +- **Reasoning Effort Mapping**: Two-tier `resolve_reasoning_effort()` for OpenAI o-series and GPT-5+ models — explicit `output_config.effort` takes priority, falling back to thinking `budget_tokens` thresholds (<4 000→low, 4 000–16 000→medium, ≥16 000→high); covers both Chat Completions and Responses API paths with 17 unit tests +- **OpenCode SQLite Backend**: Added SQLite session storage support for OpenCode alongside existing JSON backend; dual-backend scan with SQLite priority on ID conflicts, atomic session deletion, and path validation +- **macOS Code Signing & Notarization**: CI now imports an Apple Developer ID certificate, signs the universal binary, submits for Apple notarization, and staples the ticket to both `.app` and `.dmg`; a hard-fail verification step (`codesign --verify` + `spctl -a` + `stapler validate`) gates the release for both artifacts + +### Changed + +- **Tool Search Mechanism Migration**: Replaced the binary-patching bypass (~590 lines in `toolsearch_patch.rs`) with Claude 2.1.76+ native `ENABLE_TOOL_SEARCH` env var toggle; moved the control from Settings page to the provider Common Config editor as a simple checkbox (#930) +- **Skills Cache Strategy**: Replaced `invalidateQueries` with direct `setQueryData` updates for skill install/uninstall/import operations; added `staleTime: Infinity` with `keepPreviousData` to eliminate loading flicker (#1573) +- **Claude 4.6 Context Window**: Updated Claude Opus 4.6 and Sonnet 4.6 context window from 200K to 1M across OpenClaw and OpenCode presets (GA release) +- **MiniMax Model Upgrade**: Updated MiniMax presets from M2.5 to M2.7 across Claude, OpenClaw, and OpenCode configurations with updated partner descriptions in all three locales +- **Xiaomi MiMo Model Upgrade**: Updated MiMo presets from mimo-v2-flash to mimo-v2-pro across all supported applications +- **AddProviderDialog Simplification**: Removed redundant OAuth tab, reducing dialog from 3 tabs to 2 (app-specific + universal) + +### Fixed + +- **WebDAV Password Silent Clear**: Fixed WebDAV password being silently wiped when ProviderList or UsageScriptModal saved settings by stripping `webdavSync` from frontend payloads and adding backend backfill logic in `merge_settings_for_save()` to preserve existing passwords +- **Tool Message Parsing**: Fixed tool_use/tool_result message classification across Claude (tool_result content blocks), Codex (function_call/function_call_output payloads), and Gemini (array content + toolCalls extraction) session providers (#1401) +- **Dark Mode Selector**: Changed Tailwind `darkMode` from `["selector", "class"]` to `["selector", ".dark"]` to ensure correct dark mode activation (#1596) +- **Copilot Request Fingerprint**: Unified Copilot request fingerprint headers across all API call sites to prevent User-Agent leakage and stream check mismatches + +### Docs + +- **Pricing Model ID Normalization**: Added documentation section explaining model ID normalization rules (prefix stripping, suffix trimming, `@`→`-` replacement) in EN/ZH/JA user manuals (#1591) +- **macOS Signed & Notarized**: Removed all `xattr` workaround instructions and "unidentified developer" warnings from README, README_ZH, installation guides (EN/ZH/JA), and FAQ pages (EN/ZH/JA); replaced with "signed and notarized by Apple" messaging + +--- + ## [3.12.3] - 2026-03-15 Post-v3.12.2 work adds a Tool Search domain restriction bypass, skill backup/restore lifecycle, proxy compatibility for OpenAI o-series models and gzip compression, and robustness fixes for Skills import, provider forms, and terminal session restore. diff --git a/README.md b/README.md index 88cb9718..36b2e0ec 100644 --- a/README.md +++ b/README.md @@ -184,9 +184,9 @@ CC Switch provides a "Shared Config Snippet" feature to pass common data (beyond
-macOS shows "unidentified developer" warning — how do I fix it? +macOS installation -The author doesn't have an Apple Developer account yet (registration in progress). Close the warning, then go to **System Settings → Privacy & Security → Open Anyway**. After that, the app will open normally. +CC Switch for macOS is code-signed and notarized by Apple. You can download and install it directly — no extra steps needed. We recommend using the `.dmg` installer.
@@ -268,9 +268,9 @@ brew upgrade --cask cc-switch **Method 2: Manual Download** -Download `CC-Switch-v{version}-macOS.zip` from the [Releases](../../releases) page and extract to use. +Download `CC-Switch-v{version}-macOS.dmg` (recommended) or `.zip` from the [Releases](../../releases) page. -> **Note**: Since the author doesn't have an Apple Developer account, you may see an "unidentified developer" warning on first launch. Please close it first, then go to "System Settings" → "Privacy & Security" → click "Open Anyway", and you'll be able to open it normally afterwards. +> **Note**: CC Switch for macOS is code-signed and notarized by Apple. You can install and open it directly. ### Arch Linux Users diff --git a/README_ZH.md b/README_ZH.md index 402a976f..bf13f288 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -185,9 +185,9 @@ CC Switch 使用“通用配置片段”功能,在不同的供应商之间传
-macOS 提示"未知开发者"警告 — 如何解决? +macOS 安装 -这是由于作者没有苹果开发者账号(正在注册中)。关闭警告后,前往**系统设置 → 隐私与安全性 → 仍要打开**。之后应用即可正常打开。 +CC Switch macOS 版本已通过 Apple 代码签名和公证,可直接下载安装,无需额外操作。推荐使用 `.dmg` 安装包。
@@ -271,9 +271,9 @@ brew upgrade --cask cc-switch **方式二:手动下载** -从 [Releases](../../releases) 页面下载 `CC-Switch-v{版本号}-macOS.zip` 解压使用。 +从 [Releases](../../releases) 页面下载 `CC-Switch-v{版本号}-macOS.dmg`(推荐)或 `.zip`。 -> **注意**:由于作者没有苹果开发者账号,首次打开可能出现"未知开发者"警告,请先关闭,然后前往"系统设置" → "隐私与安全性" → 点击"仍要打开",之后便可以正常打开。 +> **注意**:CC Switch macOS 版本已通过 Apple 代码签名和公证,可直接安装打开。 ### Arch Linux 用户 diff --git a/docs/user-manual/en/1-getting-started/1.2-installation.md b/docs/user-manual/en/1-getting-started/1.2-installation.md index 65b94861..f4425b0e 100644 --- a/docs/user-manual/en/1-getting-started/1.2-installation.md +++ b/docs/user-manual/en/1-getting-started/1.2-installation.md @@ -131,21 +131,9 @@ brew upgrade --cask cc-switch 2. Extract to get `CC Switch.app` 3. Drag it to the Applications folder -### First Launch Warning +### Signed and Notarized -Since the developer does not have an Apple Developer account, a "developer cannot be verified" warning may appear on first launch: - -**Recommended solution**: -Open Terminal and run the following command: -```bash -sudo xattr -dr com.apple.quarantine /Applications/CC\ Switch.app/ -``` - -**Alternative solution (via System Settings)**: -1. Close the warning dialog -2. Open "System Settings" > "Privacy & Security" -3. Find the CC Switch prompt and click "Open Anyway" -4. Reopen the app to use it normally +CC Switch for macOS is signed and notarized by Apple. You can install and open it directly — no extra steps needed. ## Linux diff --git a/docs/user-manual/en/5-faq/5.2-questions.md b/docs/user-manual/en/5-faq/5.2-questions.md index a0ad6b98..624950be 100644 --- a/docs/user-manual/en/5-faq/5.2-questions.md +++ b/docs/user-manual/en/5-faq/5.2-questions.md @@ -2,23 +2,9 @@ ## Installation Issues -### macOS Shows "Unidentified Developer" +### macOS Installation -**Problem**: First launch shows "Cannot open because it is from an unidentified developer" - -**Solution 1**: Via System Settings -1. Close the warning dialog -2. Open "System Settings" > "Privacy & Security" -3. Find the CC Switch prompt -4. Click "Open Anyway" -5. Reopen the app - -**Solution 2**: Via Terminal command (recommended) -```bash -sudo xattr -dr com.apple.quarantine /Applications/CC\ Switch.app/ -``` - -The app can be opened normally after running this command. +CC Switch for macOS is code-signed and notarized by Apple. You can download and install it directly without any additional steps. If you encounter issues, try downloading the latest version from the [Releases page](https://github.com/farion1231/cc-switch/releases). ### Windows: App Doesn't Launch After Installation diff --git a/docs/user-manual/ja/1-getting-started/1.2-installation.md b/docs/user-manual/ja/1-getting-started/1.2-installation.md index 0911150f..46a952cf 100644 --- a/docs/user-manual/ja/1-getting-started/1.2-installation.md +++ b/docs/user-manual/ja/1-getting-started/1.2-installation.md @@ -131,21 +131,9 @@ brew upgrade --cask cc-switch 2. 展開して `CC Switch.app` を取得 3. 「アプリケーション」フォルダにドラッグ -### 初回起動時の警告 +### 署名・公証済み -開発者が Apple 開発者アカウントを持っていないため、初回起動時に「不明な開発者」の警告が表示される場合があります: - -**推奨される解決方法**: -ターミナルで以下のコマンドを実行してください: -```bash -sudo xattr -dr com.apple.quarantine /Applications/CC\ Switch.app/ -``` - -**別の解決方法(システム設定から)**: -1. 警告ダイアログを閉じる -2. 「システム設定」→「プライバシーとセキュリティ」を開く -3. CC Switch に関する表示を見つけ、「このまま開く」をクリック -4. 再度アプリを開くと正常に使用可能 +CC Switch の macOS 版は Apple のコード署名と公証を受けています。追加の操作なしで直接インストールして開くことができます。 ## Linux diff --git a/docs/user-manual/ja/5-faq/5.2-questions.md b/docs/user-manual/ja/5-faq/5.2-questions.md index ccb76502..71eb74b4 100644 --- a/docs/user-manual/ja/5-faq/5.2-questions.md +++ b/docs/user-manual/ja/5-faq/5.2-questions.md @@ -2,23 +2,9 @@ ## インストールに関する問題 -### macOS で「不明な開発者」と表示される +### macOS のインストール -**問題**:初回起動時に「開けません。身元不明の開発者のものです」と表示される - -**解決方法 1**:システム設定から -1. 警告ダイアログを閉じる -2. 「システム設定」→「プライバシーとセキュリティ」を開く -3. CC Switch に関する表示を見つける -4. 「このまま開く」をクリック -5. 再度アプリを開く - -**解決方法 2**:ターミナルコマンドから(推奨) -```bash -sudo xattr -dr com.apple.quarantine /Applications/CC\ Switch.app/ -``` - -実行後、正常にアプリを開けるようになります。 +CC Switch の macOS 版は Apple のコード署名と公証を受けています。追加の操作なしで直接ダウンロードしてインストールできます。問題が発生した場合は、[Releases ページ](https://github.com/farion1231/cc-switch/releases) から最新版をダウンロードしてください。 ### Windows でインストール後に起動できない diff --git a/docs/user-manual/zh/1-getting-started/1.2-installation.md b/docs/user-manual/zh/1-getting-started/1.2-installation.md index fdda3c5e..e6917fa6 100644 --- a/docs/user-manual/zh/1-getting-started/1.2-installation.md +++ b/docs/user-manual/zh/1-getting-started/1.2-installation.md @@ -145,21 +145,9 @@ brew upgrade --cask cc-switch 2. 解压得到 `CC Switch.app` 3. 拖动到「应用程序」文件夹 -### 首次打开提示 +### 已签名并公证 -由于开发者没有 Apple 开发者账号,首次打开可能出现「未知开发者」警告: - -**推荐解决方法**: -打开终端执行以下命令: -```bash -sudo xattr -dr com.apple.quarantine /Applications/CC\ Switch.app/ -``` - -**备选解决方法(通过系统设置)**: -1. 关闭警告弹窗 -2. 打开「系统设置」→「隐私与安全性」 -3. 找到 CC Switch 相关提示,点击「仍要打开」 -4. 再次打开应用即可正常使用 +CC Switch macOS 版本已通过 Apple 代码签名和公证,可直接安装打开,无需额外操作。 ## Linux diff --git a/docs/user-manual/zh/5-faq/5.2-questions.md b/docs/user-manual/zh/5-faq/5.2-questions.md index 83084c97..150038af 100644 --- a/docs/user-manual/zh/5-faq/5.2-questions.md +++ b/docs/user-manual/zh/5-faq/5.2-questions.md @@ -2,23 +2,9 @@ ## 安装问题 -### macOS 提示「未知开发者」 +### macOS 安装 -**问题**:首次打开时提示「无法打开,因为它来自身份不明的开发者」 - -**解决方法一**:通过系统设置 -1. 关闭警告弹窗 -2. 打开「系统设置」→「隐私与安全性」 -3. 找到 CC Switch 相关提示 -4. 点击「仍要打开」 -5. 再次打开应用 - -**解决方法二**:通过终端命令(推荐) -```bash -sudo xattr -dr com.apple.quarantine /Applications/CC\ Switch.app/ -``` - -执行后即可正常打开应用。 +CC Switch macOS 版本已通过 Apple 代码签名和公证,可直接下载安装,无需额外操作。如遇问题,请尝试从 [Releases 页面](https://github.com/farion1231/cc-switch/releases) 下载最新版本。 ### Windows 安装后无法启动