Guideline 2.1: hiểu và khắc phục khi bị App Store từ chối
Bởi Mehdi Azizi
Cập nhật ngày , 9 phút
Guideline 2.1 App Completeness: quy định bao gồm những gì, Apple test app ra sao, trả lời reviewer thế nào và 3 lần bị từ chối thật trên app của mình.
Guideline 2.1 là quy định khiến nhiều bản gửi duyệt bị loại nhất. Chính Apple viết điều này trên trang App Review của họ: trung bình, hơn 40% các vấn đề chưa được giải quyết liên quan đến 2.1, quy định bao gồm crash, nội dung tạm thời và thông tin không đầy đủ.
Bài này chỉ nói về đúng quy định này: nó bao gồm những gì, hai biến thể của nó, cách reviewer test app của bạn, và nên trả lời họ thế nào, kèm ba lần bị từ chối mà mình đã dính trên chính các app của mình. Nếu muốn có cái nhìn tổng quan về mọi lý do bị từ chối, bạn nên đọc vì sao Apple từ chối app.
Guideline 2.1 App Completeness là gì?
Guideline 2.1 yêu cầu app gửi cho Apple phải là phiên bản cuối cùng và hoàn chỉnh: không crash, không link chết, không văn bản tạm, có tài khoản demo nếu app yêu cầu đăng nhập, và các giao dịch mua trong app (in-app purchase) phải hiển thị và hoạt động. Nếu reviewer không thể đi hết app của bạn, đó là một lần từ chối 2.1.
Văn bản chính thức nằm trong App Review Guidelines, mục 2 "Performance". Nó chia thành hai điểm.
2.1(a) yêu cầu mỗi bản gửi phải là phiên bản cuối cùng, đầy đủ metadata và các URL hoạt động được. Văn bản tạm, website trống và mọi nội dung tạm thời phải được gỡ bỏ trước khi gửi. App phải được test trên thiết bị thật về lỗi và độ ổn định. Nếu app yêu cầu đăng nhập, bạn cung cấp tài khoản demo và giữ server luôn chạy. Một chế độ demo tích hợp sẵn có thể thay cho tài khoản này, nhưng chỉ khi được Apple đồng ý trước, và nó phải thể hiện được mọi tính năng của app. Câu tóm gọn tất cả: "We will reject incomplete app bundles and binaries that crash".
2.1(b) liên quan đến in-app purchase: chúng phải hoàn chỉnh, được cập nhật, reviewer nhìn thấy được và hoạt động được. Nếu một giao dịch đã cấu hình trong App Store Connect mà không tìm thấy trong app, bạn phải giải thích lý do trong ghi chú gửi duyệt.
Guideline 2.1 bao gồm những gì trên thực tế
Trong thực tế, một lần từ chối 2.1 xảy ra vì một trong các lý do sau:
- Một lần crash. Lúc khởi động, sau khi bị từ chối quyền truy cập, khi không có mạng. Chỉ một lần là đủ.
- Một link chết. Chính sách quyền riêng tư, điều khoản sử dụng, hỗ trợ: mọi URL bạn khai báo đều sẽ được mở.
- Một tính năng không truy cập được. Một nút bấm không dẫn đến đâu, một màn hình bắt buộc không thể vượt qua, một onboarding không có lối ra. Dạng nguy hiểm nhất: không hề thấy được trên điện thoại của chính bạn.
- Tài khoản demo thiếu hoặc đã hết hạn. Reviewer kẹt ở màn hình đăng nhập, hoặc tài khoản được cung cấp không còn dùng được, hoặc server đã tắt.
- Nội dung lấp chỗ. Lorem ipsum, "Sắp ra mắt", màn hình trống, dữ liệu test hiển thị ra ngoài.
- In-app purchase không tìm thấy. Gói đăng ký có trong App Store Connect, nhưng reviewer không tìm được màn hình bán nó, hoặc giao dịch thất bại trong sandbox. Những lỗi phổ biến nhất ở màn hình thanh toán có trong paywall iOS: 7 lỗi của người mới.
2.1 Information Needed hay 2.1(a): khác nhau thế nào?
Không phải tin nhắn nào của Apple cũng có cùng tiêu đề, và sự khác biệt này thay đổi cách bạn trả lời.
"Guideline 2.1 - Information Needed" có nghĩa là reviewer chưa thể hoàn tất việc duyệt và đang hỏi bạn. Thiếu một thông tin đăng nhập, một lời giải thích, một cách để tới được một tính năng. Đây chưa phải là xác nhận có lỗi: đây là một yêu cầu. Đôi khi, một câu trả lời chính xác trong App Store Connect là đủ. Nhưng nếu câu hỏi cho thấy app thực sự bị chặn ở đâu đó, bạn cần một build mới.
"Guideline 2.1(a) - Performance - App Completeness" có nghĩa là reviewer đã phát hiện vấn đề: một lần crash, một lỗi, một màn hình không phản hồi. Tin nhắn thường ghi rõ thiết bị đã dùng và hay kèm ảnh chụp màn hình. Lúc này, bạn phải sửa, gửi lại build, rồi mới trả lời.
Apple test app của bạn như thế nào
Hãy đặt mình vào vị trí reviewer. Có ba điểm quan trọng.
Họ test trên thiết bị mà có thể bạn không có. Tin nhắn từ chối thường ghi rõ model máy. Quy định 2.4.1 nêu rằng app iPhone nên chạy được trên iPad bất cứ khi nào có thể, và một app thiết kế cho iPhone sẽ hiển thị trên đó ở chế độ tương thích, trong một cửa sổ có tỷ lệ iPhone. Những lần bị từ chối 2.1 gần đây của mình đều đến từ một chiếc iPad Air: nếu chỉ test trên iPhone của mình, bạn sẽ không thấy những gì reviewer thấy.
Họ bắt đầu từ lần khởi động đầu tiên. App mới tinh, không cache, không phiên đăng nhập, không có bản cập nhật nào được tải về.
Mạng phải hoạt động được với chỉ IPv6. Quy định 2.5.5, nằm cạnh guideline 2.5.4 về các chế độ chạy nền, yêu cầu app hoạt động đầy đủ trên mạng chỉ có IPv6, và trang hỗ trợ IPv6 của Apple biến điều này thành yêu cầu bắt buộc cho mọi app gửi duyệt kể từ ngày 1/6/2016. Rủi ro đến từ một địa chỉ IPv4 bị viết cứng (hardcode): Apple khuyên nên test trên mạng chỉ có IPv6, tắt dữ liệu di động.
Để tái tạo các điều kiện này trước khi gửi, TestFlight trên nhiều thiết bị vẫn là cách đơn giản nhất: xem TestFlight: test app iPhone của bạn.
Ba lần mình bị từ chối, và nguyên nhân thật sự
Ba lần bị từ chối gần đây trên chính các app của mình, cùng nguyên nhân thật sự.
Solys: một bản demo mini-game không thể thắng trên iPad
Solys là app báo thức kèm mini-game của mình. Ngày 18/8/2026, một build bị từ chối với lý do "2.1 Information Needed": Apple hỏi cách để vượt qua nhiệm vụ trong game. Reviewer test trên iPad Air, với app iPhone chạy ở chế độ tương thích.
Nguyên nhân thật nằm ở bản demo mini-game trong onboarding. Chiều cao chướng ngại vật được viết bằng số point cố định. Với chiều cao khung chơi có được trên iPad ở chế độ tương thích, lối đi trở nên hẹp hơn nhân vật: bản demo không thể thắng được. Và nút "Tiếp tục" chỉ sáng lên khi thắng. Không có lối thoát: reviewer không thể xem được app.
Cách sửa: hình học tỷ lệ theo kích thước đo được của khung chơi, và một link "Bỏ qua demo" xuất hiện sau một lần thua.
Bài học: mọi bước bị chặn bởi một thử thách đều phải có lối ra vô điều kiện. Và mỗi màn hình bắt buộc phải được test trên màn hình nhỏ nhất được hỗ trợ VÀ trên iPad ở chế độ tương thích.
Nolera: một bản sửa mà reviewer không nhìn thấy
Ngày 17/9/2026, Nolera bị từ chối sau một lần duyệt trên iPad Air. Tin nhắn kết hợp 2.1(a) với các điểm khác. Bản sửa cho vấn đề được báo đã được phát hành bằng cập nhật từ xa (OTA), không có build mới.
Vấn đề: ở lần khởi động đầu tiên, reviewer thấy code được đóng gói trong build, chứ không phải bản cập nhật được tải về sau đó. Với họ, bản sửa không hề tồn tại.
Bài học: một bản sửa dành cho việc duyệt phải nằm trong binary gửi cho Apple.
Clic: nguyên nhân không nằm trong app
Ngày 16/9/2026, Clic bị từ chối. Bản thân app đã được cập nhật. Nguyên nhân thật nằm ở chỗ khác: chính sách quyền riêng tư đăng trên mạng chưa được cập nhật về nhà cung cấp AI đang dùng. Lần từ chối này thuộc về quyền riêng tư hơn là 2.1, nhưng nó minh họa cùng một điều: nguyên nhân thật không phải lúc nào cũng là thứ tin nhắn khiến bạn nghĩ.
Bài học: hãy kiểm tra những gì đang online, chứ không phải những gì nằm trong repo của bạn. Mở từng URL đã khai báo vào đúng ngày gửi.
Trả lời gì trong Resolution Center
Sau khi bị từ chối, bản gửi của bạn chuyển sang “Unresolved Issues” và cuộc trao đổi với Apple diễn ra trong mục App Review của app, vẫn hay được gọi là Resolution Center. Quy trình chính thức để trả lời App Review cho phép một tin nhắn tối đa 4.000 ký tự, kèm một tệp đính kèm.
Hãy viết bằng tiếng Anh, ngắn gọn. Reviewer muốn ba thông tin: cái gì đã chặn, cái gì đã thay đổi, kiểm tra thế nào. Đây là mẫu mình dùng (thay số build và bản sửa bằng của bạn):
Hello,
Thank you for your review.
Issue: the onboarding game demo could not be completed on iPad
(iPhone app running in compatibility mode), so the user could
not continue.
Fix in build 1.0.3 (42):
- The game layout now scales to the measured screen size.
- A "Skip demo" link appears after a failed attempt, so the
onboarding can always be completed.
How to verify: launch the app, start the onboarding demo,
lose once, then tap "Skip demo".
A screen recording is attached.
Best regards,
Vài nguyên tắc:
- Trả lời đúng câu được hỏi. Với "Information Needed", hãy bắt đầu bằng câu trả lời chính xác, không phải bằng bối cảnh.
- Nêu tên build và chỉ đường tới màn hình đã sửa, trong ba hoặc bốn thao tác.
- Đính kèm bằng chứng. Một video ngắn quay trên thiết bị gần giống của reviewer giúp tránh thêm một vòng qua lại.
- Đừng biện hộ. Kháng nghị lên App Review Board có tồn tại, nhưng với một lần từ chối 2.1 xứng đáng, nó chỉ kéo dài thời gian chờ. Chi tiết về thời gian có trong thời gian duyệt App Store.
Nếu đọc xong mà lý do vẫn mơ hồ, quy trình đầy đủ có trên trang app bị Apple từ chối.
Ghi chú gửi duyệt và tài khoản demo
Mục App Review Information của phiên bản, trong App Store Connect, là cách phòng thủ tốt nhất của bạn trước 2.1. Theo tài liệu tham khảo chính thức về các trường này, nó gồm:
- Sign-in required: tên đăng nhập và mật khẩu của một tài khoản demo. Tài khoản này không được hết hạn. Nếu app của bạn dùng đăng nhập bên thứ ba, hãy cung cấp thông tin đăng nhập của dịch vụ đó.
- Notes: tối đa 4.000 byte, bằng ngôn ngữ bạn chọn. Mọi thứ giúp ích cho việc test.
- Contact: tên, email và số điện thoại theo định dạng quốc tế.
Những gì mình luôn ghi vào phần ghi chú:
- Đường dẫn tới từng in-app purchase, như quy định 2.1(b) yêu cầu.
- Các tính năng không hiển nhiên: một thao tác cử chỉ, một quyền truy cập, một nội dung gắn với giờ giấc.
- Trạng thái tài khoản demo: đã đăng ký gói hay chưa, dữ liệu điền sẵn hay trống.
- Các giới hạn đã biết: với phần cứng hoặc môi trường khó tái tạo, Apple yêu cầu bạn sẵn sàng cung cấp video.
Và một nguyên tắc ngoài biểu mẫu: giữ server luôn chạy trong suốt quá trình duyệt. Server test bị tắt nghĩa là tài khoản demo không dùng được nữa, tức là một lần từ chối 2.1.
Checklist 2.1 trước khi gửi duyệt
Đây là checklist mình áp dụng trước mỗi lần gửi, được xây dựng từ những lần bị từ chối:
- App được cài từ đầu trên iPhone nhỏ nhất được hỗ trợ, lớn nhất, và một iPad ở chế độ tương thích
- Đi hết onboarding, cố tình thất bại ở mỗi bước đòi hỏi thử thách
- Mỗi màn hình bắt buộc đều có lối ra vô điều kiện
- Không có bản sửa nào dành cho việc duyệt chỉ được phát hành qua cập nhật từ xa
- Chạy app ở chế độ máy bay, rồi trên mạng chỉ có IPv6
- Mở mọi URL đã khai báo ngay trong ngày: quyền riêng tư, điều khoản, hỗ trợ
- Không có văn bản tạm, màn hình trống hay dữ liệu test hiển thị
- Tài khoản demo được test trong ngày gửi, không có ngày hết hạn, server đang chạy
- Mỗi in-app purchase đều tìm thấy được từ trong app và đã test trong sandbox, kể cả khôi phục giao dịch
- Ghi chú gửi duyệt chỉ rõ vị trí các giao dịch mua và các tính năng không hiển nhiên
Nếu đây là lần phát hành đầu tiên của bạn, mọi bước trước đó có trong phát hành app lên App Store.
Gửi hồ sơ cùng một người đã từng dính những lần từ chối này
Apple Review Kit tập hợp checklist trước khi gửi của mình, các mẫu ghi chú cho người duyệt và các skill Claude Code đọc lại project của bạn trước khi bạn gửi.
Bạn vừa nhận một lần từ chối 2.1? Kit này cũng giúp bạn tìm lại quy định được trích dẫn, nó yêu cầu gì, cùng một ví dụ về cách sửa và cách trả lời. Nếu bạn muốn chúng ta cùng xem hồ sơ của bạn ngay bây giờ, hãy đặt một giờ với mình, qua video call.
Không ai có thể đảm bảo Apple sẽ chấp nhận app của bạn. Điều mình có thể làm là giúp bạn tránh những lần từ chối 2.1 mà mình đã phải trả giá bằng một vòng duyệt.
Bạn chưa gửi app? Bản chẩn đoán miễn phí sẽ gửi cho bạn checklist chống bị Apple từ chối của mình, bao gồm cả quy định 2.1, và cho bạn biết những gì còn phải làm trước khi gửi. Nếu bạn vẫn đang xây dựng app, trang chủ chỉ cách tạo một ứng dụng di động với việc duyệt app trong đầu ngay từ đầu.
Câu hỏi thường gặp
"Guideline 2.1 - Information Needed" nghĩa là gì?
Reviewer chưa thể hoàn tất việc duyệt và đang hỏi bạn: một thông tin đăng nhập, một lời giải thích, một cách để truy cập một tính năng. Hãy trả lời chính xác trong App Store Connect. Nếu câu hỏi cho thấy app thực sự bị chặn, như với Solys, hãy sửa và gửi một build mới.
Có cần build mới sau khi bị từ chối 2.1 không?
Với crash, lỗi hoặc màn hình bị chặn thì có: bản sửa phải nằm trong binary. Cập nhật từ xa là không đủ, vì reviewer thấy code được đóng gói ở lần khởi động đầu tiên. Với trường hợp chỉ thiếu thông tin, một câu trả lời có thể là đủ.
App của mình yêu cầu đăng nhập: cần cung cấp gì cho reviewer?
Một tài khoản demo không hết hạn, điền trong mục App Review Information, và một server luôn chạy trong suốt quá trình duyệt. Chế độ demo tích hợp sẵn chỉ có thể thay thế tài khoản này khi được Apple đồng ý trước, và nó phải thể hiện được mọi tính năng.
Lần từ chối 2.1 có thể đến từ thứ khác ngoài app không?
Có. Một URL chết trong trang thông tin app, một tài khoản demo hết hạn, một server bị tắt hoặc một in-app purchase cấu hình sai là đủ. Và đôi khi, như với Clic, nguyên nhân thật nằm ở thứ đang online chứ không phải trong code: hãy kiểm tra mọi thứ reviewer có thể mở.