# Guideline 4.8 Login Services: ต้องมี Sign in with Apple ไหม

> Guideline 4.8: ถ้าแอปของคุณมีล็อกอินด้วย Google หรือ Facebook ต้องเพิ่มการล็อกอินที่ปกป้องอีเมลแบบ Apple ด้วย พร้อมข้อยกเว้น โค้ด Expo และการลบบัญชี

หน้าต้นฉบับ: [Guideline 4.8 Login Services: ต้องมี Sign in with Apple ไหม](https://devoria.fr/th/blog/guideline-4-8-login-services-sign-in-with-apple)
ผู้เขียน: [Mehdi Azizi](https://devoria.fr/th/mehdi-azizi)
เผยแพร่: 2026-10-27
แก้ไขเนื้อหาล่าสุด: 2026-10-27


Guideline 4.8 มีผลทันทีที่แอปของคุณใช้ Google, Facebook หรือการล็อกอินจากบริการภายนอกอื่นๆ เพื่อสร้างบัญชีหลัก เมื่อเป็นแบบนั้น คุณต้องมีตัวเลือกล็อกอินอีกแบบที่เทียบเท่ากัน ซึ่งจำกัดข้อมูลไว้แค่ชื่อและอีเมล ให้ผู้ใช้ซ่อนอีเมลได้ และไม่ติดตามผู้ใช้เพื่อโฆษณาหากไม่ได้รับความยินยอม **ตั้งแต่มกราคม 2024 ตัวเลือกนี้ไม่จำเป็นต้องเป็น "Sign in with Apple" อีกต่อไป แต่ก็เป็นตัวเลือกเดียวที่ Apple เอ่ยถึงเองในข้อความปฏิเสธ**

ในแอปของผม Solys และ Nolera มีให้ล็อกอินด้วย Apple, Google และอีเมล คู่มือนี้เริ่มจากข้อความปัจจุบันของ Apple จากนั้นจะแสดงว่าผมเพิ่มการล็อกอินด้วย Apple ในแอป Expo ที่เชื่อมกับ Supabase อย่างไร และมันส่งผลอะไรกับการลบบัญชี ถ้าอยากดูภาพรวมของเหตุผลที่ถูกปฏิเสธ ลองอ่าน [ทำไม Apple ปฏิเสธแอป](https://devoria.fr/th/blog/apple-app-rejection-reasons-real-cases) แทนครับ

## Guideline 4.8 Login Services บอกว่าอะไร?

ข้อ 4.8 อยู่ในหมวด 4 "Design" ของ [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#login-services) มุ่งไปที่แอปที่ใช้ "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](https://developer.apple.com/news/?id=f1v8pyay) Apple ผ่อนปรนเรื่องนี้ คุณจะใส่การล็อกอินด้วย Apple หรือบริการอื่นที่เทียบเท่าและปกป้องความเป็นส่วนตัวก็ได้ หลายเว็บยังเขียนตรงกันข้ามอยู่ [เอกสารของ Expo](https://docs.expo.dev/versions/latest/sdk/apple-authentication/) ก็ยังเขียนว่าแอปที่มีล็อกอินจากบริการภายนอกต้องมี Apple

ในทางปฏิบัติ ข้อความปฏิเสธ 4.8 ที่โพสต์ใน[ฟอรัมนักพัฒนาของ Apple](https://developer.apple.com/forums/thread/765145) ลงท้ายว่า "Note that Sign in with Apple meets the requirements specified in guideline 4.8" Apple ไม่ได้ระบุบริการอื่นที่ผ่านเกณฑ์เลย **เพื่อไม่ต้องมานั่งเดาใจ reviewer ผมเลยใส่การล็อกอินด้วย Apple ไว้เลย**

## ข้อยกเว้นห้าข้อที่ระบุไว้ในข้อความ

Apple ระบุห้ากรณีที่ไม่ต้องมีการล็อกอินแบบอื่น:

1. **แอปของคุณใช้แค่ระบบบัญชีของคุณเอง** เช่น อีเมลกับรหัสผ่าน หรือโค้ดที่ส่งทางอีเมล
2. แอปของคุณเป็นร้านแอปทางเลือก หรือเผยแพร่ผ่านร้านแอปทางเลือก โดยใช้ระบบล็อกอินเฉพาะของร้านนั้น
3. แอปของคุณเป็นแอปการศึกษา องค์กร หรือธุรกิจ และต้องใช้บัญชีโรงเรียนหรือบริษัทที่มีอยู่แล้ว
4. แอปของคุณใช้ระบบยืนยันตัวตนอิเล็กทรอนิกส์ที่รัฐหรือภาคอุตสาหกรรมรองรับ
5. แอปของคุณเป็นไคลเอนต์ของบริการภายนอกที่เจาะจง ผู้ใช้ล็อกอินเข้าอีเมลหรือโซเชียลมีเดียของตัวเองเพื่อเข้าถึงคอนเทนต์ของตัวเอง

ก่อนจะดูข้อยกเว้นพวกนี้ ลองถามตัวเองก่อน: แอปของคุณจำเป็นต้องมีบัญชีไหม? ถ้าไม่จำเป็น guideline 5.1.1(v) กำหนดให้แอปใช้งานได้โดยไม่ต้องล็อกอิน ตามที่ผมอธิบายไว้ใน[คู่มือ guideline 5.1.1](https://devoria.fr/th/blog/guideline-5-1-1-app-store-rejection-fix)

| หน้าจอล็อกอินของคุณ        | ข้อ 4.8 มีผลไหม?    |
| -------------------------- | ------------------- |
| ไม่มีบัญชี                 | ไม่                 |
| อีเมลหรือโค้ดเท่านั้น      | ไม่                 |
| Google อย่างเดียว          | ใช่                 |
| Google และอีเมล            | ใช่ โดยหลักการ      |
| Google และ Apple           | ใช่ และผ่านเกณฑ์    |
| บัญชีโรงเรียนที่มีอยู่แล้ว | ไม่                 |
| Google เพื่อนำเข้าไฟล์     | ไม่ เพราะไม่มีบัญชี |

## เพิ่ม "Sign in with Apple" ในแอป Expo

### 1. ติดตั้งโมดูลและประกาศ capability

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

จากนั้นเอกสารของ Expo ให้เปิด capability ในการตั้งค่าแอป:

```json
{
  "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](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. เปิด session ใน 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 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](https://devoria.fr/th/blog/guideline-2-1-app-store-rejection-fix)

### 4. ทดสอบบน iPhone จริง

Expo เตือนว่า simulator ทดสอบได้แค่บางส่วน และ identifier ที่ได้ใน Expo Go ต่างจากของแอปที่เผยแพร่จริง ให้ทดสอบการล็อกอิน ล็อกเอาต์ แล้วล็อกอินใหม่บน iPhone จริง ด้วย build จาก [TestFlight](https://devoria.fr/th/blog/testflight-test-iphone-app-before-app-store)

## การล็อกอินด้วย Apple กับการลบบัญชี

Guideline 5.1.1(v) กำหนดให้บัญชีที่สร้างในแอปต้องลบได้จากในแอป สำหรับการล็อกอินด้วย Apple [หน้าของ Apple เรื่องการลบบัญชี](https://developer.apple.com/support/offering-account-deletion-in-your-app) เพิ่มอีกขั้นหนึ่ง คือใช้ REST API ของ Sign in with Apple เพื่อ[เพิกถอนโทเค็น](https://developer.apple.com/documentation/signinwithapplerestapi/revoke-tokens)ของผู้ใช้

การเพิกถอนนี้ต้องใช้สองอย่าง: โทเค็นของผู้ใช้ ซึ่งได้มาจากการ validate authorization code และ secret ที่เซ็นด้วย private key ของ Sign in with Apple ของคุณ **ถึงการล็อกอินแบบ native จะไม่ต้องใช้ secret key แต่การเพิกถอนต้องใช้ และ key นั้นต้องอยู่บนเซิร์ฟเวอร์ของคุณเท่านั้น** เหตุผลอยู่ใน[คีย์ API ลับในแอป Expo](https://devoria.fr/th/blog/secret-api-key-expo-app)

ใน Nolera ตอนลบบัญชี แอปจะขอให้ล็อกอินด้วย Apple อีกครั้งเพื่อรับ authorization code ใหม่ แล้วส่งไปยังฟังก์ชันบนเซิร์ฟเวอร์ ซึ่งจะนำไปแลกกับ Apple แล้วเพิกถอนโทเค็น ถ้าผู้ใช้ยกเลิก จะมีข้อความบอกชัดเจนและไม่มีอะไรถูกลบ ขั้นตอนที่เหลือ รวมถึงข้อมูล การสมัครสมาชิก และการทดสอบ อยู่ใน[การลบบัญชีบน iOS](https://devoria.fr/th/blog/ios-account-deletion-test-before-app-review)

## ตอบ Apple อย่างไรหลังโดนปฏิเสธ 4.8

ข้อความของ Apple เสนอทางออกไว้สองทาง ทางแรกคือเพิ่มตัวเลือกที่เทียบเท่า ทางที่สองคือถ้าแอปมีอยู่แล้ว ให้ตอบใน 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 ก่อนส่งแอป

- คุณรู้แล้วว่าแอปต้องมีบัญชีไหม ถ้าไม่ต้อง แอปก็ใช้งานได้โดยไม่ต้องล็อกอิน
- ถ้า Google, Facebook หรือ X ใช้สร้างบัญชี การล็อกอินด้วย Apple ต้องอยู่บนหน้าจอเดียวกัน
- ปุ่ม Apple เป็นปุ่มทางการ ใหญ่เท่าปุ่มอื่น มองเห็นได้โดยไม่ต้องเลื่อน
- เปิดผู้ให้บริการ Apple ฝั่งเซิร์ฟเวอร์แล้ว พร้อม bundle identifier ของคุณ
- การยกเลิกพากลับไปหน้าล็อกอิน โดยไม่มีข้อความ error
- บันทึกชื่อและอีเมลตั้งแต่การล็อกอินครั้งแรก
- การลบบัญชีเพิกถอนโทเค็น Apple จากเซิร์ฟเวอร์ของคุณ
- ทดสอบทุกอย่างบน iPhone จริง ด้วยบัญชี Apple ที่ไม่เคยล็อกอินเข้าแอปมาก่อน
- ภาพหน้าจอแสดงหน้าล็อกอินตรงตามที่อยู่ใน build ที่ส่ง

## แก้ปัญหาการปฏิเสธก่อนส่งแอปใหม่

ถ้าแอปของคุณเพิ่งโดนปฏิเสธด้วยข้อ 4.8 [Apple Review Kit](https://devoria.fr/th/kits/app-review) รวมทุกอย่างที่ผมตรวจก่อนส่งแอปทุกครั้ง พร้อม skill สองตัวที่ตรวจโปรเจกต์ของคุณใน Claude Code และเตรียมคำตอบให้ถ้า Apple ปฏิเสธ ถ้าอยากได้คนช่วยดู [จองเวลาหนึ่งชั่วโมงกับผม](https://devoria.fr/th/coaching) เราจะอ่านข้อความด้วยกันและดูหน้าล็อกอินของคุณ ขั้นตอนทั้งหมดหลังโดนปฏิเสธอยู่ในหน้า[แอปโดน Apple ปฏิเสธ](https://devoria.fr/th/expertise/app-rejected-by-apple)

ถ้าคุณกำลังเตรียมปล่อยแอปแรก [ทำแบบประเมินฟรี](https://devoria.fr/th/diagnostic) มันจะบอกว่าควรเริ่มที่ขั้นตอนไหนก่อน และส่งเช็กลิสต์กันโดน 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 ฟังในคำตอบก็พอ


## โปรเจกต์ของคุณ

[Apple Review Kit](https://devoria.fr/th/kits/app-review): เช็กลิสต์รีวิว App Store ที่ผมใช้ การปฏิเสธจาก Apple ที่ผมแก้แล้ว บันทึกถึงผู้ตรวจ และสอง skills ของ Claude Code ที่ตรวจแอปคุณ 29 €

[iOS Kit](https://devoria.fr/th/kits/ios): สร้างแอป iPhone ด้วย Claude Code: Starter Code ของแอปผม skills ที่ตรวจงาน และคิต Apple Review, Screenshots และ ASO 129,99 €
