วันนี้ผมจะมาแชร์ประสบการณ์ที่ถูก Apple reject แอปที่ผมทำเอง 2 แอปติดกัน เป็นเหตุที่มือใหม่ iOS developer อาจจะเจอกันมาบ้าง ตัวผมเองก็ยังเป็นมือใหม่ครับ ลองอ่านประสบการณ์การพัฒนาแอปแรกของผมได้ที่นี่
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้https://ppantip.com/topic/37592338
อย่างที่หลายคนรู้กัน Apple มีการ review app ที่ค่อนข้างขึ้นชื่อ เรียกว่าถ้า app ไหนส่งไป review ไม่เป็นไปตาม App Review Guidlines ก็มีสิทธิถูก reject สูง ซึ่งข้อกำหนดดังกล่าว สามารถอ่านได้ที่นี่
https://developer.apple.com/app-store/review/
จะเห็นว่าข้อกำหนดนั้นค่อนข้างเยอะ (มาก) และแน่นอน ผมอ่านไม่หมด อ่านแต่หัวข้อคร่าว ๆ เน้นแค่ว่าไม่ไปยุ่งกับ private API (ส่วนของโปรแกรมที่เรียกใช้ได้แต่ห้ามแก้ไข ดัดแปลง อย่างพวก Alert ที่เด้งขึ้นมา จะเห็นว่าหน้าตาคล้าย ๆ กันทุกแอป ไม่หวือหวา) และด้วยความที่แอปแรกที่ผมทำไปไม่ติดปัญหาอะไร เลยชะล่าใจ ไม่คิดว่าแอปต่อมาจะถูก reject ซะได้
แอปแรกที่ถูก reject: “Saving TH” หัวข้อ Guideline 4.4.4 - Design - Minimum Functionality
Saving TH ตอนเริ่มทำแอปนี้ ผมคิดทำเพื่อเวลาคนอยากฝากเงินจะได้ไม่ต้องหาข้อมูลเงินฝากหลายที่ เพราะธนาคารแห่งประเทศไทยมี API สำหรับดึงข้อมูลเงินฝากทั้งหมดสำหรับบุคคลธรรมดาไว้ให้ เราก็เอาข้อมูลตรงนั้นมา ซึ่งถึงข้อมูลจะดูเยอะ (400 กว่ารายการ) แต่ข้อมูลเป็น String ซึ่งมีขนาดเล็ก โหลดข้อมูลเร็ว ใช้อินเตอร์เน็ตน้อย ต่างกับการเข้าเวปแล้วโหลดข้อมูลทีละหน้า และเมื่อเป็นแอป เราสามารถตั้งให้โหลดข้อมูลแค่วันละครั้ง เฉพาะวันที่เปิดใช้แอปได้ และมีการ back up ข้อมูลล่าสุดไว้ ทำให้เปิดดู offline ได้ด้วย
พอทำเสร็จก็ส่งให้ Apple review ตาม step ไม่คิดว่าจะได้รับ e-mail กลับมาว่าแอปถูก reject ส่วนเหตุผลก็คือ
“Your app does not sufficiently differ from a mobile web browsing”
แปลง่าย ๆ ก็คือ แอปนี้ไม่ต่างกับเข้าเวปปกติทั่วไป ไม่มีการใช้ function ที่เป็น native ของ iOS พอเจอแบบนี้ก็ งง ครับ ไม่รู้จะแก้ยังไงดี เข้าใจระดับนึงกับเหตุผลของ Apple แต่อยากจะเถียงเหมือนกันว่าเรามีการ backup data ล่าสุดโดยใช้ core data และการ search และกรองข้อมูลนั้นเราไม่ได้ search จากเวปอีกที แต่เรากรองจาก local data ซึ่งสามารถทำได้แม้จะ offline ก็ตาม
ผมคิดอยู่พักนึงว่าจะเพิ่มฟังก์ชันอะไรดี แต่ก็คิดไม่ออก ประจวบกับมีไอเดียทำแอปอันใหม่ เลยพักปัญหานี้ไว้ก่อน ไม่คิอว่าแอปต่อไปจะโดน reject เหมือนกัน
แอปสองที่ถูก reject: “WhoSay” หัวข้อ Privacy
WhoSay ผมคิดจะทำแอปนี้เพราะบางทีจะส่ง sticker ก็ข้อความไม่ตรงกับที่อยากได้ อยากได้ sticker ที่เปลี่ยนข้อความได้ เลยคิดทำแอปสำหรับทำ GIF กับ PNG ไว้ส่งแทนสติกเกอร์ ใส่ข้อความเอง เน้นใช้ง่าย เพราะยุ่งยากไปคนจะขี้เกียจ ครั้งนี้มั่นใจว่าไม่โดน reject แบบ Saving TH แน่ แต่แล้วมันก็เกิดขึ้น
คราวนี้เป็นเรื่องของ Privacy หลายคนคงคุ้นเคยกับการที่แอปขออนุญาตเราในการเข้าถึงข้อมูลส่วนตัว อย่าง Photo Library, Camera หรือ Location โดยที่มี alert เด้งขึ้นมาในการเข้าถึงครั้งแรก ข้อความประมาณว่า
"App would like to access your Camera (ตามด้วยเหตุผลในการเข้าถึง)”
แอปของผมใช้ Camera กับ Photo Library มาโดน reject ตรงเหตุผลว่าทำไมต้องใช้กล้องด้วย ซึ่งตอนเขียนแอปคิดไม่ออกใส่ไปแค่ว่า “To take photos” ใช่ แอปก็ใช้กล้องเพื่อถ่ายรูปสิ จะอะไรซะอีก แต่เหมือนแค่นี้จะไม่พอที่จะผ่านการ review ของ Apple เลยถูก reject กลับมาอีกแล้ว พอถูก reject กลับมาคราวนี้ผมเลยหาข้อมูลว่าจะเขียนเหตุผลในการเข้าถึงกล้องยังไงดี และก็เจอข้อมูลที่น่าจะเป็นเหตุผลของทาง Apple ด้วย ว่าทำไมแค่ “To take photos” ถึงไม่พอ
ข้อมูลที่ว่าคือเมื่อแอปได้รับอนุญาติในการเข้าถึงกล้องแล้ว แอปนั้นสามารถถ่ายรูปได้โดยที่ user ไม่ต้องกดชัตเตอร์ด้วยซ้ำ! ฟังดูเป็นเรื่องใหญ่ของ Privacy เลยทีเดียว แต่ทำไม Apple ถึงยอมให้แอปทำแบบนั้นได้? เหตุผลอาจเป็นแอปพวกถ่ายรูป time-lapse ที่ต้องตั้งกล้องทิ้งไว้ให้ถ่ายเองตามเวลาที่กำหนด ถ้าแอปไม่สามารถถ่ายรูปได้เอง แอปพวกนี้ก็จะใช้ไม่ได้
พอเริ่มเข้าใจเหตุผลของ Apple ผมก็กลับมาแก้เหตุผลในการเข้าถึงกล้องของแอป WhoSay เหตุผลใหม่ของผมคือ
“WhoSay would like to access your camera to take photos and use them for making GIF and PNG images. The taken photos will not be shared without your permission.”
ซึ่งเมื่อแก้ไขแล้วส่งไปใหม่ Apple ก็ให้ผ่าน ไม่มีปัญหาอะไร จะเห็นว่าการ review ของ Apple นั้นละเอียดพอสมควร ซึ่งก็เป็นผลดีกับ user แต่อาจจะสร้างความรำคาญใจให้ developer บ้าง
อีกสาเหตุของการ reject (ซึ่งข้อนี้ผมไม่โดนเพราะรู้ก่อน) ที่อาจจะรำคาญใจ developer คือ การพัฒนาแอปสำหรับ iPhone ต้องใช้บน iPad ได้ ครับ ตามนั้นเลย ข้อนี้หลายคนอาจจะงง แต่จริง ๆ แล้ว เราสามารถลงแอป for iPhone บน iPad ได้ โดย iPad จะแสดงแอปนั้นด้วย simulator iPhone ที่มีสัดส่วนหน้าจอเท่า iPhone 4S ซึ่งมันช่างสั้นเหลือเกิน ปกติแอป iPhone ก็ต้องทำ support หน้าจอ iPhone SE, iPhone, iPhone Plus, iPhone X อยู่แล้ว นี่ยังต้องมาทำ support หน้าจอ iPhone 4S อีก สำหรับผมนี่เป็นเรื่องกวนใจผมพอสมควร ไม่เข้าใจว่าทำไมแอป iPhone ต้องใช้บน iPad ได้ด้วย แต่ Apple เค้าว่าแบบนั้น ก็คงต้องตามเค้า เลยไม่แปลก ถ้ามือใหม่ทำแอป iPhone จะถูก reject ด้วยเหตุผลที่ว่า "แอปใช้บน iPad ไม่ได้ UI มันทับซ้อนกัน"
ที่ผมเล่ามาคงเป็นประโยชน์สำหรับ developer มือใหม่บ้าง เพราะการที่ App ถูก reject นั้นเป็นการเสียเวลา ไหนจะต้องทำ binary ใหม่ ไหนจะต้องรอ review รอบใหม่ หรือบางที concept ของแอปไม่ผ่านการ review แน่ ๆ ทำไปก็เสียเวลา เช่นถ้าจะทำแอปให้ลูกค้าที่แค่แสดงข้อมูลของเวปบริษัทผ่านทางแอป แบบนี้ไม่ผ่านแน่นอน ต้องมาคิดว่าจะใส่ฟังก์ชันของ Device อันไหนเข้าไปด้วย
สุดท้ายนี้ ใครมีไอเดียว่าผมควรจะเพิ่มอะไรไปใน Saving TH เพื่อให้ผ่านการ review บอกได้นะครับ หรือใครมีประสบการณ์การถูก reject มาเล่าให้ฟังกันบ้างก็ได้นะครับ
เมื่อแอปที่ผมทำถูก Apple reject 2 แอปติดกัน
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
อย่างที่หลายคนรู้กัน Apple มีการ review app ที่ค่อนข้างขึ้นชื่อ เรียกว่าถ้า app ไหนส่งไป review ไม่เป็นไปตาม App Review Guidlines ก็มีสิทธิถูก reject สูง ซึ่งข้อกำหนดดังกล่าว สามารถอ่านได้ที่นี่
https://developer.apple.com/app-store/review/
จะเห็นว่าข้อกำหนดนั้นค่อนข้างเยอะ (มาก) และแน่นอน ผมอ่านไม่หมด อ่านแต่หัวข้อคร่าว ๆ เน้นแค่ว่าไม่ไปยุ่งกับ private API (ส่วนของโปรแกรมที่เรียกใช้ได้แต่ห้ามแก้ไข ดัดแปลง อย่างพวก Alert ที่เด้งขึ้นมา จะเห็นว่าหน้าตาคล้าย ๆ กันทุกแอป ไม่หวือหวา) และด้วยความที่แอปแรกที่ผมทำไปไม่ติดปัญหาอะไร เลยชะล่าใจ ไม่คิดว่าแอปต่อมาจะถูก reject ซะได้
แอปแรกที่ถูก reject: “Saving TH” หัวข้อ Guideline 4.4.4 - Design - Minimum Functionality
Saving TH ตอนเริ่มทำแอปนี้ ผมคิดทำเพื่อเวลาคนอยากฝากเงินจะได้ไม่ต้องหาข้อมูลเงินฝากหลายที่ เพราะธนาคารแห่งประเทศไทยมี API สำหรับดึงข้อมูลเงินฝากทั้งหมดสำหรับบุคคลธรรมดาไว้ให้ เราก็เอาข้อมูลตรงนั้นมา ซึ่งถึงข้อมูลจะดูเยอะ (400 กว่ารายการ) แต่ข้อมูลเป็น String ซึ่งมีขนาดเล็ก โหลดข้อมูลเร็ว ใช้อินเตอร์เน็ตน้อย ต่างกับการเข้าเวปแล้วโหลดข้อมูลทีละหน้า และเมื่อเป็นแอป เราสามารถตั้งให้โหลดข้อมูลแค่วันละครั้ง เฉพาะวันที่เปิดใช้แอปได้ และมีการ back up ข้อมูลล่าสุดไว้ ทำให้เปิดดู offline ได้ด้วย
พอทำเสร็จก็ส่งให้ Apple review ตาม step ไม่คิดว่าจะได้รับ e-mail กลับมาว่าแอปถูก reject ส่วนเหตุผลก็คือ
“Your app does not sufficiently differ from a mobile web browsing”
แปลง่าย ๆ ก็คือ แอปนี้ไม่ต่างกับเข้าเวปปกติทั่วไป ไม่มีการใช้ function ที่เป็น native ของ iOS พอเจอแบบนี้ก็ งง ครับ ไม่รู้จะแก้ยังไงดี เข้าใจระดับนึงกับเหตุผลของ Apple แต่อยากจะเถียงเหมือนกันว่าเรามีการ backup data ล่าสุดโดยใช้ core data และการ search และกรองข้อมูลนั้นเราไม่ได้ search จากเวปอีกที แต่เรากรองจาก local data ซึ่งสามารถทำได้แม้จะ offline ก็ตาม
ผมคิดอยู่พักนึงว่าจะเพิ่มฟังก์ชันอะไรดี แต่ก็คิดไม่ออก ประจวบกับมีไอเดียทำแอปอันใหม่ เลยพักปัญหานี้ไว้ก่อน ไม่คิอว่าแอปต่อไปจะโดน reject เหมือนกัน
แอปสองที่ถูก reject: “WhoSay” หัวข้อ Privacy
WhoSay ผมคิดจะทำแอปนี้เพราะบางทีจะส่ง sticker ก็ข้อความไม่ตรงกับที่อยากได้ อยากได้ sticker ที่เปลี่ยนข้อความได้ เลยคิดทำแอปสำหรับทำ GIF กับ PNG ไว้ส่งแทนสติกเกอร์ ใส่ข้อความเอง เน้นใช้ง่าย เพราะยุ่งยากไปคนจะขี้เกียจ ครั้งนี้มั่นใจว่าไม่โดน reject แบบ Saving TH แน่ แต่แล้วมันก็เกิดขึ้น
คราวนี้เป็นเรื่องของ Privacy หลายคนคงคุ้นเคยกับการที่แอปขออนุญาตเราในการเข้าถึงข้อมูลส่วนตัว อย่าง Photo Library, Camera หรือ Location โดยที่มี alert เด้งขึ้นมาในการเข้าถึงครั้งแรก ข้อความประมาณว่า "App would like to access your Camera (ตามด้วยเหตุผลในการเข้าถึง)”
แอปของผมใช้ Camera กับ Photo Library มาโดน reject ตรงเหตุผลว่าทำไมต้องใช้กล้องด้วย ซึ่งตอนเขียนแอปคิดไม่ออกใส่ไปแค่ว่า “To take photos” ใช่ แอปก็ใช้กล้องเพื่อถ่ายรูปสิ จะอะไรซะอีก แต่เหมือนแค่นี้จะไม่พอที่จะผ่านการ review ของ Apple เลยถูก reject กลับมาอีกแล้ว พอถูก reject กลับมาคราวนี้ผมเลยหาข้อมูลว่าจะเขียนเหตุผลในการเข้าถึงกล้องยังไงดี และก็เจอข้อมูลที่น่าจะเป็นเหตุผลของทาง Apple ด้วย ว่าทำไมแค่ “To take photos” ถึงไม่พอ
ข้อมูลที่ว่าคือเมื่อแอปได้รับอนุญาติในการเข้าถึงกล้องแล้ว แอปนั้นสามารถถ่ายรูปได้โดยที่ user ไม่ต้องกดชัตเตอร์ด้วยซ้ำ! ฟังดูเป็นเรื่องใหญ่ของ Privacy เลยทีเดียว แต่ทำไม Apple ถึงยอมให้แอปทำแบบนั้นได้? เหตุผลอาจเป็นแอปพวกถ่ายรูป time-lapse ที่ต้องตั้งกล้องทิ้งไว้ให้ถ่ายเองตามเวลาที่กำหนด ถ้าแอปไม่สามารถถ่ายรูปได้เอง แอปพวกนี้ก็จะใช้ไม่ได้
พอเริ่มเข้าใจเหตุผลของ Apple ผมก็กลับมาแก้เหตุผลในการเข้าถึงกล้องของแอป WhoSay เหตุผลใหม่ของผมคือ
“WhoSay would like to access your camera to take photos and use them for making GIF and PNG images. The taken photos will not be shared without your permission.”
ซึ่งเมื่อแก้ไขแล้วส่งไปใหม่ Apple ก็ให้ผ่าน ไม่มีปัญหาอะไร จะเห็นว่าการ review ของ Apple นั้นละเอียดพอสมควร ซึ่งก็เป็นผลดีกับ user แต่อาจจะสร้างความรำคาญใจให้ developer บ้าง
อีกสาเหตุของการ reject (ซึ่งข้อนี้ผมไม่โดนเพราะรู้ก่อน) ที่อาจจะรำคาญใจ developer คือ การพัฒนาแอปสำหรับ iPhone ต้องใช้บน iPad ได้ ครับ ตามนั้นเลย ข้อนี้หลายคนอาจจะงง แต่จริง ๆ แล้ว เราสามารถลงแอป for iPhone บน iPad ได้ โดย iPad จะแสดงแอปนั้นด้วย simulator iPhone ที่มีสัดส่วนหน้าจอเท่า iPhone 4S ซึ่งมันช่างสั้นเหลือเกิน ปกติแอป iPhone ก็ต้องทำ support หน้าจอ iPhone SE, iPhone, iPhone Plus, iPhone X อยู่แล้ว นี่ยังต้องมาทำ support หน้าจอ iPhone 4S อีก สำหรับผมนี่เป็นเรื่องกวนใจผมพอสมควร ไม่เข้าใจว่าทำไมแอป iPhone ต้องใช้บน iPad ได้ด้วย แต่ Apple เค้าว่าแบบนั้น ก็คงต้องตามเค้า เลยไม่แปลก ถ้ามือใหม่ทำแอป iPhone จะถูก reject ด้วยเหตุผลที่ว่า "แอปใช้บน iPad ไม่ได้ UI มันทับซ้อนกัน"
ที่ผมเล่ามาคงเป็นประโยชน์สำหรับ developer มือใหม่บ้าง เพราะการที่ App ถูก reject นั้นเป็นการเสียเวลา ไหนจะต้องทำ binary ใหม่ ไหนจะต้องรอ review รอบใหม่ หรือบางที concept ของแอปไม่ผ่านการ review แน่ ๆ ทำไปก็เสียเวลา เช่นถ้าจะทำแอปให้ลูกค้าที่แค่แสดงข้อมูลของเวปบริษัทผ่านทางแอป แบบนี้ไม่ผ่านแน่นอน ต้องมาคิดว่าจะใส่ฟังก์ชันของ Device อันไหนเข้าไปด้วย
สุดท้ายนี้ ใครมีไอเดียว่าผมควรจะเพิ่มอะไรไปใน Saving TH เพื่อให้ผ่านการ review บอกได้นะครับ หรือใครมีประสบการณ์การถูก reject มาเล่าให้ฟังกันบ้างก็ได้นะครับ