0

Cách build và đưa ứng dụng iOS lên App Store từ Windows (không cần mua Mac)

Bạn đã làm xong app. Có thể là Flutter hoặc React Native, bản Android đã lên Google Play rồi. Hoặc là một project Swift nhỏ bạn viết trong VS Code. Rồi đến lúc bạn gặp bức tường mà gần như dev nào dùng Windows cũng gặp:

Xcode chỉ chạy trên macOS.

Muốn build app iOS, ký (sign) và upload lên App Store Connect thì bạn cần Xcode, hoặc ít nhất là bộ công cụ build của Apple. Không có phiên bản Xcode chính thức cho Windows, và nhiều khả năng sẽ không bao giờ có.

Vậy nếu không có Mac thì làm sao? Trong bài này mình tổng hợp các lựa chọn thực tế, rồi hướng dẫn chi tiết từng bước theo cách mình đang dùng.

Nói trước: mình là người làm ra JustMac, một trong các dịch vụ được nhắc đến bên dưới. Mình cố gắng so sánh công bằng tất cả các lựa chọn, kể cả những cách miễn phí.

Cách 1: Dùng dịch vụ CI build giúp bạn

Nếu project của bạn là Flutter hoặc React Native, có thể bạn không cần màn hình Mac nào cả:

  • Expo EAS Build build app iOS trên cloud cho project Expo / React Native, còn EAS Submit có thể upload kết quả lên App Store Connect.
  • Codemagic làm điều tương tự cho Flutter (và các framework khác).
  • GitHub Actions có runner macOS: miễn phí cho repo public, tính phí theo phút cho repo private.

Phù hợp khi: đã build ổn định, chỉ cần build lặp lại. Không phù hợp khi: setup lần đầu. Khi ký app bị lỗi, CocoaPods báo lỗi dependency, hoặc bạn cần xem app chạy trên iOS Simulator, thì debug qua log CI rất chậm và mệt.

Cách 2: Mua một chiếc Mac mini (cũ)

Một chiếc Mac mini chip Apple (M1 trở lên) đã qua sử dụng là lựa chọn mạnh nhất về lâu dài. Nếu tuần nào bạn cũng làm iOS thì mua là đáng.

Phù hợp khi: làm iOS hằng ngày. Không phù hợp khi: bạn chỉ cần ra một bản build trong tuần này. Phải bỏ tiền trước, cần thêm màn hình, bàn phím và thời gian cài đặt. Với sinh viên hoặc người mới thử iOS, đây là khoản không nhỏ.

Cách 3: Thuê Mac từ xa

Bạn thuê một chiếc Mac thật đặt trong data center và dùng màn hình của nó từ xa. Có nhiều nhà cung cấp: MacinCloud, MacStadium, AWS EC2 Mac, và các dịch vụ nhỏ hơn như JustMac (của mình). Chúng khác nhau chủ yếu ở:

  • Cách kết nối: qua VNC / phần mềm remote desktop, qua SSH, hay chỉ cần mở một tab trình duyệt.
  • Thời gian thuê tối thiểu: giấy phép macOS của Apple yêu cầu thời gian cho thuê tối thiểu 24 giờ, nên thường bạn sẽ thấy gói theo ngày, tuần hoặc tháng.
  • Riêng hay dùng chung: nguyên một chiếc Mac vật lý, hay chỉ một tài khoản user trên máy dùng chung.
  • Vị trí máy chủ: máy càng gần bạn thì độ trễ càng thấp. Đa số dịch vụ đặt máy ở Mỹ hoặc châu Âu; máy của JustMac đặt ở Úc, gần Việt Nam hơn.

Phù hợp khi: thỉnh thoảng mới cần build, setup lần đầu, xử lý lỗi ký app, test trên Simulator. Không phù hợp khi: dùng nặng mỗi ngày, lúc đó mua máy sẽ rẻ hơn.

⚠️ Còn "Hackintosh" hay máy ảo macOS trên PC thì sao? Giấy phép của Apple chỉ cho phép chạy macOS trên phần cứng Apple, và các cách này thường xuyên hỏng mỗi khi Xcode cập nhật. Mình không khuyên dùng để build app bạn định đưa lên App Store.

Hướng dẫn: từ Windows đến TestFlight bằng Mac thuê

Dưới đây là toàn bộ quy trình. Ảnh chụp màn hình mình dùng JustMac, nhưng các bước trên Mac thì giống nhau với bất kỳ Mac từ xa nào, hoặc Mac của chính bạn.

Cần chuẩn bị trước

  • Một Apple Account (miễn phí).
  • Tài khoản Apple Developer Program (99 USD/năm). Chạy app trên Simulator thì không cần, nhưng muốn upload lên TestFlight hoặc App Store thì bắt buộc.
  • Project của bạn trên Git, hoặc một file nén để upload lên.

Bước 1: Thuê Mac và mở nó

Chọn máy, thanh toán một ngày và mở màn hình. Với JustMac, Mac mở ngay trong tab trình duyệt (Chrome, Edge, Safari hoặc Firefox), không cần cài gì trên Windows.

screen1.png

Bước 2: Cài Xcode

