# Guideline 4.8：要加 Apple 登入嗎？

> 若 App 提供 Google 或 Facebook 登入，就要加保護 Email 的同等登入方式，例如 Apple。附例外、Expo 程式碼與刪除帳號。

原始頁面：[Guideline 4.8：要加 Apple 登入嗎？](https://devoria.fr/zh-hant/blog/guideline-4-8-sign-in-with-apple)
作者：[Mehdi Azizi](https://devoria.fr/zh-hant/mehdi-azizi)
發布日期：2026-10-27
內容最後修訂：2026-10-27


只要你的 App 用 Google、Facebook 或其他第三方登入來建立主要帳號，guideline 4.8 就適用。這時它要求你再提供另一個同等的登入選項：資料只限姓名和 Email、可以隱藏 Email，而且未經同意不會為了廣告追蹤使用者。**從 2024 年 1 月起，這個選項不一定要是「Sign in with Apple」，但 Apple 在退件訊息裡點名的就是它。**

我自己的 App 中，Solys 和 Nolera 都提供 Apple、Google 和 Email 登入。這篇指南從 Apple 目前的條文出發，再示範我怎麼在串接 Supabase 的 Expo App 裡加入 Apple 登入，以及它對刪除帳號有什麼影響。如果你想看所有退件原因的總覽，請改讀 [Apple 為什麼退件你的 App](https://devoria.fr/zh-hant/blog/apple-app-rejection-reasons-real-cases)。

## Guideline 4.8 Login Services 說了什麼？

4.8 位於 [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#login-services) 的第 4 節「Design」。它針對使用「a third-party or social login service」來建立或驗證主要帳號的 App：Facebook Login、Google Sign-In、Log in with X、LinkedIn、Amazon 或 WeChat。這些 App 也必須「as an equivalent option」提供另一個符合三個條件的登入服務。

| Apple 的條件     | 白話來說                   |
| ---------------- | -------------------------- |
| 資料有限         | 只有姓名和 Email，沒有其他 |
| 可使用私密 Email | 使用者可以隱藏 Email       |
| 未經同意不做廣告 | 未經同意不做任何廣告追蹤   |

條文也定義了主要帳號：使用者在你的 App 裡建立、用來識別身分、登入並使用功能的帳號。依照這個定義，**只用來匯入檔案的 Google 按鈕不會建立主要帳號**。4.8 針對的是進入你 App 的那個畫面。

### 2024 年 1 月的改變

2024 年以前，規定要求用第三方登入建立主要帳號的 App 一定要提供「Sign in with Apple」。[2024 年 1 月 25 日](https://developer.apple.com/news/?id=f1v8pyay)，Apple 放寬了這點：你可以提供 Apple 登入，或其他同等、保護隱私的服務。很多網頁到現在還寫著相反的說法。[Expo 文件](https://docs.expo.dev/versions/latest/sdk/apple-authentication/)也還寫著有第三方登入的 App 必須提供 Apple 登入。

實際上，[Apple 開發者論壇](https://developer.apple.com/forums/thread/765145)上公開的 4.8 退件訊息結尾是：「Note that Sign in with Apple meets the requirements specified in guideline 4.8」。Apple 沒有點名任何其他符合規定的服務。**為了不跟審查員玩猜謎，我會直接加上 Apple 登入。**

## 條文列出的五個例外

Apple 列出五種不需要另一個登入選項的情況：

1. **你的 App 只使用自己的帳號系統**，例如 Email 加密碼，或寄到 Email 的驗證碼。
2. 你的 App 是另類 App 商店，或透過這類商店發行，並使用該商店專屬的登入。
3. 你的 App 屬於教育、企業或商務用途，且要求使用既有的學校或公司帳號。
4. 你的 App 使用政府或產業支持的電子身分系統。
5. 你的 App 是特定第三方服務的用戶端：使用者登入自己的信箱或社群網路，以存取自己的內容。

在看這些例外之前，先問自己：你的 App 需要帳號嗎？如果不需要，guideline 5.1.1(v) 要求讓它不登入也能使用，我在 [guideline 5.1.1 指南](https://devoria.fr/zh-hant/blog/guideline-5-1-1-app-store-rejection-fix)裡有說明。

| 你的登入畫面        | 適用 4.8 嗎？    |
| ------------------- | ---------------- |
| 沒有帳號            | 否               |
| 只有 Email 或驗證碼 | 否               |
| 只有 Google         | 是               |
| Google 和 Email     | 原則上是         |
| Google 和 Apple     | 是，而且符合規定 |
| 既有學校帳號        | 否               |
| Google 只用來匯入   | 否，沒有帳號     |

## 在 Expo App 加入「Sign in with Apple」

### 1. 安裝模組並宣告功能

```bash
npx expo install expo-apple-authentication
```

接著 Expo 文件要求在 App 設定中啟用這項功能：

```json
{
  "expo": {
    "ios": {
      "usesAppleSignIn": true,
      "infoPlist": { "CFBundleAllowMixedLocalizations": true }
    }
  }
}
```

第二行會讓按鈕以 iPhone 的語言顯示。用 EAS Build 時，這項功能會在建置時於你的 App ID 上啟用。**這是原生設定：它只會隨新的 build 生效，絕不會透過遠端更新帶上去。**

我在重看自己 kit 的起始程式碼時發現一個陷阱：這項功能需要簽署，即使只是在模擬器上執行 App 也一樣。在沒有「Apple Development」憑證的 Mac 上，本機編譯會失敗並顯示「No code signing certificates are available to use」。解法：只在驗證伺服器設定好之後才啟用 Apple 登入。

### 2. 顯示官方按鈕，跟 Google 一樣醒目

[Apple 的設計規範](https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple)講得很清楚：Apple 按鈕不能比其他登入按鈕小，也不能要捲動畫面才看得到。Expo 的元件會畫出官方按鈕，並使用 Apple 允許的標題。

```tsx
import * as AppleAuthentication from "expo-apple-authentication";
import { useEffect, useState } from "react";

export function BoutonApple({ onPress }: { onPress: () => void }) {
  const [disponible, setDisponible] = useState(false);

  useEffect(() => {
    AppleAuthentication.isAvailableAsync().then(setDisponible);
  }, []);

  // Android 和網頁：沒有 Apple 登入，就不顯示按鈕。
  if (!disponible) return null;

  return (
    <AppleAuthentication.AppleAuthenticationButton
      buttonType={AppleAuthentication.AppleAuthenticationButtonType.CONTINUE}
      buttonStyle={AppleAuthentication.AppleAuthenticationButtonStyle.BLACK}
      cornerRadius={12}
      style={{ width: "100%", height: 50 }}
      onPress={onPress}
    />
  );
}
```

Expo 特別說明，沒有寬度和高度時按鈕不會出現。顏色和圓角要透過 `buttonStyle` 和 `cornerRadius` 設定，不是透過 style。

### 3. 在 Supabase 建立工作階段

```ts
import * as AppleAuthentication from "expo-apple-authentication";
import { supabase } from "./supabase";

export async function connexionApple(): Promise<"ok" | "annule"> {
  try {
    const credential = await AppleAuthentication.signInAsync({
      requestedScopes: [
        AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
        AppleAuthentication.AppleAuthenticationScope.EMAIL,
      ],
    });
    if (!credential.identityToken) throw new Error("缺少 Apple 權杖");
    const { error } = await supabase.auth.signInWithIdToken({
      provider: "apple",
      token: credential.identityToken,
    });
    if (error) throw error;
    // 名字只會在第一次授權時傳來：馬上存起來。
    const prenom = credential.fullName?.givenName;
    if (prenom) await supabase.auth.updateUser({ data: { prenom } });
    return "ok";
  } catch (e) {
    if ((e as { code?: string }).code === "ERR_REQUEST_CANCELED")
      return "annule";
    throw e;
  }
}
```

有四個重點，出自 [Supabase 文件](https://supabase.com/docs/guides/auth/social-login/auth-apple)、Expo 文件和 Apple 的設計規範：

- **在 Supabase 中，把你的 bundle ID 填進** Apple 供應商的 Client IDs。純原生 App 登入不需要密鑰。如果你在 Expo Go 裡測試，也要加上 `host.exp.Exponent`。
- **名字和 Email 只會傳來一次。**之後的登入 Apple 不會再傳：第一次拿到就要存起來。
- **Email 可能是轉寄地址。**Apple 建議之後不要再要求使用者提供個人信箱。
- **取消不是錯誤。**在 Nolera 上，關掉 Apple 的面板不會跳出任何紅色訊息：那是使用者自己的選擇。

這是 Solys 在 2026 年 8 月的真實案例：App 裡有 Apple 和 Google 按鈕，但 Supabase 裡兩個供應商都沒啟用。程式碼沒問題，修正是在伺服器端完成的，不需要新的 build。**Apple 按鈕在審查員面前失敗，結果就是被退 2.1，而不是 4.8。**細節請看 [guideline 2.1 指南](https://devoria.fr/zh-hant/blog/app-store-guideline-2-1-rejection-fix)。

### 4. 在真的 iPhone 上測試

Expo 提醒，模擬器只能做有限的測試，而且在 Expo Go 拿到的識別碼和上架版 App 的不同。請在真的 iPhone 上，用 [TestFlight](https://devoria.fr/zh-hant/blog/testflight-test-iphone-app-before-review) build 測試登入、登出，再重新登入。

## Apple 登入與刪除帳號

Guideline 5.1.1(v) 要求在 App 內建立的帳號，必須能在 App 內刪除。使用 Apple 登入時，[Apple 關於刪除帳號的頁面](https://developer.apple.com/support/offering-account-deletion-in-your-app)多加了一個步驟：使用 Sign in with Apple 的 REST API [撤銷使用者的權杖](https://developer.apple.com/documentation/signinwithapplerestapi/revoke-tokens)。

撤銷需要兩樣東西：使用者的權杖（透過驗證授權碼取得），以及用你的 Sign in with Apple 私鑰簽署的 secret。**即使原生登入不需要密鑰，撤銷還是需要，而且它要留在你的伺服器上。**原因請看 [Expo App 的 API 密鑰](https://devoria.fr/zh-hant/blog/expo-api-key-security-supabase)。

在 Nolera 上，刪除帳號時 App 會再要求一次 Apple 登入，以取得新的授權碼。它把授權碼送到伺服器函式，由函式向 Apple 換取權杖後撤銷。如果使用者取消，會有清楚的訊息說明，而且什麼都不會被刪除。其餘流程，包括資料、訂閱和測試，請看 [iOS 刪除帳號](https://devoria.fr/zh-hant/blog/ios-app-account-deletion-test-before-apple-review)。

## 被退 4.8 後該怎麼回覆 Apple

Apple 的訊息給了兩條路。一是加上同等的選項。二是你的 App 已經有了：在 App Store Connect 回覆，說明是哪一個、為什麼它符合三個條件。Apple 也建議更新顯示登入畫面的截圖。[回覆 App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/) 的流程和其他規定一樣。

以下是英文範本，請自行調整（替換 build 編號）：

```text
Hello,

Thank you for your review.

Build X adds Sign in with Apple as an equivalent login option.
It appears on the same screen as Google Sign-In, with the same
size, and is visible without scrolling.

How to verify: launch the app, open the sign-in screen and
tap "Continue with Apple".

We also updated the screenshots that show the sign-in screen.

Best regards,
```

## 送審前的 4.8 檢查清單

- 你清楚自己的 App 是否需要帳號。不需要的話，就讓它不登入也能用。
- 如果是 Google、Facebook 或 X 建立帳號，Apple 登入要在同一個畫面上。
- Apple 按鈕是官方按鈕，跟其他按鈕一樣大，不用捲動就看得到。
- 伺服器端已啟用 Apple 供應商，並填好你的 bundle ID。
- 取消後會回到登入畫面，不顯示錯誤訊息。
- 第一次登入就存下名字和 Email。
- 刪除帳號時會從你的伺服器撤銷 Apple 權杖。
- 全部都在真的 iPhone 上測過，並使用從未登入過這個 App 的 Apple 帳號。
- 你的截圖呈現的登入畫面和送出的 build 一致。

## 重新送審前先修好退件問題

如果你的 App 剛因 4.8 被退件，[Apple Review Kit](https://devoria.fr/zh-hant/kits/app-review) 整理了我每次送審前會檢查的項目，還附兩個 skill，會在 Claude Code 裡檢查你的專案，並在 Apple 退件時幫你準備回覆。如果你想要有人幫你看，[跟我預約一小時](https://devoria.fr/zh-hant/coaching)：我們一起讀訊息、看你的登入畫面。被退件後的完整做法，請看 [App 被 Apple 退件](https://devoria.fr/zh-hant/expertise/app-rejected-by-apple)頁面。

如果你正在準備第一次上架，[做免費診斷](https://devoria.fr/zh-hant/diagnostic)：它會告訴你該先處理哪個步驟，並寄給你我的 Apple 防退件檢查清單。

沒有人能保證 Apple 一定會通過你的 App。但把 Apple 登入放在對的位置，至少能把這個退件原因從清單上刪掉。

## 常見問題

### iOS 一定要提供 Apple 登入嗎？

不是所有情況都要。只有當你的 App 提供第三方登入（例如 Google 或 Facebook）來建立主要帳號時才需要。從 2024 年 1 月起，可以用其他同等服務取代，但 Apple 只點名 Apple 登入符合規定。

### 「Guideline 4.8 - Design - Login Services」是什麼意思？

這是 Apple 退件訊息裡的標題。意思是你的 App 提供了第三方登入，卻沒有提供同等的選項：資料只限姓名和 Email、可以隱藏 Email、未經同意不用於廣告。

### 除了 Google，我的 Email 註冊就夠了嗎？

不一定。條文要求的服務要能讓使用者保持 Email 私密，但一般的註冊表單就是要你填 Email。Apple 沒有公開對這種情況的立場，退件訊息也只點名 Apple 登入。我不會冒這個險。

### Android 也要提供 Apple 登入嗎？

不用。4.8 是 App Store 的規定，而且 Expo 的模組只能在 iOS 上運作。在 Android 上，`isAvailableAsync()` 會回傳 false：Apple 按鈕不會顯示，可以只留 Google。

### 被退 4.8 之後需要新的 build 嗎？

大多數情況需要。Apple 登入需要原生功能，在建置時啟用。遠端更新無法加上它。唯一的例外：你的 App 原本就有符合規定的選項，只要在回覆中向 Apple 說明即可。


## 你的專案

[Apple Review Kit](https://devoria.fr/zh-hant/kits/app-review)：我使用的 App Store 審核檢查清單、我被 Apple 退件後的修正、給審核人員的備註，以及兩個審閱你 App 的 Claude Code skills。29 €。

[iOS Kit](https://devoria.fr/zh-hant/kits/ios)：用 Claude Code 打造你的 iPhone App：我的 App 所用的 Starter Code、檢查成果的 skills，以及 Apple Review Kit、App Store Screenshots Kit 與 ASO Kit。129.99 €。
