AutoFlowRPA đã chạy trên macOS
Vẫn là trình soạn thảo trực quan đó, vẫn 339 command đó, nay là ứng dụng native cho Apple silicon — kèm câu chuyện đưa engine chạy được bên trong một .app bundle.
26 thg 9, 2026
AutoFlowRPA là ứng dụng Windows từ ngày đầu. Từ v0.1.22 đã có thêm bản macOS: ứng dụng native cho Apple silicon, cùng canvas, cùng engine, cùng workflow.
Anh chị tải từ dashboard, hoặc lấy trực tiếp ở release v0.1.22.
Có những gì
339 trong số 369 command chạy được trên macOS. Mọi thứ không phụ thuộc vào Windows đều giữ nguyên:
- Web — automation trình duyệt bằng Playwright, có profile thật, proxy, fingerprint
- Excel (44 command), Word, PDF — qua openpyxl và python-docx, phần lớn không cần cài Office
- AI (19 command), Gmail, Google Sheets & Drive, HTTP/REST
- Video (27 command) và tải media, qua FFmpeg và yt-dlp
- Image và OCR, database, clipboard, mã hoá, file, trigger, variable, transform dữ liệu
Thiếu gì, và vì sao
Ba mươi command phụ thuộc vào API của Windows, không có thứ tương đương trên macOS. Chúng được ẩn khỏi palette thay vì để đó rồi lỗi khi chạy:
| Nhóm | Số command | Phụ thuộc |
|---|---|---|
| UIAutomation | 11 | Windows UI Automation |
| Window | 10 | Quản lý cửa sổ Win32 |
| Outlook | 6 | Outlook COM |
| Run PowerShell, Run CMD | 2 | Shell của Windows |
| Run Excel Macro | 1 | Excel VBA qua COM |
Element picker và recorder trên desktop cũng ẩn vì lý do đó. Picker và recorder cho trình duyệt vẫn hoạt động bình thường — chúng chưa bao giờ dùng API Windows.
Hai điều cần biết trước khi cài
Chỉ hỗ trợ Apple silicon. Chưa có bản Intel. Nếu có nhu cầu chúng tôi sẽ làm, pipeline build đã sẵn sàng cho việc đó.
Bản này chưa notarize. Notarize cần tài khoản Apple Developer trả phí, nên macOS sẽ từ chối mở ở lần chạy đầu. Cách chắc chắn nhất là xoá cờ quarantine:
xattr -dr com.apple.quarantine /Applications/AutoFlowRPA.app
Sau lần bị chặn đầu tiên, anh chị cũng có thể thấy nút Open Anyway trong System Settings → Privacy & Security. Đừng trông chờ vào mẹo Control-click cũ — macOS đã bỏ cách đó, và ứng dụng ký ad-hoc thường bị báo là "damaged" mà không hiện lựa chọn nào cả.
Cấp hai quyền khi dùng lần đầu. Command bàn phím và chuột cần Accessibility; chụp màn hình cần Screen Recording. Cả hai nằm trong System Settings → Privacy & Security. Điều này quan trọng hơn vẻ ngoài của nó: macOS không báo lỗi khi thiếu quyền. Command input im lặng không làm gì, còn ảnh chụp trả về màn hình trống. Nếu workflow chạy xong mà không thay đổi gì, hãy kiểm tra quyền trước tiên.
Phần thú vị: vì sao port không bao giờ chỉ là biên dịch lại
Code cross-platform đã viết từ nhiều tháng trước và biên dịch trót lọt. Ứng dụng vẫn không chạy được, và lý do là minh hoạ khá rõ cho khác biệt giữa "build được" và "chạy được".
Engine không khởi động nổi bên trong bundle. AutoFlowRPA chạy engine Python
như một sidecar process bên cạnh vỏ desktop. Trên Windows vỏ và payload runtime
của engine nằm cùng một thư mục nên engine tìm thấy thứ nó cần. Một .app của
macOS tách đôi: file thực thi vào Contents/MacOS, resource vào
Contents/Resources. PyInstaller thấy binary của mình ở Contents/MacOS nên đi
tìm runtime Python ở Contents/Frameworks — nơi không có gì cả. Ứng dụng mở lên
và engine chết ngay từ đầu.
Chuyển payload vào Contents/Frameworks thì engine chạy. Nhưng nó làm bundle
không ký được: thư mục đó chỉ được chứa framework và dylib, và code signing
từ chối toàn bộ ứng dụng chỉ vì một thư mục .dist-info lạc chỗ. Bundle không
ký được thì không phát hành được trên Apple silicon. Cách xử lý là giữ nguyên
cây runtime trong Contents/Resources và dạy vỏ Rust khởi chạy nó từ đó.
Stop phải được chứng minh, không phải mặc định là đúng. Dừng một workflow
phải diệt cả cây tiến trình — engine cộng với mọi thứ nó sinh ra: trình duyệt,
FFmpeg, một tiến trình đang ngủ. Bản Unix đặt engine vào process group riêng rồi
diệt cả group. Đoạn code đó trước nay chỉ được biên dịch chứ chưa từng chạy.
Hoá ra trình duyệt Playwright tự thoát khi tiến trình cha chết, nên một phép thử
ngây thơ sẽ pass dù logic group có đúng hay không. Đo bằng workflow sinh thêm
một lệnh sleep thường: diệt cả process group để lại không tiến trình mồ
côi nào, diệt mỗi process id thì sleep vẫn sống.
Một command nói dối về việc nó thành công. Export PDF báo thành công mà không tạo ra file. Thư viện bên dưới điều khiển Microsoft Word qua AppleScript, và khi timeout nó in lỗi ra rồi trả về bình thường chứ không raise. Với automation chạy không người trông, một thành công giả còn tệ hơn là crash, nên giờ command tự kiểm tra file có tồn tại không trước khi báo bất cứ điều gì.
Không lỗi nào trong số này bị bắt bởi một build server chỉ kiểm tra xem trình biên dịch có hài lòng hay không.
Tiếp theo
Bản Intel, notarize, và đóng nốt hai lỗi âm thầm còn lại — phát hiện sớm việc thiếu quyền Accessibility hay Screen Recording, thay vì để workflow chạy rồi không làm gì.
Nếu anh chị gặp vấn đề trên macOS, báo cho chúng tôi từ dashboard. Bản macOS còn mới, và phản hồi của anh chị là cách nhanh nhất để nó được sửa.