Đăng game lên App Store không cần Mac: cách build trên cloud
Cách chúng tôi đưa một game HTML5 từ máy tính Windows đến khâu duyệt của App Store bằng Capacitor, Codemagic và TestFlight, cùng những lỗi khiến chúng tôi tốn nhiều lần build.

Có, bạn có thể đăng game lên App Store mà không cần Mac. Vẫn phải có Mac, nhưng bạn thuê nó: game HTML5 được bọc bằng Capacitor trên máy tính của bạn, một dịch vụ cloud như Codemagic biên dịch và ký nó trên máy Mac của họ, bản build được đưa lên App Store Connect và TestFlight, còn trang thông tin, khai báo quyền riêng tư và việc gửi duyệt bạn hoàn tất trên trình duyệt. Thứ bạn không thể bỏ qua là một chiếc iPhone, vì phải có người chơi bản build trước Apple.
Chúng tôi đã làm việc này từ Windows với game hành động của mình, Little Ninja Dash. Lần build cloud thành công đầu tiên mất khoảng sáu phút, và ứng dụng được gửi tới App Review ngày 19/10/2026, nơi hồ sơ của chúng tôi ghi trạng thái Waiting for Review. Bài này không báo cáo kết quả duyệt. Thông tin về Apple và Codemagic lấy từ trang chính thức của họ, đọc ngày 30/10/2026. Phần còn lại là những gì ghi chú của chúng tôi ghi lại, kể cả những chỗ không suôn sẻ.
Cần gì để đăng game lên App Store không cần Mac
- Tư cách thành viên Apple Developer Program: 99 USD mỗi năm thành viên. Cá nhân và tổ chức đều đăng ký được. Tổ chức cần có số D-U-N-S và một website công khai.
- Một tài khoản Codemagic. Gói cá nhân miễn phí có 500 phút build macOS M2 mỗi tháng và một bản build mỗi lúc; sau đó, mỗi phút Mac mini M2 có giá 0,095 USD. Phút miễn phí dành cho người dùng đơn lẻ, không dành cho nhóm.
- Một Git repository riêng tư chứa project. Codemagic build từ repository bạn kết nối. Với template của chúng tôi, repository riêng tư là bắt buộc: một repository công khai sẽ phân phối lại source code, điều giấy phép cấm.
- Một chiếc iPhone có ứng dụng TestFlight, để thử bản build thật.
- Một game chạy offline từ thư mục riêng, được bọc bằng Capacitor.
Từ ngày 28/4/2026, Apple yêu cầu ứng dụng tải lên App Store Connect phải được build bằng Xcode 26 trở lên và iOS 26 SDK. Trang iOS của Capacitor cũng ghi Xcode 26.0 trở lên và hỗ trợ iOS 15 trở lên. Xcode chỉ chạy trên macOS, đó là lý do việc build diễn ra trên máy của Codemagic chứ không phải trên máy tính của bạn.
Các phiên bản template của chúng tôi là game trình duyệt. Trang của mỗi phiên bản đều ghi bản build ứng dụng native không được bao gồm. Một giấy phép dùng cho một sản phẩm cuối, và bạn có thể phát hành game đó ở bất cứ đâu, kể cả App Store và Google Play. Bạn không được bán lại chính template. Nếu định thu tiền người chơi, qua ứng dụng trả phí hoặc mua hàng trong ứng dụng, hãy hỏi chúng tôi trước.
Xem các template và mỗi phiên bản gồm những gì
Bước 1: thêm project iOS ngay trên Windows
Nếu đã có project Capacitor cho Android, hãy cài @capacitor/ios và chạy npx cap add ios. Lệnh này tạo thư mục ios/, kể cả trên Windows. Bạn không thể mở nó bằng Xcode trên máy, nên mỗi thay đổi trong project native là một lần sửa file mà bạn kiểm tra ở lần build cloud tiếp theo.
- Biểu tượng: một file PNG 1024 x 1024 không có nền trong suốt.
- Thiết bị và hướng màn hình: game của chúng tôi chỉ dành cho iPhone và chỉ chạy ngang. Hỗ trợ iPad đồng nghĩa với thêm ảnh chụp iPad và thêm bố cục cần thử.
- Mã hóa: trang trợ giúp về tuân thủ xuất khẩu của Apple khuyên cập nhật Info.plist của ứng dụng để không phải trả lời câu hỏi mã hóa ở mỗi lần gửi. Game của chúng tôi chỉ dùng HTTPS của hệ thống, nên chúng tôi đặt ITSAppUsesNonExemptEncryption là false.
- Chỉ dùng file đóng gói sẵn: game nằm trong ứng dụng và không bao giờ tải website của chúng tôi. Hướng dẫn 4.2 của Apple yêu cầu ứng dụng vượt xa một website được đóng gói lại.
Bắt đầu từ một template? Velvet Pool là template chúng tôi đã bọc bằng Capacitor cho Google Play, nên thư mục game của nó đã qua bước này trên Android. Chưa template nào của chúng tôi qua khâu duyệt của App Store.
Xem Velvet Pool, template chúng tôi đã bọc bằng Capacitor
Bước 2: ký ứng dụng mà không cần Mac hay Keychain
Ký ứng dụng là phần trước đây bắt buộc phải có Mac. Với một App Store Connect API key, Codemagic có thể làm việc này trên cloud.
- Trên trang Apple Developer, tạo một App ID (bundle identifier) cho game, bật In-App Purchase nếu bạn bán gì đó bên trong.
- Trong App Store Connect, tạo hồ sơ ứng dụng với bundle ID đó, một SKU và ngôn ngữ chính.
- Tạo một App Store Connect API key. Tài liệu của Codemagic khuyên dùng một key riêng cho Codemagic. Thêm key vào phần cài đặt tích hợp của Codemagic và không bao giờ để file key trong repository.
- Để Codemagic tạo chứng chỉ phân phối và lấy provisioning profile bằng key đó. Nó có thể lấy lại các chứng chỉ đã tạo trước đây và các profile từ Apple Developer portal.
Những gì đã trục trặc với chúng tôi
- Hai lần build đầu thất bại vì chưa có provisioning profile cho bundle ID. Hãy thiết lập chứng chỉ và profile trước lần build đầu tiên.
- Một profile được nhập vào Codemagic mà không có tên tham chiếu đã không hoạt động, và nút bấm báo lỗi mà không hiện gì. Luôn điền tên.
- Lần thiết lập API key đầu tiên thất bại vì chúng tôi gõ sai Issuer ID. Hãy sao chép và dán từ trang key của Apple.
- Số build phải luôn tăng. Việc hỏi Apple số cuối cùng thất bại khi một bản tải lên trước vẫn đang xử lý, nên chúng tôi chuyển sang số được tính từ đồng hồ.
Bước 3: build trên Codemagic và thử trên TestFlight
Công thức build nằm trong file codemagic.yaml trong repository. File của chúng tôi cài các dependency, chuẩn bị file game, đồng bộ vào project iOS bằng npx cap sync ios, áp profile và build IPA trên một máy Mac mini M2. Sau đó Codemagic đưa bản build lên App Store Connect. Lần build thành công đầu tiên mất khoảng sáu phút, còn bản build chính thức sau này chưa đến bốn phút.
Một bất ngờ: dù submit_to_testflight được đặt là false, Codemagic vẫn tải bản build lên App Store Connect. Tài liệu của Codemagic mô tả tùy chọn đó là tùy chọn cần thiết để phân phối cho các nhóm beta.
Giới hạn của TestFlight
- Người thử nội bộ: tối đa 100 người dùng App Store Connect trong nhóm của bạn.
- Người thử bên ngoài: tối đa 10.000, sau khi bản build đầu tiên cho thử nghiệm bên ngoài được App Review duyệt.
- Mỗi bản build có sẵn cho người thử tối đa 90 ngày.
Lời mời người thử nội bộ sẽ ở trạng thái chờ cho đến khi được chấp nhận từ email TestFlight, và ứng dụng không hiện trong TestFlight trước đó. Hãy kiểm tra thư mục spam.
Những gì iPhone phát hiện mà Windows không thấy
- File âm thanh thu sẵn không tải được. Bên trong ứng dụng, fetch trả về status 0 với đúng dữ liệu, và code của chúng tôi coi đó là lỗi. Chấp nhận status 0 cho file cục bộ đã sửa được.
- Nút bấm bị cắt ở chế độ ngang gần tai thỏ. Chúng tôi làm lại bố cục màn hình kết quả và thử mọi góc.
- Màn hình mua hàng dùng chung với Android vẫn ghi Google Play. Trên iOS giờ đã ghi App Store.
- Giao dịch mua thử trong TestFlight không đặt lại được, nên bản build thử nghiệm có thêm nút giả lập trạng thái chưa mua. Bản build cho cửa hàng không có nút này.
Bước 4: trang App Store Connect, quyền riêng tư và độ tuổi
Phần còn lại diễn ra trên trình duyệt. Đây là thứ tự đã hiệu quả với chúng tôi.
- App Information: phụ đề, danh mục và bảng câu hỏi xếp hạng độ tuổi. Trả lời trung thực theo những gì game thực sự hiển thị.
- Pricing and Availability: giá và quốc gia. Khả dụng trên Mac và Apple Vision Pro được bật mặc định. Chúng tôi đã tắt vì game làm cho màn hình cảm ứng.
- App Privacy: Apple yêu cầu thông tin này cho ứng dụng mới và bản cập nhật, bao gồm cách làm của đối tác bên thứ ba có code trong ứng dụng, như mạng quảng cáo và SDK. Bắt buộc có URL chính sách quyền riêng tư công khai.
- Mua hàng trong ứng dụng, nếu có: tên, mô tả, ảnh chụp màn hình để duyệt và ghi chú cho người duyệt.
- Trang phiên bản: mô tả, từ khóa, URL hỗ trợ và marketing, bản quyền, bản build, ghi chú duyệt và tùy chọn phát hành. Chúng tôi chọn phát hành thủ công.
- Ảnh chụp màn hình, rồi từng ngôn ngữ bổ sung với văn bản và ảnh riêng.
- Ảnh chụp màn hình: hướng dẫn 2.3.3 nói ảnh nên thể hiện ứng dụng khi đang dùng, không chỉ ảnh tiêu đề hay màn hình chờ. Ảnh của chúng tôi là ảnh chụp thật của game.
- Tên ứng dụng: một cái tên chúng tôi muốn đã có người dùng trên App Store. Hãy chuẩn bị sẵn tên thứ hai, hoặc tên có thêm một phần mô tả ngắn.
- Ghi chú duyệt: chúng tôi ghi rằng game hoàn chỉnh trong ứng dụng, chạy offline, không cần đăng nhập, và chỉ chỗ nút mua cùng nút khôi phục giao dịch.
Đọc điều khoản giấy phép trước khi phát hành template thành ứng dụng
Bước 5: gửi duyệt, và Apple kiểm tra những gì
Khi gửi, bạn được yêu cầu công bố câu trả lời App Privacy và xác nhận chúng đúng sự thật, rồi gửi bản nháp. Ứng dụng của chúng tôi được gửi ngày 19/10/2026 cùng phiên bản ứng dụng và giao dịch mua một lần, và trạng thái chuyển thành Waiting for Review. Nếu kết quả duyệt là từ chối, câu trả lời đi qua Resolution Center, bằng dữ kiện, không phải gửi lại một cách mù quáng.
Với game làm từ template, ba hướng dẫn quan trọng nhất. 4.2 yêu cầu nhiều hơn một website đóng gói lại, nên hãy giữ game bên trong ứng dụng. 4.3(a) yêu cầu không tạo nhiều bundle ID cho cùng một ứng dụng. 4.3(b) nói Apple không muốn ứng dụng không phân biệt được với những gì đã phổ biến. Một bản reskin phải thay đổi luật chơi, nội dung và giao diện, không chỉ hình ảnh.
Template của chúng tôi gồm những gì, và phần chúng tôi làm giúp bạn
Mỗi template đi kèm thư mục game sẵn sàng để host, source code dễ đọc, tài liệu hướng dẫn và 6 tháng hỗ trợ, hoặc 12 tháng nếu gia hạn. Hỗ trợ bao gồm cài đặt và sử dụng các file được cung cấp và sửa lỗi có thể tái hiện. Wrapper iOS, quảng cáo native, mua hàng trong ứng dụng, thiết lập build cloud và trang App Store là các dịch vụ riêng.
Nếu bạn không muốn tự thiết lập việc ký và Codemagic, hãy gửi cho chúng tôi template, kế hoạch tài khoản Apple và hạn chót. Chúng tôi sẽ trả lời về phạm vi, giá và thời gian trước khi bắt đầu. Chúng tôi không công bố bảng giá cho công việc theo yêu cầu.
Yêu cầu báo giá đưa game của bạn lên App Store
Câu hỏi thường gặp
Tôi có thể đăng game iPhone mà không có Mac không?
Có. Bạn vẫn cần macOS và Xcode để build, nhưng một dịch vụ cloud như Codemagic cung cấp chúng. Mọi thứ còn lại, từ App Store Connect đến TestFlight, đều làm được trên trình duyệt và iPhone.
Đăng lên App Store tốn bao nhiêu?
Apple Developer Program có giá 99 USD mỗi năm thành viên. Gói cá nhân miễn phí của Codemagic có 500 phút macOS M2 mỗi tháng, phút thêm được tính theo phút. Cộng thêm giấy phép game và hình ảnh cho cửa hàng.
Tôi có cần iPhone không?
Để thử nghiệm thật thì có. iPhone của chúng tôi phát hiện âm thanh bị thiếu, nút bị cắt và tên cửa hàng sai mà bản build trên Windows và các bài thử trên trình duyệt không cho thấy.
Apple có chấp nhận game HTML5 bọc trong ứng dụng không?
Chúng tôi không thể hứa trước kết quả. Hướng dẫn 4.2 yêu cầu nhiều hơn một website đóng gói lại, nên chúng tôi đưa toàn bộ game vào ứng dụng, cho chạy offline và thêm tính năng native. Hướng dẫn 4.3 cũng áp dụng cho bản reskin.
Template của bạn có kèm bản build iOS không?
Không. Các phiên bản của chúng tôi là game trình duyệt, và trang sản phẩm ghi rõ bản build ứng dụng native không được bao gồm. Bạn có thể tự đi theo cách này hoặc đặt chúng tôi làm theo báo giá.
