Prototype iOS (SwiftUI): nhận chỉ dẫn công việc dạng thẻ, điều khiển bằng phím âm lượng. Phím + / − làm việc khác nhau tùy màn hình (mở tin, để sau, đã rõ, hỏi lại).
Dùng được trên Windows, Chromebook, máy tính bất kỳ: không cài gì, chỉ cần trình duyệt.
Cách hoạt động: mỗi lần có code mới đẩy lên GitHub, máy Mac của GitHub tự build app và để sẵn một file tải về. Bạn đưa file đó lên Appetize.io aka trang web chạy iPhone ảo ngay trong trình duyệt.
- Mở https://github.com/nynyann/SignTask/actions
- Bấm vào dòng Build trên cùng có dấu ✅ xanh. (Nếu chưa có dòng nào xanh: bấm Build ở cột trái → Run workflow → Run workflow, đợi khoảng 2 phút.)
- Kéo xuống cuối trang, mục Artifacts, bấm SignTask-appetize.zip để tải về. Không giải nén: file này upload thẳng lên Appetize.
- Vào https://appetize.io → Sign up, tạo tài khoản miễn phí (có thể đăng nhập bằng Google).
- Trong trang quản lý, bấm Upload (hoặc Upload app / New app).
- Chọn file
SignTask-appetize.zipở bước 1. Nếu được hỏi nền tảng, chọn iOS. - Tải lên xong, bấm vào app vừa tạo → Open / Play.
- Chọn máy iPhone 16 (hoặc mới hơn) và iOS 26 nếu có, để thấy hiệu ứng kính giống Figma.
- Bấm Tap to play. Đợi vài giây, app mở ra màn thẻ đỏ.
- Điện thoại ảo không có phím âm lượng thật, nên bấm chuột vào tab + / − ở mép trái màn hình:
| Màn hình | Bấm + | Bấm − |
|---|---|---|
| Thẻ tin mới (đỏ) | Mở tin | Để sau |
| Chi tiết tin | Đã rõ | Hỏi lại |
| Danh sách ca | Mở tin đang chọn | Xuống tin sau |
Thử theo thứ tự: thẻ đỏ → + (mở tin) → đổi Văn bản ngắn / Văn bản gốc → + (Đã rõ) → về danh sách ca → bấm ? để xem gợi ý phím.
- Không có phím âm lượng thật, không rung. Micro thường không dùng được, nên màn Nhắn tin bằng giọng nói có thể không chạy.
- Gói miễn phí của Appetize giới hạn số phút chạy mỗi tháng.
- Báo "No .app folder found": bạn đang upload nhầm file (đã giải nén rồi nén lại, hoặc file từ bản build cũ). Tải lại SignTask-appetize.zip ở bước 1 và upload nguyên file.
- Báo "All slots for this account are currently in use" / Account-based queue: gói miễn phí chỉ chạy 1 máy ảo một lúc. Đóng các tab Appetize khác (kể cả trang xem trước sau khi upload), đợi 2–5 phút rồi tải lại trang.
- File trong Artifacts tự xóa sau 30 ngày → bấm Run workflow (bước 1.2) để build lại.
- Có code mới thì phải tải file mới và upload lại (trong Appetize có thể bấm Update trên app cũ để giữ nguyên link).
- Muốn thử phím âm lượng và giọng nói thật thì phải cài lên iPhone (cần Mac, xem phần dưới).
Chạy thật trên iPad, có phím âm lượng, rung và micro. Không cần Mac, không cần cáp, không cần tài khoản Apple Developer. Chỉ chạy được trên iPad, Swift Playgrounds không có trên iPhone.
Cần có: iPad chạy iPadOS 17 trở lên (iPadOS 26 để thấy hiệu ứng kính giống Figma) và tài khoản GitHub có quyền xem repo này.
Trên iPad mở App Store, tìm Swift Playgrounds (của Apple, miễn phí) và cài.
- Trên iPad mở Safari, vào https://github.com/nynyann/SignTask/actions và đăng nhập GitHub.
- Bấm vào dòng Build trên cùng có dấu ✅ xanh.
- Kéo xuống mục Artifacts, bấm SignTask-iPad.zip rồi chọn Tải về. Không thấy mục Artifacts: bấm biểu tượng Aa (hoặc ⋯) trên thanh địa chỉ, chọn Yêu cầu trang web cho máy tính, tải lại trang.
Cách khác: tải file trên máy tính rồi gửi sang iPad bằng AirDrop, iCloud Drive, Google Drive hoặc Zalo.
- Mở app Tệp (Files), vào Tải về (Downloads).
- Chạm vào SignTask-iPad.zip. iPad tự giải nén ra thư mục SignTask (biểu tượng Swift Playgrounds).
- Chạm vào SignTask để mở trong Swift Playgrounds. Nếu nó mở ra như thư mục thường: mở app Swift Playgrounds, bấm Vị trí / Locations ở góc, tìm đến Tải về và chọn SignTask.
- Lần đầu Swift Playgrounds có thể hỏi có tin cậy/cho phép chạy code này không: chọn Cho phép / Trust.
- Đợi vài giây cho Swift Playgrounds đọc xong code (vòng xoay ở trên cùng biến mất).
- Bấm nút ▶︎ Chạy (Run) ở góc trên. App hiện ở khung bên phải.
- Bấm biểu tượng toàn màn hình ở khung đó để app chiếm cả màn hình.
- Lần đầu vào màn Nhắn tin, iPad hỏi quyền micro và nhận dạng giọng nói: chọn Cho phép.
Dùng phím âm lượng của iPad (cạnh trên hoặc cạnh bên) giống bảng phím ở phần trên, hoặc bấm tab + / − trên màn hình.
- Giao diện thiết kế cho iPhone nên trên iPad sẽ nằm gọn một bên, không giãn ra hết màn hình.
- App chạy bên trong Swift Playgrounds nên phím âm lượng có thể thỉnh thoảng làm hiện thanh âm lượng của hệ thống. Nếu phím không phản hồi, bấm tab + / − trên màn hình.
- Có code mới thì tải lại SignTask-iPad.zip (bước 2), xóa bản cũ trong app Tệp rồi làm lại bước 3.
- File trong Artifacts tự xóa sau 90 ngày. Hết hạn thì vào Actions → Build → Run workflow để tạo lại.
- Muốn tự tạo gói trên máy có bash:
bash scripts/make-ipad-playground.sh(ra fileSignTask-iPad.zip).
Cần: Mac có Xcode 26 và Homebrew, iPhone kèm cáp, Apple ID.
git clone https://github.com/nynyann/SignTask.git
cd SignTask
brew install xcodegen # chỉ cần làm lần đầu
xcodegen # tạo SignTask.xcodeproj
open SignTask.xcodeprojTrong Xcode:
- Chọn target SignTask → tab Signing & Capabilities → Team: đăng nhập Apple ID, chọn "Personal Team".
Nếu báo trùng Bundle Identifier thì đổi
com.example.SignTaskthành tên khác, ví dụcom.tenban.SignTask. - Chạy nhanh trên máy ảo: chọn một iPhone Simulator rồi bấm ▶︎. Simulator không có phím âm lượng thật, nên hãy bấm vào tab + / − ở mép trái màn hình.
- Chạy trên iPhone thật: cắm máy, bấm Tin cậy, bật Cài đặt → Quyền riêng tư & Bảo mật → Chế độ nhà phát triển (máy sẽ khởi động lại). Chọn iPhone trong Xcode rồi bấm ▶︎. Nếu báo "Untrusted Developer": Cài đặt → Cài đặt chung → Quản lý VPN & thiết bị → chọn Apple ID → Tin cậy.
Quyền micro và nhận dạng giọng nói đã khai báo sẵn trong project.yml, không cần thêm tay ở tab Info.
Export layer image 6 (frame "1" trong Figma) thành PNG 3x, kéo vào SignTask/Assets.xcassets, đặt tên coffee.
Chưa có ảnh thì app hiện biểu tượng ly cà phê thay thế.
| File | Nội dung |
|---|---|
SignTaskApp.swift |
Điểm vào app, chuyển màn hình |
AppState.swift |
Dữ liệu tin, logic phím +/−, rung |
Screens.swift |
Màn thẻ tin mới, chi tiết tin, danh sách ca |
ComposeView.swift |
Màn nhắn tin bằng giọng nói |
SignGrammarShortener.swift |
Rút gọn câu theo trật tự ngữ pháp ký hiệu |
Theme.swift |
Màu lấy từ Figma, Liquid Glass, tab +/−, chip, toast |
VolumeButtonManager.swift |
Bắt phím âm lượng vật lý |
Speech.swift |
Ghi âm, nhận dạng tiếng Việt, phát lại |
Playground/Package.swift, scripts/make-ipad-playground.sh |
Đóng gói app cho Swift Playgrounds trên iPad |
Cách tạo project bằng tay trong Xcode (không dùng XcodeGen) và bảng phím: xem HUONG_DAN.md.
swiftc SignTask/SignGrammarShortener.swift Tests/main.swift -o /tmp/t && /tmp/tGitHub Actions (.github/workflows/build.yml) tự chạy bài kiểm tra này và build app cho Simulator mỗi lần push.