Vấn đềỨng dụng của bạn cuối cùng đã sẵn sàng. Bạn bắt đầu build, mong đợi một thông báo thành công, nhưng công cụ codesign dừng lại đột ngột với một lỗi kỳ lạ: resource fork, Finder information, or similar detritus not allowed. Điều này thường xảy ra trong giai đoạn 'Sign to Run Locally' hoặc khi lưu trữ (archiving) để phân phối.
Cho dù bạn đang sử dụng Xcode, ký mã nguồn (signing) qua terminal, hay các framework như Electron và Flutter, lỗi này xảy ra khi các tệp trong dự án của bạn chứa siêu dữ liệu (metadata) ẩn. Nói tóm lại, macOS từ chối ký các tệp 'bẩn' chứa thông tin bổ sung bên ngoài phân vùng dữ liệu chính (primary data fork).
Nguyên nhân gốc rễ: Thuộc tính mở rộng (Extended Attributes)Kể từ macOS 10.12 Sierra, quy trình ký mã nguồn đã trở nên cực kỳ nghiêm ngặt. Nó dựa vào Extended Attributes (xattrs)—các khối metadata lưu trữ thông tin về một tệp mà không làm thay đổi nội dung của nó. Các "thủ phạm" phổ biến bao gồm:
- com.apple.quarantine: Một cờ được thêm vào các tệp được tải xuống qua trình duyệt, Slack hoặc Discord.- com.apple.FinderInfo: Một khối 32-byte lưu trữ dữ liệu riêng biệt của Finder, như biểu tượng tùy chỉnh hoặc thẻ màu.- Resource Forks: Các cấu trúc dữ liệu cũ thường thấy trong các định dạng ảnh đời cũ hoặc các tệp được chỉnh sửa trong Photoshop.Codesign yêu cầu một mã băm (hash) tệp hoàn hảo và có thể dự đoán được. Vì các thuộc tính này có thể bị thay đổi mà không làm thay đổi dữ liệu chính của tệp, macOS coi chúng là một rủi ro bảo mật. Nếu chỉ một tệp
.pnghoặc.plistcó thuộc tính ẩn, toàn bộ chữ ký sẽ thất bại.
Xác định tệp gây lỗiĐể xem chính xác tệp nào đang chặn quá trình build của bạn, hãy chạy lệnh này trong thư mục dự án:
ls -al@ ./path/to/assets
Tìm các dòng bắt đầu bằng com.apple... ngay bên dưới tên tệp của bạn. Đó chính là những 'mảnh vụn' (detritus) gây ra lỗi.
Cách khắc phục: Loại bỏ MetadataGiải pháp là xóa bỏ đệ quy các thuộc tính này khỏi dự án của bạn. Dưới đây là ba cách để xử lý.
Cách 1: Xóa đệ quy (Tốt nhất để sửa lỗi ngay lập tức)Đây là giải pháp trực tiếp nhất. Mở terminal và sử dụng công cụ xattr với các cờ -c (clear - xóa) và -r (recursive - đệ quy) trên thư mục nguồn hoặc gói .app cuối cùng.
# Chạy lệnh này trên mã nguồn dự án hoặc cụ thể là gói .app của bạn
xattr -cr /path/to/your/project
Cách 2: Nhắm mục tiêu vào thư mục ResourcesCác thư mục tài nguyên (assets) là nơi dễ bị dính metadata của Finder nhất. Nếu bạn thường xuyên chỉnh sửa hình ảnh trong các ứng dụng bên ngoài, hãy tập trung làm sạch ở đó để giảm thiểu tác động đến các tệp khác.
xattr -cr ./Resources
Cách 3: Tự động hóa qua Xcode Build PhaseNgăn lỗi này quay trở lại bằng cách thêm một script làm sạch vào quy trình build của bạn. Điều này đặc biệt hữu ích cho các nhóm phát triển, nơi các lập trình viên có thể commit các tệp với các chữ ký metadata khác nhau.
- Mở dự án của bạn trong Xcode và chọn Target.- Chuyển đến tab Build Phases.- Nhấp vào dấu + và chọn New Run Script Phase.- Kéo phase này để nó chạy trước 'Copy Bundle Resources'.- Dán đoạn script sau:```
Làm sạch các thuộc tính từ các sản phẩm build để đảm bảo codesign vượt qua
find "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app" -type f -print0 | xargs -0 xattr -c
## Xác minh kết quảSau khi làm sạch, hãy xác minh xem gói ứng dụng đã hợp lệ để ký hay chưa:
codesign --verify --verbose /path/to/your.app
Một lần kiểm tra thành công sẽ không trả về kết quả nào hoặc hiển thị thông báo đơn giản 'valid on disk'. Nếu bạn thấy 'bundle format is ambiguous,' hãy kiểm tra kỹ xem bạn có vô tình xóa một thư mục hệ thống hay không; `xattr -c` chỉ ảnh hưởng đến metadata, vì vậy code của bạn vẫn được giữ nguyên.
## Cách ngăn ngừa tích tụ Metadata- **Làm sạch hình ảnh:** Sử dụng các công cụ CLI như `optipng` hoặc 'Save for Web' trong Photoshop. Việc này sẽ loại bỏ các khối metadata 32-byte không cần thiết trước khi chúng được đưa vào kho lưu trữ (repo).- **Vệ sinh Git:** Đảm bảo các tệp `.DS_Store` có trong tệp `.gitignore` của bạn. Đây là nguồn chính gây ra các 'mảnh vụn' Finder.- **Tải xuống qua Terminal:** Nếu bạn sử dụng `curl` hoặc `wget` để lấy tài nguyên, chúng thường sẽ không bị gắn cờ `com.apple.quarantine`, không giống như các tệp được tải xuống qua trình duyệt.

