Temporary Directory (tmp) là một thư mục trong hộp cát (sandbox) của ứng dụng iOS dùng để lưu trữ dữ liệu cực kỳ ngắn hạn chỉ cần trong phiên làm việc hiện tại của ứng dụng. Theo Apple File System Programming Guide (2024), hệ thống có thể xoá tmp khi kết thúc mỗi ứng dụng hoặc khởi động lại thiết bị. Không giống như Caches Directory, các tệp tạm thời trong tmp không được thiết kế để tồn tại giữa các lần khởi chạy — nhà phát triển phải xoá chúng một cách rõ ràng sau khi sử dụng để không lãng phí dung lượng đĩa.
Các điểm chính
Temporary Directory (còn được gọi là tmp) là một thư mục bên trong hộp cát của ứng dụng iOS được thiết kế để lưu trữ dữ liệu có vòng đời giới hạn trong phiên hiện tại. Đây là bộ nhớ có thời gian tồn tại ngắn nhất trong tất cả các thư mục của hộp cát.
iOS cung cấp tmp cho các thao tác cần lưu trữ tệp trung gian: tải tệp xuống trước khi di chuyển vào Documents, tạo bản sao tạm thời trước khi xuất, đệm dữ liệu phát trực tuyến. Sau khi hoàn thành thao tác, các tệp tạm thời phải được xoá.
Theo Tài liệu Apple Developer (2024), thư mục tmp rất đặc biệt vì đường dẫn của nó có thể thay đổi giữa các lần khởi chạy ứng dụng. iOS tạo một đường dẫn tmp mới mỗi lần khởi chạy — điều này đảm bảo dữ liệu từ phiên trước sẽ không bị đọc nhầm. Nhà phát triển không bao giờ được lưu đường dẫn tmp giữa các lần khởi chạy.
Quan trọng: không giống như Caches Directory, nơi dữ liệu có thể tồn tại qua nhiều lần khởi chạy, tmp không đảm bảo lưu trữ dữ liệu giữa các phiên về lâu dài. Đây là cách đáng tin cậy nhất để lưu trữ dữ liệu thực sự tạm thời.
Trong Swift, để lấy đường dẫn đến tmp, sử dụng hàm toàn cục NSTemporaryDirectory() hoặc FileManager.temporaryDirectory. Đây là các API đơn giản nhất trong tất cả các thư mục của hộp cát.
import Foundation
// Option 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// Option 2: FileManager.temporaryDirectory (URL)
let tempURL = FileManager.default.temporaryDirectory
let exportURL = tempURL.appendingPathComponent("export_temp.pdf")
Objective-C sử dụng cùng hàm toàn cục NSTemporaryDirectory(). Kết quả là một chuỗi chứa đường dẫn đầy đủ đến thư mục tạm thời của ứng dụng.
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
Sự khác biệt chính so với các thư mục khác: NSTemporaryDirectory() không yêu cầu chỉ định miền hoặc mặt nạ tìm kiếm — đây là một hàm toàn cục. Tuy nhiên, đường dẫn có thể thay đổi ở lần khởi chạy tiếp theo, vì vậy không bao giờ lưu nó trong UserDefaults hoặc bất kỳ bộ nhớ liên tục nào.
Temporary Directory được thiết kế cho một tập hợp các tình huống được xác định chặt chẽ. Các nhà phát triển thường nhầm lẫn tmp với Caches, đặt trong tmp dữ liệu đáng lẽ phải tồn tại lâu hơn một phiên. Hãy xem xét các trường hợp sử dụng đúng.
Các tệp được tạo trong quá trình xuất dữ liệu: bản sao tạm thời của báo cáo trước khi gửi qua email, tệp nén trước khi tải lên, tệp trung gian chuyển đổi định dạng. Sau khi xuất hoàn tất, tệp phải được xoá.
Bộ đệm tạm thời để ghi âm thanh, video hoặc dữ liệu phát trực tuyến được xử lý theo thời gian thực. Ví dụ, ghi âm giọng nói trước khi lưu vào bộ nhớ vĩnh viễn hoặc đệm luồng video trong khi phát trực tuyến.
| Tình huống | Thư mục | Lý do |
|---|---|---|
| Xuất PDF trước khi gửi | tmp | Tệp không cần sau khi gửi |
| Lưu cache hình ảnh | Caches | Hữu ích giữa các phiên |
| Tải tệp trước khi di chuyển | tmp | Lưu trữ trung gian |
| Nhật ký phiên | tmp | Chỉ liên quan trong phiên |
| Chỉnh sửa tài liệu | tmp | Phiên bản trước khi lưu |
Nếu dữ liệu chỉ cần ở đây và bây giờ — hãy sử dụng tmp. Nếu có thể hữu ích trong phiên tiếp theo — hãy sử dụng Caches. Nếu mất dữ liệu là không thể chấp nhận — hãy sử dụng Documents.
iOS quản lý vòng đời của tmp khác với các thư mục hộp cát khác. Hiểu được chu kỳ này rất quan trọng để thiết kế bộ nhớ tệp phù hợp trong ứng dụng.
Ở mỗi lần khởi chạy, iOS có thể cấp phát một đường dẫn mới cho tmp. Đường dẫn trước đó trở nên không thể truy cập, mặc dù các tệp vật lý có thể vẫn còn trên đĩa cho đến khi thiết bị khởi động lại. Đây là lý do Apple khuyên không nên lưu đường dẫn tmp giữa các phiên.
Theo Apple Tech Note TN2150 (2024), hệ thống có thể xoá tmp trong các trường hợp sau: khởi động lại thiết bị, đạt giới hạn dung lượng đĩa, dỡ ứng dụng (Offload). Không giống Caches, tmp không được thiết kế để lưu trữ dữ liệu ngay cả qua nhiều lần khởi chạy — đây là bộ nhớ kém tin cậy nhất trong hộp cát.
Nhà phát triển phải xoá rõ ràng các tệp tạm thời sau khi hoàn thành thao tác bằng FileManager.removeItem(at:). Các tệp không được xoá trong tmp sẽ tích tụ và lãng phí dung lượng đĩa — iOS không đảm bảo tự động dọn dẹp chúng trong tương lai gần.
So sánh tmp và Caches giúp các nhà phát triển đưa ra quyết định đúng đắn khi chọn thư mục lưu trữ. Lựa chọn sai có thể dẫn đến mất dữ liệu sớm hoặc tiêu tốn không gian không cần thiết.
| Tham số | Temporary Directory | Caches Directory |
|---|---|---|
| Vòng đời | Chỉ phiên hiện tại | Giữa các phiên (không đảm bảo) |
| Thay đổi đường dẫn | Có thể thay đổi mỗi lần khởi chạy | Đường dẫn ổn định |
| Tự động dọn dẹp | Khi khởi động lại, khi dỡ | Khi thiếu dung lượng |
| Xoá bởi nhà phát triển | Bắt buộc sau thao tác | Khuyến nghị khi vượt quá giới hạn |
| Sử dụng | Thao tác trung gian | Cache liên tục |
Quy tắc thực tế: chọn tmp cho dữ liệu sẽ bị xoá trong vài giây hoặc vài phút sau khi tạo. Chọn Caches cho dữ liệu hữu ích khi giữ lại trong vài giờ hoặc vài ngày giữa các phiên nhưng có thể tái tạo.
Làm việc với Temporary Directory đòi hỏi kỷ luật: vì dữ liệu trong tmp có tuổi thọ ngắn và sự tích tụ của chúng có thể dẫn đến lãng phí không gian, các nhà phát triển nên tuân theo một số thực hành chính.
FileManager.removeItem(at:) nên được gọi ngay sau khi hoàn thành thao tác với tệp tạm thời. Sử dụng defer trong Swift để đảm bảo xoá ngay cả khi xảy ra lỗi.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// Work with temp file
try "temporary data".write(to: tempURL, atomically: true)
// ... file operation ...
// defer executes when scope exits
Nếu dữ liệu có thể cần sau một giờ kể từ khi tạo — hãy lưu nó trong Caches hoặc Application Support. tmp được thiết kế cho các thao tác trong vài phút, không phải để lưu trữ.
Tuân theo các quy tắc này đảm bảo các tệp tạm thời không tích tụ, dung lượng đĩa được sử dụng hiệu quả và ứng dụng xử lý đúng các tình huống dọn dẹp hệ thống tệp iOS.
Câu hỏi thường gặp
Thông thường đường dẫn không thay đổi trong cùng một phiên, nhưng iOS không đảm bảo điều này. Trong một số trường hợp hiếm, hệ thống có thể thay đổi tmp khi ứng dụng chuyển từ nền lên tiền cảnh. Do đó, Apple khuyên gọi NSTemporaryDirectory() mỗi khi cần đường dẫn thay vì lưu nó trong biến.
Các tệp sẽ tích tụ và chiếm dung lượng đĩa. iOS có thể xoá tmp khi khởi động lại thiết bị, nhưng cho đến lúc đó ứng dụng sẽ lãng phí dung lượng đĩa. Khi tích tụ đáng kể, người dùng có thể thấy trong cài đặt bộ nhớ rằng ứng dụng đang chiếm nhiều dung lượng.
Có, bạn có thể sử dụng DataProtectionType với NSFileProtectionComplete cho các tệp tạm thời chứa dữ liệu nhạy cảm. Tuy nhiên, hãy nhớ: nếu tệp chỉ được đọc trong phiên hiện tại và sau đó bị xoá, mã hoá có thể là không cần thiết. Đánh giá nhu cầu mã hoá dựa trên loại dữ liệu.
Sử dụng ProcessInfo.processInfo.globallyUniqueString để tạo mã nhận dạng duy nhất hoặc UUID().uuidString. FileManager cũng cung cấp phương thức urlForCreatingTemporaryFile, tự động tạo tên duy nhất trong tmp. Điều này đảm bảo không có xung đột khi ghi song song.
Gián tiếp — có. Apple chú ý đến tổng dung lượng dữ liệu mà ứng dụng lưu trữ trên đĩa. Nếu tmp chứa hàng gigabyte tệp chưa được xoá, người duyệt có thể từ chối ứng dụng. Giới hạn được khuyến nghị cho tmp là không quá 100 MB tại bất kỳ thời điểm nào. Thường xuyên dọn dẹp tmp và kiểm tra kích thước qua FileManager.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm