Guideline 4.8 Login Services: ต้องมี Sign in with Apple ไหม
โดย Mehdi Azizi
เผยแพร่เมื่อ , 9 นาที
Guideline 4.8: ถ้าแอปของคุณมีล็อกอินด้วย Google หรือ Facebook ต้องเพิ่มการล็อกอินที่ปกป้องอีเมลแบบ Apple ด้วย พร้อมข้อยกเว้น โค้ด Expo และการลบบัญชี
Guideline 4.8 มีผลทันทีที่แอปของคุณใช้ Google, Facebook หรือการล็อกอินจากบริการภายนอกอื่นๆ เพื่อสร้างบัญชีหลัก เมื่อเป็นแบบนั้น คุณต้องมีตัวเลือกล็อกอินอีกแบบที่เทียบเท่ากัน ซึ่งจำกัดข้อมูลไว้แค่ชื่อและอีเมล ให้ผู้ใช้ซ่อนอีเมลได้ และไม่ติดตามผู้ใช้เพื่อโฆษณาหากไม่ได้รับความยินยอม ตั้งแต่มกราคม 2024 ตัวเลือกนี้ไม่จำเป็นต้องเป็น "Sign in with Apple" อีกต่อไป แต่ก็เป็นตัวเลือกเดียวที่ Apple เอ่ยถึงเองในข้อความปฏิเสธ
ในแอปของผม Solys และ Nolera มีให้ล็อกอินด้วย Apple, Google และอีเมล คู่มือนี้เริ่มจากข้อความปัจจุบันของ Apple จากนั้นจะแสดงว่าผมเพิ่มการล็อกอินด้วย Apple ในแอป Expo ที่เชื่อมกับ Supabase อย่างไร และมันส่งผลอะไรกับการลบบัญชี ถ้าอยากดูภาพรวมของเหตุผลที่ถูกปฏิเสธ ลองอ่าน ทำไม Apple ปฏิเสธแอป แทนครับ
Guideline 4.8 Login Services บอกว่าอะไร?
ข้อ 4.8 อยู่ในหมวด 4 "Design" ของ App Review Guidelines มุ่งไปที่แอปที่ใช้ "a third-party or social login service" เพื่อสร้างหรือยืนยันตัวตนบัญชีหลัก เช่น Facebook Login, Google Sign-In, Log in with X, LinkedIn, Amazon หรือ WeChat แอปเหล่านี้ต้องมีบริการล็อกอินอีกแบบ "as an equivalent option" ที่ผ่านเงื่อนไขสามข้อ
| เงื่อนไขของ Apple | พูดง่ายๆ |
|---|---|
| จำกัดข้อมูล | ชื่อและอีเมล ไม่มีอะไรมากกว่านั้น |
| ซ่อนอีเมลได้ | ผู้ใช้เลือกซ่อนอีเมลได้ |
| ไม่มีโฆษณาหากไม่ยินยอม | ไม่ติดตามเพื่อโฆษณาหากไม่ได้รับความยินยอม |
ข้อความนี้ยังนิยามบัญชีหลักไว้ด้วย คือบัญชีที่ผู้ใช้สร้างในแอปของคุณเพื่อระบุตัวตน ล็อกอิน และเข้าถึงฟีเจอร์ต่างๆ ตามนิยามนี้ ปุ่ม Google ที่ใช้แค่นำเข้าไฟล์ไม่ได้สร้างบัญชีหลัก ข้อ 4.8 มุ่งไปที่หน้าจอที่ผู้ใช้ใช้เข้าสู่แอปของคุณ
สิ่งที่เปลี่ยนไปในเดือนมกราคม 2024
ก่อนปี 2024 กฎนี้บังคับให้มี "Sign in with Apple" สำหรับแอปที่ใช้ล็อกอินจากบริการภายนอกกับบัญชีหลัก เมื่อวันที่ 25 มกราคม 2024 Apple ผ่อนปรนเรื่องนี้ คุณจะใส่การล็อกอินด้วย Apple หรือบริการอื่นที่เทียบเท่าและปกป้องความเป็นส่วนตัวก็ได้ หลายเว็บยังเขียนตรงกันข้ามอยู่ เอกสารของ Expo ก็ยังเขียนว่าแอปที่มีล็อกอินจากบริการภายนอกต้องมี Apple
ในทางปฏิบัติ ข้อความปฏิเสธ 4.8 ที่โพสต์ในฟอรัมนักพัฒนาของ Apple ลงท้ายว่า "Note that Sign in with Apple meets the requirements specified in guideline 4.8" Apple ไม่ได้ระบุบริการอื่นที่ผ่านเกณฑ์เลย เพื่อไม่ต้องมานั่งเดาใจ reviewer ผมเลยใส่การล็อกอินด้วย Apple ไว้เลย
ข้อยกเว้นห้าข้อที่ระบุไว้ในข้อความ
Apple ระบุห้ากรณีที่ไม่ต้องมีการล็อกอินแบบอื่น:
- แอปของคุณใช้แค่ระบบบัญชีของคุณเอง เช่น อีเมลกับรหัสผ่าน หรือโค้ดที่ส่งทางอีเมล
- แอปของคุณเป็นร้านแอปทางเลือก หรือเผยแพร่ผ่านร้านแอปทางเลือก โดยใช้ระบบล็อกอินเฉพาะของร้านนั้น
- แอปของคุณเป็นแอปการศึกษา องค์กร หรือธุรกิจ และต้องใช้บัญชีโรงเรียนหรือบริษัทที่มีอยู่แล้ว
- แอปของคุณใช้ระบบยืนยันตัวตนอิเล็กทรอนิกส์ที่รัฐหรือภาคอุตสาหกรรมรองรับ
- แอปของคุณเป็นไคลเอนต์ของบริการภายนอกที่เจาะจง ผู้ใช้ล็อกอินเข้าอีเมลหรือโซเชียลมีเดียของตัวเองเพื่อเข้าถึงคอนเทนต์ของตัวเอง
ก่อนจะดูข้อยกเว้นพวกนี้ ลองถามตัวเองก่อน: แอปของคุณจำเป็นต้องมีบัญชีไหม? ถ้าไม่จำเป็น guideline 5.1.1(v) กำหนดให้แอปใช้งานได้โดยไม่ต้องล็อกอิน ตามที่ผมอธิบายไว้ในคู่มือ guideline 5.1.1
| หน้าจอล็อกอินของคุณ | ข้อ 4.8 มีผลไหม? |
|---|---|
| ไม่มีบัญชี | ไม่ |
| อีเมลหรือโค้ดเท่านั้น | ไม่ |
| Google อย่างเดียว | ใช่ |
| Google และอีเมล | ใช่ โดยหลักการ |
| Google และ Apple | ใช่ และผ่านเกณฑ์ |
| บัญชีโรงเรียนที่มีอยู่แล้ว | ไม่ |
| Google เพื่อนำเข้าไฟล์ | ไม่ เพราะไม่มีบัญชี |
เพิ่ม "Sign in with Apple" ในแอป Expo
1. ติดตั้งโมดูลและประกาศ capability
npx expo install expo-apple-authentication
จากนั้นเอกสารของ Expo ให้เปิด capability ในการตั้งค่าแอป:
{
"expo": {
"ios": {
"usesAppleSignIn": true,
"infoPlist": { "CFBundleAllowMixedLocalizations": true }
}
}
}
บรรทัดที่สองทำให้ปุ่มแสดงเป็นภาษาของ iPhone ถ้าใช้ EAS Build ตัว capability จะถูกเปิดบน identifier ของแอปตอน build นี่เป็นการตั้งค่าแบบ native มันไปกับ build ใหม่เท่านั้น ไม่มีทางไปกับอัปเดตแบบ remote
กับดักที่ผมเจอตอนอ่านโค้ดตั้งต้นของ kit ตัวเองซ้ำ: capability นี้บังคับให้ต้อง sign แอป แม้แค่จะรันบน simulator บน Mac ที่ไม่มีใบรับรอง "Apple Development" การคอมไพล์ในเครื่องล้มเหลวพร้อมข้อความ "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. เปิด session ใน 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 identifier ของคุณ ใน Client IDs ของผู้ให้บริการ Apple แอปที่เป็น native ล้วนไม่ต้องใช้ secret key ในการล็อกอิน ให้เพิ่ม
host.exp.Exponentถ้าคุณทดสอบใน Expo Go - ชื่อและอีเมลจะมาแค่ครั้งเดียว Apple จะไม่ส่งกลับมาอีกในการล็อกอินครั้งถัดไป ให้บันทึกไว้ตั้งแต่ได้รับครั้งแรก
- อีเมลอาจเป็นที่อยู่แบบ relay Apple แนะนำว่าไม่ควรขออีเมลส่วนตัวซ้ำภายหลัง
- การยกเลิกไม่ใช่ error ใน Nolera การปิดหน้าต่าง Apple จะไม่มีข้อความสีแดงขึ้นมา เพราะผู้ใช้ตั้งใจทำเอง
เคสที่ผมเจอจริงกับ Solys เมื่อสิงหาคม 2026: ปุ่ม Apple และ Google อยู่ในแอปแล้ว แต่ไม่ได้เปิดผู้ให้บริการทั้งสองใน Supabase เลย โค้ดถูกต้อง การแก้ไขทำฝั่งเซิร์ฟเวอร์ ไม่ต้อง build ใหม่ ปุ่ม Apple ที่ล้มเหลวต่อหน้า reviewer จะกลายเป็นการปฏิเสธ 2.1 แทนการปฏิเสธ 4.8 รายละเอียดอยู่ในคู่มือ guideline 2.1
4. ทดสอบบน iPhone จริง
Expo เตือนว่า simulator ทดสอบได้แค่บางส่วน และ identifier ที่ได้ใน Expo Go ต่างจากของแอปที่เผยแพร่จริง ให้ทดสอบการล็อกอิน ล็อกเอาต์ แล้วล็อกอินใหม่บน iPhone จริง ด้วย build จาก TestFlight
การล็อกอินด้วย Apple กับการลบบัญชี
Guideline 5.1.1(v) กำหนดให้บัญชีที่สร้างในแอปต้องลบได้จากในแอป สำหรับการล็อกอินด้วย Apple หน้าของ Apple เรื่องการลบบัญชี เพิ่มอีกขั้นหนึ่ง คือใช้ REST API ของ Sign in with Apple เพื่อเพิกถอนโทเค็นของผู้ใช้
การเพิกถอนนี้ต้องใช้สองอย่าง: โทเค็นของผู้ใช้ ซึ่งได้มาจากการ validate authorization code และ secret ที่เซ็นด้วย private key ของ Sign in with Apple ของคุณ ถึงการล็อกอินแบบ native จะไม่ต้องใช้ secret key แต่การเพิกถอนต้องใช้ และ key นั้นต้องอยู่บนเซิร์ฟเวอร์ของคุณเท่านั้น เหตุผลอยู่ในคีย์ API ลับในแอป Expo
ใน Nolera ตอนลบบัญชี แอปจะขอให้ล็อกอินด้วย Apple อีกครั้งเพื่อรับ authorization code ใหม่ แล้วส่งไปยังฟังก์ชันบนเซิร์ฟเวอร์ ซึ่งจะนำไปแลกกับ Apple แล้วเพิกถอนโทเค็น ถ้าผู้ใช้ยกเลิก จะมีข้อความบอกชัดเจนและไม่มีอะไรถูกลบ ขั้นตอนที่เหลือ รวมถึงข้อมูล การสมัครสมาชิก และการทดสอบ อยู่ในการลบบัญชีบน iOS
ตอบ Apple อย่างไรหลังโดนปฏิเสธ 4.8
ข้อความของ Apple เสนอทางออกไว้สองทาง ทางแรกคือเพิ่มตัวเลือกที่เทียบเท่า ทางที่สองคือถ้าแอปมีอยู่แล้ว ให้ตอบใน 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 ก่อนส่งแอป
- คุณรู้แล้วว่าแอปต้องมีบัญชีไหม ถ้าไม่ต้อง แอปก็ใช้งานได้โดยไม่ต้องล็อกอิน
- ถ้า Google, Facebook หรือ X ใช้สร้างบัญชี การล็อกอินด้วย Apple ต้องอยู่บนหน้าจอเดียวกัน
- ปุ่ม Apple เป็นปุ่มทางการ ใหญ่เท่าปุ่มอื่น มองเห็นได้โดยไม่ต้องเลื่อน
- เปิดผู้ให้บริการ Apple ฝั่งเซิร์ฟเวอร์แล้ว พร้อม bundle identifier ของคุณ
- การยกเลิกพากลับไปหน้าล็อกอิน โดยไม่มีข้อความ error
- บันทึกชื่อและอีเมลตั้งแต่การล็อกอินครั้งแรก
- การลบบัญชีเพิกถอนโทเค็น Apple จากเซิร์ฟเวอร์ของคุณ
- ทดสอบทุกอย่างบน iPhone จริง ด้วยบัญชี Apple ที่ไม่เคยล็อกอินเข้าแอปมาก่อน
- ภาพหน้าจอแสดงหน้าล็อกอินตรงตามที่อยู่ใน build ที่ส่ง
แก้ปัญหาการปฏิเสธก่อนส่งแอปใหม่
ถ้าแอปของคุณเพิ่งโดนปฏิเสธด้วยข้อ 4.8 Apple Review Kit รวมทุกอย่างที่ผมตรวจก่อนส่งแอปทุกครั้ง พร้อม skill สองตัวที่ตรวจโปรเจกต์ของคุณใน Claude Code และเตรียมคำตอบให้ถ้า Apple ปฏิเสธ ถ้าอยากได้คนช่วยดู จองเวลาหนึ่งชั่วโมงกับผม เราจะอ่านข้อความด้วยกันและดูหน้าล็อกอินของคุณ ขั้นตอนทั้งหมดหลังโดนปฏิเสธอยู่ในหน้าแอปโดน Apple ปฏิเสธ
ถ้าคุณกำลังเตรียมปล่อยแอปแรก ทำแบบประเมินฟรี มันจะบอกว่าควรเริ่มที่ขั้นตอนไหนก่อน และส่งเช็กลิสต์กันโดน Apple ปฏิเสธของผมให้คุณ
ไม่มีใครรับประกันได้ว่า Apple จะอนุมัติแอปของคุณ แต่การใส่การล็อกอินด้วย Apple ให้ถูกที่ อย่างน้อยก็ตัดเหตุผลข้อนี้ออกไปได้
คำถามที่พบบ่อย
การล็อกอินด้วย Apple บังคับบน iOS ไหม?
ไม่ได้บังคับทุกกรณี จะต้องมีก็ต่อเมื่อแอปของคุณมีล็อกอินจากบริการภายนอก เช่น Google หรือ Facebook เพื่อสร้างบัญชีหลัก ตั้งแต่มกราคม 2024 ใช้บริการอื่นที่เทียบเท่าแทนได้ แต่ Apple ระบุแค่การล็อกอินด้วย Apple ว่าผ่านเกณฑ์
"Guideline 4.8 - Design - Login Services" หมายความว่าอะไร?
เป็นหัวข้อการปฏิเสธในข้อความของ Apple หมายความว่าแอปของคุณมีล็อกอินจากบริการภายนอก แต่ไม่มีตัวเลือกที่เทียบเท่าซึ่งจำกัดข้อมูลไว้แค่ชื่อและอีเมล ให้ซ่อนอีเมลได้ และไม่ใช้เพื่อโฆษณาหากไม่ได้รับความยินยอม
การสมัครด้วยอีเมลคู่กับ Google เพียงพอไหม?
ไม่รับประกัน ข้อความกำหนดให้มีบริการที่ให้เก็บอีเมลเป็นส่วนตัวได้ แต่ฟอร์มทั่วไปจะขออีเมล Apple ยังไม่ได้ประกาศจุดยืนเรื่องนี้ และข้อความปฏิเสธก็ระบุแค่การล็อกอินด้วย Apple ผมจะไม่เสี่ยงครับ
ต้องมีการล็อกอินด้วย Apple บน Android ไหม?
ไม่ต้อง ข้อ 4.8 เป็นกฎของ App Store และโมดูลของ Expo ทำงานบน iOS เท่านั้น บน Android isAvailableAsync() จะคืนค่า false ปุ่ม Apple จะไม่แสดง และมีแค่ Google อย่างเดียวได้
ต้อง build ใหม่หลังโดนปฏิเสธ 4.8 ไหม?
ใช่ ในกรณีส่วนใหญ่ การล็อกอินด้วย Apple ต้องใช้ capability แบบ native ที่เปิดตอน build อัปเดตแบบ remote เพิ่มให้ไม่ได้ ข้อยกเว้นเดียวคือแอปของคุณมีตัวเลือกที่ผ่านเกณฑ์อยู่แล้ว และแค่อธิบายให้ Apple ฟังในคำตอบก็พอ