Mở App Store trên Mac, đăng nhập bằng Apple Account của bạn và cài Xcode. File rất nặng, nên hãy bắt đầu bước này trước rồi đi pha cà phê.

Sau đó mở Xcode một lần để nó cài thêm các thành phần cần thiết (bao gồm runtime cho iOS Simulator).

screen2.png

Bước 3: Đưa project sang Mac

Cách dễ nhất là dùng Git. Mở Terminal và chạy:

git clone https://github.com/ban/app-cua-ban.git
cd app-cua-ban

Không có Git repo? Thì upload file nén. Trong JustMac bạn chỉ cần kéo thả file vào cửa sổ Mac.

Với Flutter, cài bộ công cụ bằng Homebrew trước:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install --cask flutter
brew install cocoapods
flutter pub get

Với React Native:

brew install node cocoapods
npm install
cd ios && pod install && cd ..

Bước 4: Chạy thử trên Simulator

Trước khi lo chuyện ký app, hãy chắc chắn app build và chạy được:

  • Swift thuần: mở file .xcodeproj / .xcworkspace. Trên thanh công cụ phía trên cửa sổ Xcode, bấm vào tên thiết bị bên cạnh tên app và chọn một iPhone trong mục iOS Simulators. Sau đó bấm Run (⌘R).
  • Flutter: open -a Simulator, rồi flutter run.
  • React Native: npx react-native run-ios (hoặc npx expo run:ios nếu dùng Expo).

screen3.png

Đây là lúc các project "chạy ngon trên Android" lộ ra lỗi chỉ có trên iOS: thiếu quyền trong Info.plist, xung đột phiên bản CocoaPods, hoặc phiên bản iOS tối thiểu quá thấp so với một thư viện. Hãy sửa ngay lúc này, khi bạn còn nhìn thấy chuyện gì đang xảy ra.

Bước 5: Thiết lập ký app (signing)

  1. Trong Xcode, vào Settings → Accounts và thêm Apple Account của bạn.
  2. Chọn project, chọn target của app, rồi mở tab Signing & Capabilities.
  3. Tick Automatically manage signing và chọn Team của bạn.
  4. Đảm bảo Bundle Identifier là duy nhất (ví dụ com.tencuaban.tenapp).

Xcode sẽ tự tạo certificate và provisioning profile cho bạn.

screen4.png

Bước 6: Tạo app trên App Store Connect

Mở App Store Connect trên trình duyệt, vào Apps → + → New App và chọn đúng Bundle ID bạn đã dùng trong Xcode. Mỗi app chỉ cần làm bước này một lần.

Bước 7: Archive và upload

  1. Nhìn lên thanh công cụ phía trên cửa sổ Xcode. Ở giữa có tên app và thiết bị, ví dụ MyApp › iPhone 16. Bấm vào tên thiết bị (iPhone 16) và chọn Any iOS Device (arm64) trong danh sách. Như vậy Xcode sẽ build cho iPhone thật thay vì Simulator.
  2. Chọn Product → Archive. (Nếu Archive bị mờ, nghĩa là bạn vẫn đang chọn Simulator, hãy quay lại bước 1.)
  3. Khi cửa sổ Organizer mở ra, chọn bản archive và bấm Distribute App → App Store Connect → Upload.

Với Flutter, bạn có thể build archive từ terminal bằng flutter build ipa, rồi upload qua Organizer hoặc ứng dụng Transporter của Apple.

screen5.png

Bước 8: TestFlight và gửi duyệt

Sau vài phút xử lý, bản build sẽ xuất hiện trong App Store Connect ở mục TestFlight. Thêm chính bạn làm tester, cài app TestFlight trên iPhone và thử app thật. Khi đã ổn, gắn bản build vào một phiên bản và gửi Apple duyệt.

screen6.PNG

Trước khi hết hạn thuê

  • Push code (kể cả các thay đổi Xcode tự sửa trong file project) lên Git.
  • Đăng xuất Apple Account trong Xcode và App Store nếu muốn chắc chắn hơn. Trên JustMac, máy vẫn sẽ được xóa sạch về trạng thái gốc một giờ sau khi hết hạn thuê.

Nên chọn cách nào?

Tình huống Lựa chọn tốt nhất
Project Expo / React Native đã build được Expo EAS Build
Project Flutter, build đã ổn định Codemagic hoặc GitHub Actions
Build iOS lần đầu, lỗi ký app, cần Simulator Thuê Mac một ngày hoặc một tuần
Tuần nào cũng làm iOS Mua Mac mini

Nguyên tắc của mình: thuê trước, tự động hóa sau. Lần build đầu tiên, qua được bước ký app và App Store Connect, sẽ dễ hơn rất nhiều khi bạn nhìn thấy cửa sổ Xcode thật. Khi đã chạy được rồi, chuyển sang CI rất đơn giản.


Nếu muốn thử cách dùng Mac ngay trong trình duyệt, JustMac cho thuê Mac mini và MacBook Air riêng theo ngày, tuần hoặc tháng, giao diện có tiếng Việt. Có câu hỏi về bước nào thì cứ để lại bình luận, mình sẽ trả lời.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí