tva
← บทความเชิงลึก

แก้ปัญหาไอคอนถูก App Store ปฏิเสธ: sRGB, ช่องอัลฟา และข้อผิดพลาดอื่น

App Store Connect ตรวจไอคอนแล้วปฏิเสธโดยไม่บอกสาเหตุ คุณอัปโหลด PNG ขนาด 1024×1024 ที่ดูสมบูรณ์ในทุกโปรแกรมแต่งภาพที่มี แต่ได้รับข้อความทำนอง “The image could not be processed.” ไม่ระบุพื้นที่สี ไม่พูดถึงอัลฟา มีเพียงอุปสรรคที่ขวางระหว่างการส่งแอปกับ App Store

ในความเป็นจริง ตัวตรวจสอบพิจารณาคุณสมบัติทางเทคนิคเพียงไม่กี่ข้อ และใช้ข้อความผิดพลาดทั่วไปเดียวกันเมื่อข้อใดไม่ผ่าน สาเหตุที่พบบ่อยที่สุดสามอย่างคือโปรไฟล์สีที่ไม่ใช่ sRGB ซึ่งมักเป็น Display P3 จากเครื่องมือออกแบบสมัยใหม่ ช่องอัลฟาที่ร้านระบุชัดว่าไม่อนุญาต และโหมดสีแบบดัชนีที่พบน้อยกว่า ซึ่งไม่น่าปรากฏในไอคอนที่สร้างในปี 2025 แต่ยังพบเมื่อไฟล์ผ่านกระบวนการปรับไฟล์รุ่นเก่า ทั้งหมดแก้จากเทอร์มินัลได้ในเวลาไม่ถึงหนึ่งนาทีเมื่อรู้ว่าต้องตรวจอะไร

ข้อกำหนดจริงของ App Store Connect

ข้อกำหนดของ Apple สำหรับไอคอนบนหน้ารายการใน App Store ชัดเจน ไฟล์ต้องเป็น PNG ขนาด 1024×1024 พิกเซล ต้องไม่มีช่องอัลฟา ทั้งอัลฟาที่โปร่งใสบางส่วนหรือที่ทึบแสงทั้งหมดก็ใช้ไม่ได้ ต้องไม่มีข้อมูลอัลฟาเลย พื้นที่สีควรเป็น sRGB โดย Human Interface Guidelines ของ Apple ยังระบุว่า Display P3 และ Gray Gamma 2.2 เป็นพื้นที่สีที่รองรับสำหรับไอคอนแอปด้วย แต่จากประสบการณ์ของเรา sRGB เป็นตัวเลือกที่ปลอดภัยที่สุดสำหรับไอคอน App Store และโหมดสีควรเป็น RGB TrueColor ไม่ใช่พาเลตต์แบบดัชนี

ข้อจำกัดอัลฟามีเพราะ App Store Connect จัดการมุมโค้งและการประกอบภาพของไอคอนเอง ช่องอัลฟาจะรบกวนกระบวนการนี้ ส่วนข้อกำหนด sRGB มีเพราะร้านแสดงไอคอนบนอุปกรณ์หลากหลายที่มีโปรไฟล์จอต่างกัน โดย sRGB เป็นฐานร่วม Display P3 ซึ่งเป็นพื้นที่สีช่วงกว้างของ Apple เป็นตัวเลือกการส่งออกที่พบได้ทั่วไปในเครื่องมืออย่าง Figma, Sketch และ Affinity Designer และจากประสบการณ์ของเรา ไอคอนที่ติดแท็ก P3 เป็นสาเหตุของความล้มเหลวหลายกรณีที่คู่มือนี้กล่าวถึง

ตรวจหาปัญหาด้วย sips

macOS มี sips (Scriptable Image Processing System) ซึ่งเป็นเครื่องมือบรรทัดคำสั่งสำหรับตรวจและแปลงภาพโดยไม่ต้องพึ่งซอฟต์แวร์ภายนอก เป็นวิธีที่เร็วที่สุดในการดูว่าไฟล์ไอคอนมีอะไรอยู่บ้าง

sips --getProperty all icon.png

ผลลัพธ์เป็นรายการคุณสมบัติแบบเรียบ ฟิลด์สำคัญต่อการตรวจของ App Store คือ hasAlpha, space และ profile ไฟล์ที่มีปัญหามักแสดงค่าทำนองนี้:

hasAlpha: yes
space: RGB
profile: Display P3

ชุดค่านี้จะไม่ผ่าน ค่า space: RGB ไม่แยก RGB ทั่วไปจาก sRGB ต้องดูฟิลด์โปรไฟล์เพื่อแยก ไอคอนที่พร้อมอัปโหลดควรแสดง hasAlpha: no และโปรไฟล์ “sRGB IEC61966-2.1” หรือเทียบเท่า

หากต้องการตรวจให้เร็วขึ้นในสคริปต์สร้างระบบ สามารถเรียกดูคุณสมบัติแต่ละรายการได้:

sips --getProperty hasAlpha icon.png
sips --getProperty profile icon.png

ปัญหาโปรไฟล์สี

สาเหตุที่พบบ่อยที่สุดของการปฏิเสธคือโปรไฟล์ Display P3 จอ Mac รุ่นใหม่รองรับ P3 และเครื่องมือออกแบบอาจส่งออกด้วยโปรไฟล์สีช่วงกว้าง หากไม่ได้เลือก sRGB อย่างชัดเจน Figma นำตัวเลือก “Unmanaged” ออกในเดือนสิงหาคม 2023 ปัจจุบันแต่ละไฟล์ใช้ sRGB หรือ Display P3 และการส่งออกจะใช้โปรไฟล์ของไฟล์ เว้นแต่เปลี่ยนในการตั้งค่าการส่งออก ส่วน Sketch มีการตั้งค่าต่อเอกสารลักษณะเดียวกัน หากนักออกแบบใช้ MacBook Pro แล้วส่งออกโดยไม่ตรวจการตั้งค่านี้ PNG ที่ได้จะเป็น P3

วิธีแก้คือต้องแปลงไฟล์เป็น sRGB ไม่ใช่เพียงติดป้ายใหม่ ความต่างนี้สำคัญ ตัวเลือก sips -s profile ฝังโปรไฟล์อื่นในข้อมูลเมตาโดยไม่แปลงค่าพิกเซล ทำให้ข้อมูลไม่ตรงความจริง เพราะพิกเซลเข้ารหัสแบบ P3 แต่ระบุว่าเป็น sRGB ตัวเลือกที่ถูกต้องคือ --matchTo ซึ่งแปลงพื้นที่สีจริง:

sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc'   icon.png --out icon-srgb.png

คำสั่งนี้อ่านพิกเซลต้นทางเป็น P3 แปลงเป็นค่าสี sRGB ที่เทียบเท่า แล้วเขียนไฟล์ใหม่ สีที่เปลี่ยนไปแทบสังเกตไม่ได้บนจอส่วนใหญ่ แต่มีผลต่อการผ่านข้อกำหนดตัวตรวจสอบ หลังรันแล้วให้ยืนยันผล:

sips --getProperty profile icon-srgb.png

โปรไฟล์ควรแสดง “sRGB IEC61966-2.1”

ลบช่องอัลฟา

sips ลบช่องอัลฟาไม่ได้ ตรวจดูได้และเพิ่มโปรไฟล์ให้ไฟล์ที่มีอัลฟาได้ แต่การตัดชั้นอัลฟาต้องใช้เครื่องมืออื่น convert ของ ImageMagick จัดการได้ตรงไปตรงมา:

convert icon-srgb.png -background white -alpha remove -alpha off icon-final.png

ตัวเลือกทำงานตามลำดับ -background white กำหนดสีพื้นหลังที่จะใช้แทนพิกเซลโปร่งใส -alpha remove รวมภาพกับพื้นหลังเพื่อลบความโปร่งใส และ -alpha off ลบช่องอัลฟาออกจากผลลัพธ์ทั้งหมด ได้ PNG ทึบแสงที่ตัวตรวจสอบ App Store ยอมรับ

หากไอคอนไม่มีความโปร่งใสจริง ทุกพิกเซลทึบแสงทั้งหมด แต่โครงสร้างไฟล์ยังมีช่องอัลฟา สามารถใช้ pngcrush แทนได้ การลดชนิดสีแบบไม่สูญเสียข้อมูลของเครื่องมือนี้ ซึ่งเปิดใช้เป็นค่าเริ่มต้นตั้งแต่ pngcrush 1.8.0 จะเขียนภาพ RGBA ที่ทึบแสงทั้งหมดใหม่เป็น RGB โดยไม่เปลี่ยนค่าพิกเซลใด ๆ:

pngcrush -ow -rem alla icon.png

ช่องอัลฟาเป็นข้อมูลพิกเซล ไม่ใช่ชังก์ข้อมูลเมตา ดังนั้นตัวเลือก -rem alla จึงไม่ได้ลบช่องอัลฟา ตัวเลือกนี้ลบชังก์เสริมทั้งหมดที่รู้จัก ยกเว้น tRNS รวมถึงโปรไฟล์สีที่ฝังไว้ จึงควรตรวจโปรไฟล์อีกครั้งหลังทำงาน ส่วน -ow จะเขียนทับไฟล์เดิม วิธีนี้เร็วกว่าและไม่สูญเสียข้อมูล แต่การลดชนิดสีจะเกิดขึ้นเมื่อไม่มีความโปร่งใสจริงที่ต้องรวมกับพื้นหลังเท่านั้น หาก identify -verbose icon.png | grep Alpha แสดงพิกเซลที่ไม่ทึบแสง ให้ใช้ ImageMagick

กรณีโหมดสีแบบดัชนี

RGB TrueColor เก็บแต่ละพิกเซลเป็นค่าสามช่องอิสระขนาด 8 บิตหรือ 16 บิต โหมดดัชนีเก็บพาเลตต์สีและอ้างด้วยดัชนีจำนวนเต็ม เป็นรูปแบบที่ออกแบบมาสำหรับ GIF ขนาดเล็กในปี 1989 ไม่ใช่ไอคอนแอป เครื่องมือออกแบบส่วนใหญ่ไม่สร้าง PNG แบบดัชนี แต่บางกระบวนการปรับไฟล์เว็บ โดยเฉพาะรุ่นเก่าที่ใช้เครื่องมืออย่าง pngquant อย่างหนัก อาจเปลี่ยนไอคอน TrueColor เป็นแบบดัชนีจากการลดจำนวนสีในพาเลตต์

ตรวจโหมดสีด้วย ImageMagick ได้ดังนี้:

identify -verbose icon.png | grep -E "^  Type"

ไฟล์ TrueColor แสดง Type: TrueColor หรือ Type: TrueColorAlpha ส่วนไฟล์แบบดัชนีแสดง Type: Palette หากพบ Palette ให้แปลง:

convert icon.png -type TrueColor icon-truecolor.png

ในทางปฏิบัติ นี่เป็นสาเหตุการปฏิเสธที่พบน้อยที่สุด แต่ยังพบเป็นประจำในโครงการที่ไอคอนเคยผ่านสคริปต์ปรับไฟล์ภาพมาก่อน

ไปป์ไลน์แก้ปัญหารวม

เมื่อไอคอนมีปัญหาทั้งสามอย่าง ทั้งโปรไฟล์ P3 ช่องอัลฟา และอาจมีข้อมูลเมตาเก่า แนวทางที่เรียบร้อยที่สุดคือไปป์ไลน์สั้น ๆ โดยใช้ sips แปลงสี แล้วตามด้วยคำสั่ง ImageMagick หนึ่งคำสั่งเพื่อจัดการส่วนที่เหลือ:

sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc'   icon.png --out /tmp/icon-srgb.png   && convert /tmp/icon-srgb.png     -type TrueColor     -background white     -alpha remove     -alpha off     -strip     icon-final.png

ตัวเลือก -strip ท้ายคำสั่งลบโปรไฟล์ที่ฝังไว้ ความคิดเห็น และชังก์ข้อมูลเมตาเสริมทั้งหมดจากผลลัพธ์ เมื่อถึงขั้นตอนนี้ พิกเซลถูกแปลงเป็น sRGB แล้ว จึงได้ PNG ที่มีขนาดเล็กและไม่มีข้อมูลส่วนเกิน หากต้องการเก็บแท็ก sRGB ไว้อย่างชัดเจนตามคำแนะนำข้างต้น ให้ละ -strip หลังรันแล้ว การตรวจสุดท้ายด้วย sips --getProperty all icon-final.png ควรยืนยัน hasAlpha: no, space: RGB และไม่มีโปรไฟล์หรือฝังโปรไฟล์ sRGB อย่างชัดเจน

แก้ปัญหาที่ต้นทาง

วิธีแก้ด้วยบรรทัดคำสั่งใช้ได้ แต่ทางแก้ที่แท้จริงคือกำหนดเครื่องมือออกแบบให้ส่งออกถูกต้องตั้งแต่ครั้งแรก ใน Figma ตั้งโปรไฟล์สีของไฟล์เป็น sRGB หรือเลือก sRGB ในการตั้งค่าการส่งออก ก่อนส่งออกไฟล์ภาพ ใน Sketch คลิกพื้นที่ว่างบนแคนวาสแล้วตั้ง Color Profile ใน Inspector ส่วน Affinity Designer ให้เปิด File → Document Setup เลือกแท็บ Color แล้วตั้งโปรไฟล์เป็น sRGB IEC61966-2.1

สำหรับไอคอน App Store โดยเฉพาะ ควรส่งออกเป็น PNG ขนาด 1024×1024 ไม่ปรับขนาด และเปิดใช้โปรไฟล์ sRGB หากไปป์ไลน์ CI/CD อัปโหลดไป App Store Connect ผ่าน xcrun altool หรือ App Store Connect API โดยตรง ให้เพิ่มขั้นตอนตรวจ sips --getProperty hasAlpha ก่อนอัปโหลด และให้การสร้างระบบล้มเหลวเมื่อพบอัลฟา การตรวจพบก่อนเรียก API ช่วยประหยัดเวลารอรับส่งและการตรวจด้วยมือ

บทเรียนคือการตรวจของ App Store Connect ทำตามเอกสาร Apple ปัญหาอยู่ที่ขั้นตอนอัปโหลดไม่แสดงเอกสารและข้อความผิดพลาดไม่ชี้เงื่อนไขที่ไม่ผ่าน เมื่อรู้คุณสมบัติสามข้อที่ต้องตรวจ กระบวนการนี้ก็กลายเป็นรายการตรวจที่ตรงไปตรงมา

บทความที่เกี่ยวข้อง

บทความที่เกี่ยวข้อง