Guideline 4.8:要加 Apple 登入嗎?
作者:Mehdi Azizi
發布於 ,9 分鐘
若 App 提供 Google 或 Facebook 登入,就要加保護 Email 的同等登入方式,例如 Apple。附例外、Expo 程式碼與刪除帳號。
只要你的 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。
Guideline 4.8 Login Services 說了什麼?
4.8 位於 App Review Guidelines 的第 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 日,Apple 放寬了這點:你可以提供 Apple 登入,或其他同等、保護隱私的服務。很多網頁到現在還寫著相反的說法。Expo 文件也還寫著有第三方登入的 App 必須提供 Apple 登入。
實際上,Apple 開發者論壇上公開的 4.8 退件訊息結尾是:「Note that Sign in with Apple meets the requirements specified in guideline 4.8」。Apple 沒有點名任何其他符合規定的服務。為了不跟審查員玩猜謎,我會直接加上 Apple 登入。
條文列出的五個例外
Apple 列出五種不需要另一個登入選項的情況:
- 你的 App 只使用自己的帳號系統,例如 Email 加密碼,或寄到 Email 的驗證碼。
- 你的 App 是另類 App 商店,或透過這類商店發行,並使用該商店專屬的登入。
- 你的 App 屬於教育、企業或商務用途,且要求使用既有的學校或公司帳號。
- 你的 App 使用政府或產業支持的電子身分系統。
- 你的 App 是特定第三方服務的用戶端:使用者登入自己的信箱或社群網路,以存取自己的內容。
在看這些例外之前,先問自己:你的 App 需要帳號嗎?如果不需要,guideline 5.1.1(v) 要求讓它不登入也能使用,我在 guideline 5.1.1 指南裡有說明。
| 你的登入畫面 | 適用 4.8 嗎? |
|---|---|
| 沒有帳號 | 否 |
| 只有 Email 或驗證碼 | 否 |
| 只有 Google | 是 |
| Google 和 Email | 原則上是 |
| Google 和 Apple | 是,而且符合規定 |
| 既有學校帳號 | 否 |
| Google 只用來匯入 | 否,沒有帳號 |
在 Expo App 加入「Sign in with Apple」
1. 安裝模組並宣告功能
npx expo install expo-apple-authentication
接著 Expo 文件要求在 App 設定中啟用這項功能:
{
"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 的設計規範講得很清楚:Apple 按鈕不能比其他登入按鈕小,也不能要捲動畫面才看得到。Expo 的元件會畫出官方按鈕,並使用 Apple 允許的標題。
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 建立工作階段
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 文件、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 指南。
4. 在真的 iPhone 上測試
Expo 提醒,模擬器只能做有限的測試,而且在 Expo Go 拿到的識別碼和上架版 App 的不同。請在真的 iPhone 上,用 TestFlight build 測試登入、登出,再重新登入。
Apple 登入與刪除帳號
Guideline 5.1.1(v) 要求在 App 內建立的帳號,必須能在 App 內刪除。使用 Apple 登入時,Apple 關於刪除帳號的頁面多加了一個步驟:使用 Sign in with Apple 的 REST API 撤銷使用者的權杖。
撤銷需要兩樣東西:使用者的權杖(透過驗證授權碼取得),以及用你的 Sign in with Apple 私鑰簽署的 secret。**即使原生登入不需要密鑰,撤銷還是需要,而且它要留在你的伺服器上。**原因請看 Expo App 的 API 密鑰。
在 Nolera 上,刪除帳號時 App 會再要求一次 Apple 登入,以取得新的授權碼。它把授權碼送到伺服器函式,由函式向 Apple 換取權杖後撤銷。如果使用者取消,會有清楚的訊息說明,而且什麼都不會被刪除。其餘流程,包括資料、訂閱和測試,請看 iOS 刪除帳號。
被退 4.8 後該怎麼回覆 Apple
Apple 的訊息給了兩條路。一是加上同等的選項。二是你的 App 已經有了:在 App Store Connect 回覆,說明是哪一個、為什麼它符合三個條件。Apple 也建議更新顯示登入畫面的截圖。回覆 App Review 的流程和其他規定一樣。
以下是英文範本,請自行調整(替換 build 編號):
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 整理了我每次送審前會檢查的項目,還附兩個 skill,會在 Claude Code 裡檢查你的專案,並在 Apple 退件時幫你準備回覆。如果你想要有人幫你看,跟我預約一小時:我們一起讀訊息、看你的登入畫面。被退件後的完整做法,請看 App 被 Apple 退件頁面。
如果你正在準備第一次上架,做免費診斷:它會告訴你該先處理哪個步驟,並寄給你我的 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 說明即可。