Guideline 2.5.1: API สาธารณะและ SDK ล่าสุดกับ Expo
โดย Mehdi Azizi
เผยแพร่เมื่อ , 9 นาที
Guideline 2.5.1 กำหนดให้ใช้แค่ API สาธารณะ แอปต้องรันบน iOS ปัจจุบันได้ และใช้เฟรมเวิร์กตามจุดประสงค์ ถ้าใช้ Expo ให้ตรวจโมดูลเนทีฟก่อน
Guideline 2.5.1 มีข้อกำหนดสี่ข้อ คือใช้แค่ API สาธารณะ รันบน iOS เวอร์ชันปัจจุบันได้ เลิกใช้สิ่งที่ Apple ประกาศ deprecated และใช้แต่ละเฟรมเวิร์กตามจุดประสงค์ของมัน ถ้าคุณใช้ Expo ความเสี่ยงแทบไม่เคยมาจากโค้ด JavaScript ของคุณ แต่มาจากโมดูลเนทีฟที่คุณติดตั้งและ SDK ที่คุณใช้คอมไพล์
ผมเผยแพร่ Solys, TradaZen และ Nolera ด้วย Expo SDK 57 ซึ่ง Solys ใช้ Screen Time API ของ Apple เป็นเฟรมเวิร์กที่ Apple ควบคุมการใช้งาน คู่มือนี้พูดถึงกฎของการรีวิว ถ้าคุณเจอ error ตอนส่ง build ให้อ่านคู่มือ ITMS-90338 ส่วนเรื่องโหมดทำงานเบื้องหลัง ซึ่งอยู่ในหมวดเดียวกัน ให้อ่านคู่มือ guideline 2.5.4
Guideline 2.5.1 ว่าไว้อย่างไร?
กฎนี้อยู่ในหมวด 2.5 "Software Requirements" ของ App Review Guidelines: "Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description."
พูดง่าย ๆ คือมีข้อบังคับสี่ข้อ:
- ใช้แค่ API สาธารณะ คือ API ที่ Apple มีเอกสารรองรับ
- แอปต้องรันบน iOS เวอร์ชันปัจจุบันได้ ซึ่งคือ iOS 27 ตั้งแต่เดือนกันยายน 2026
- ห้ามมีของ deprecated ที่กำลังจะหายไป คุณต้องเปลี่ยนสิ่งที่ Apple ประกาศว่าจะเลิกรองรับ
- ใช้แต่ละเฟรมเวิร์กให้ถูกที่ และระบุไว้ในคำอธิบายแอป HomeKit สำหรับบ้านอัจฉริยะ HealthKit สำหรับสุขภาพและการออกกำลังกาย โดยเชื่อมกับแอป Health
นี่คือที่มาของหัวข้อการปฏิเสธ: "Guideline 2.5.1 - Performance - Software Requirements"
API สาธารณะ: ความเสี่ยงซ่อนอยู่ตรงไหนในแอป Expo
API ส่วนตัว (private API) คือฟังก์ชันของระบบที่ Apple ไม่ได้ทำเอกสารไว้ Apple ไม่รับประกันทั้งพฤติกรรมของมันและไม่รับประกันว่ามันจะยังอยู่ใน iOS เวอร์ชันถัดไป จึงห้ามใช้
โค้ด JavaScript ของคุณไม่เคยแตะ iOS โดยตรง มันต้องผ่านโมดูลเนทีฟ โมดูลใน Expo SDK ดูแลโดยทีม Expo ส่วนโมดูลอื่น ๆ พกโค้ดที่คุณไม่ได้เขียนมาด้วย และ Apple ตรวจโค้ดนั้นเหมือนเป็นโค้ดของคุณ คู่มือ ITMS-90683 แสดงกลไกเดียวกันกับข้อความขอสิทธิ์: Apple ตัดสินจากโค้ดที่อยู่ใน build ไม่ใช่จากสิ่งที่แอปทำ
ใน Solys ณ วันที่ 15 ตุลาคม 2026 มี dependency โดยตรง 42 ตัวที่มีโค้ด iOS เนทีฟ ในจำนวนนี้ 14 ตัวอยู่นอก Expo SDK เช่น RevenueCat, Sentry, AppsFlyer และ react-native-device-activity ซึ่งเป็นสะพานไปยัง Screen Time API
API ส่วนตัวถูกตรวจเจอได้สองจังหวะ ตอนส่ง build การวิเคราะห์อัตโนมัติของ App Store Connect อาจส่ง error ITMS-90338 กลับมา ส่วนระหว่างรีวิว reviewer จะอ้าง 2.5.1
API ที่ deprecated: จาก UIWebView ถึง UIScene
ตัวอย่างที่ดังที่สุดคือ UIWebView คอมโพเนนต์เก่าสำหรับแสดงเว็บ Apple หยุดรับ ในแอปใหม่ตั้งแต่เมษายน 2020 และในอัปเดตตั้งแต่ธันวาคม 2020 ไลบรารีเก่าที่ยังอ้างถึงมันจะทำให้ส่ง build ไม่ผ่าน ใน Solys การค้นหาตามเช็กลิสต์ด้านล่างไม่เจอการอ้างอิงเลย
การเปลี่ยนแปลงครั้งถัดไปประกาศไว้แล้ว Technote TN3187 ของ Apple เขียนว่า: "In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch." แปลว่าแอปที่คอมไพล์ด้วย SDK ของ iOS 27 โดยไม่มี lifecycle แบบ scene จะเปิดไม่ขึ้น
มีสามวันที่ที่ต้องเชื่อมโยงกัน:
- ตั้งแต่เมษายน 2026 Apple บังคับใช้ Xcode 26 ซึ่งเป็นหัวข้อของคู่มือ ITMS-90725
- เมษายน 2027 หน้าการส่งแอปของ Apple ประกาศว่าจะบังคับใช้ SDK ของ iOS 27
- Expo SDK 58 ซึ่งเป็นเบต้าตั้งแต่ 15 กันยายน 2026 สร้างการจัดการ scene ให้แล้ว ตามประกาศของ Expo
ถ้าใช้ Expo SDK 57 กับ Xcode 26 คุณยังคอมไพล์ด้วย SDK ของ iOS 26 อยู่ วันนี้จึงยังไม่มีอะไรพัง แต่โมดูลที่แก้ไข AppDelegate ต้องปรับตามให้ทันก่อนเมษายน 2027
เฟรมเวิร์กที่ถูกใช้นอกจุดประสงค์
Reviewer จะตรวจว่าเฟรมเวิร์กที่อ่อนไหวถูกใช้กับฟีเจอร์ที่มองเห็นได้จริง และหน้าแอปของคุณพูดถึงมัน
- HealthKit ใช้สำหรับสุขภาพและการออกกำลังกาย แนวทางการออกแบบอินเทอร์เฟซของ Apple ระบุว่า: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- HomeKit ใช้สำหรับบ้านอัจฉริยะเท่านั้น
- PushKit ใช้สำหรับการโทรผ่าน VoIP เอกสาร PushKit เขียนไว้ชัดว่า: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." การใช้ VoIP notification ปลุกแอปโดยไม่มีการโทรถือเป็นการใช้ผิดวัตถุประสงค์
- Family Controls หรือ Screen Time API ต้องขอสิทธิ์พิเศษ เอกสารของมัน ระบุว่า: "Before submitting your app to the App Store, you must request permission to use the entitlement."
สำหรับ Solys ผมขอสิทธิ์สำหรับการเผยแพร่นี้เมื่อ 23 กันยายน 2026 และ Apple อนุมัติในวันเดียวกัน การใช้งานตรงกับเฟรมเวิร์ก: ผู้ใช้เลือกแอปที่จะพักไว้ แล้ว Solys บล็อกแอปเหล่านั้น 30, 45 หรือ 60 นาทีหลังตื่นนอน คำอธิบายในหน้าแอประบุไว้ในประโยคเดียวว่า "Solys ใช้สิทธิ์ Screen Time ของ Apple เพื่อพักแอปที่เลือกไว้" นี่คือสิ่งที่ท้ายข้อ 2.5.1 ต้องการ: ระบุการเชื่อมต่อไว้ในคำอธิบาย
เวอร์ชันเบต้า: TestFlight ได้ App Store ไม่ได้
Release notes ของ App Store Connect แสดงให้เห็นกฎนี้ในทางปฏิบัติ วันที่ 14 ตุลาคม 2026 build ที่สร้างด้วย Xcode 27.2 beta 3 ได้รับ "for internal and external testing" คือสำหรับ TestFlight ส่วนวันที่ 5 ตุลาคม build จาก Xcode 27.1 RC ได้รับ "for the App Store"
build ที่คอมไพล์ด้วย Xcode เบต้าไปได้แค่ TestFlight ไม่มีทางเข้ารีวิว ถ้าจะส่งรีวิว คุณต้องใช้เวอร์ชันจริง หรือ RC ที่ Apple เปิดให้ใช้กับ App Store แล้ว
สองข้อควรรู้สำหรับแอป Expo:
- เบต้าของ Expo ไม่ใช่เบต้าของ Apple Apple ตรวจเวอร์ชันของ Xcode และ iOS SDK ไม่ได้ตรวจเวอร์ชันของ Expo ประกาศ SDK 58 ยังบอกด้วยว่า EAS image ที่มี Xcode 27 กำลังจะมา
- ยังต้องทดสอบบน iOS ปัจจุบันเสมอ แม้คุณจะคอมไพล์ด้วย SDK ของ iOS 26 ให้เปิดแอปแบบ cold start บน iPhone หรือ simulator ที่อัปเดตแล้ว
เช็กลิสต์: dependency เนทีฟก่อนส่งรีวิว
ไล่ให้ครบก่อนทุก production build คำสั่งเหล่านี้รันที่ root ของโปรเจกต์ Expo:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctorไม่แจ้งว่ามีอะไรล้มเหลว ใน Solys วันที่ 15 ตุลาคม 2026 ผ่าน 20 จาก 21 รายการ ที่ไม่ผ่านเพราะแพ็กเกจ Expo 13 ตัวตามหลังไปหนึ่ง patch ซึ่งnpx expo install --checkจัดให้ตรงกันได้- โมดูลทุกตัวที่อยู่นอก Expo SDK มีอยู่ใน React Native Directory Expo Doctor ตรวจข้อนี้เป็นค่าเริ่มต้น ตามที่เอกสารของ Expo บอก แพ็กเกจที่ไม่รู้จักควรอ่านโค้ด iOS ของมันก่อน
- โมดูลเนทีฟทุกตัวรองรับเวอร์ชัน React Native ของคุณ ตารางเวอร์ชันของ Expo จับคู่ SDK 57 กับ React Native 0.86 โมดูลที่ไม่ได้ออกเวอร์ชันใหม่มาหลายรอบถือเป็นสัญญาณเตือน
- การค้นหา UIWebView ไม่เจออะไรเลย ทำแบบเดียวกันกับทุก API ที่ Apple ประกาศว่าจะเลิกรองรับ
- เฟรมเวิร์กที่อ่อนไหวทุกตัวมีฟีเจอร์ที่มองเห็นได้ เช่น สุขภาพ Screen Time การโทร บ้านอัจฉริยะ คำอธิบายแอปพูดถึงมัน และได้รับสิทธิ์พิเศษแล้ว
- build มาจาก Xcode เวอร์ชันจริง ตรวจเวอร์ชันใน log ของ EAS build
- แอปเปิดแบบ cold start ได้บน iOS เวอร์ชันปัจจุบัน ด้วยบัญชีใหม่
- โมดูลที่แตะ AppDelegate ประกาศรองรับ UIScene แล้ว ก่อนที่คุณจะย้ายไปใช้ SDK ของ iOS 27
ตอบการปฏิเสธข้อ 2.5.1 อย่างไร?
ข้อความมักระบุชื่อ API หรือเฟรมเวิร์กที่เป็นปัญหา มีสองกรณี:
- เฟรมเวิร์กไม่ได้ใช้กับอะไรที่มองเห็นได้เลย: ถอดโมดูลหรือ capability ออก build ใหม่ แล้วตอบกลับสั้น ๆ สองประโยค
- เฟรมเวิร์กใช้กับฟีเจอร์จริง: บอกเส้นทางในแอปให้ชัด แนบภาพหน้าจอหรือวิดีโอสั้น ๆ และระบุการเชื่อมต่อไว้ในคำอธิบายหน้าแอป
การถอดโมดูลเนทีฟเปลี่ยน binary ดังนั้นอัปเดตแบบ remote อย่างเดียวไม่พอ คู่มือ guideline 2.1 อธิบายว่าทำไม reviewer เห็นแค่โค้ดที่ฝังอยู่ใน build จากนั้นการคุยกันจะเกิดขึ้นใน App Store Connect เหมือนในคู่มือตอบกลับ App Review
ตรวจโปรเจกต์ของคุณก่อนส่ง
Review Kit รวมเช็กลิสต์ก่อนส่งของผม เคสที่ผมโดนปฏิเสธแล้วแก้ได้ และ skill ของ Claude Code ที่ช่วยรีวิวโปรเจกต์ Expo ของคุณ ถ้าอยากได้คนช่วยดู จองเวลาคุยกับผมหนึ่งชั่วโมง เราจะอ่านข้อความจาก Apple และ dependency ของคุณไปด้วยกัน ขั้นตอนทั้งหมดอยู่ในหน้าแอปถูก Apple ปฏิเสธ
กำลังเตรียมปล่อยแอปแรกอยู่ใช่ไหม? ทำแบบประเมินฟรี แล้วคุณจะได้รับเช็กลิสต์กันโดน Apple ปฏิเสธของผม
คำถามที่พบบ่อย
"Guideline 2.5.1 - Performance - Software Requirements" หมายความว่าอะไร?
เป็นหัวข้อการปฏิเสธเมื่อ Apple เห็นว่าแอปของคุณใช้ API ที่ไม่ใช่สาธารณะ เทคโนโลยีที่ deprecated หรือเฟรมเวิร์กนอกจุดประสงค์ ข้อความมักระบุสิ่งที่เป็นปัญหาไว้
Guideline 2.5.1 ต่างจาก error ITMS-90338 อย่างไร?
ITMS-90338 เป็น error อัตโนมัติที่ได้รับตอนส่ง build เมื่อการวิเคราะห์เจอ symbol ที่ไม่ใช่สาธารณะ ส่วน 2.5.1 เป็นกฎการรีวิวที่คนตรวจ ซึ่งครอบคลุมทั้งเฟรมเวิร์กที่ถูกใช้ผิดวัตถุประสงค์และเทคโนโลยีที่ deprecated
ส่งแอปที่คอมไพล์ด้วย Xcode เบต้าได้ไหม?
ไม่ได้ App Store Connect รับ build เหล่านี้สำหรับ TestFlight เท่านั้น ถ้าจะส่งรีวิว ให้คอมไพล์ด้วย Xcode เวอร์ชันจริง หรือ RC ที่ Apple เปิดให้ใช้กับ App Store ใน release notes
แอป Expo ใช้ API ส่วนตัวโดยไม่รู้ตัวได้ไหม?
ได้ ผ่านโมดูลเนทีฟของบุคคลที่สาม โค้ด JavaScript ของคุณไม่ได้เรียก iOS เอง แต่แพ็กเกจเนทีฟทุกตัวพกโค้ด Objective-C หรือ Swift มาด้วย ให้ไล่ดูรายชื่อโมดูลที่อยู่นอก Expo SDK ก่อนทุกเวอร์ชัน
ต้องย้ายไป Expo SDK 58 ทันทีเลยไหม?
ไม่จำเป็นสำหรับ 2.5.1 ณ วันที่ 15 ตุลาคม 2026 เพราะ SDK 57 คอมไพล์ด้วย SDK ของ iOS 26 ซึ่งยังรับอยู่ แต่ควรวางแผนอัปเกรดก่อนเมษายน 2027 ตอนที่ Apple จะบังคับใช้ SDK ของ iOS 27 และ lifecycle แบบ scene

