On-Demand Resources: khái niệm, cơ chế yêu cầu và lưu trữ tài nguyên

Tác giả: IT Sectr Đã đăng: 2026-04-17 Thời gian đọc: 9 phút

On-Demand Resources là công nghệ của Apple dành cho việc tải nội dung ứng dụng trì hoãn. Thay vì bao gồm tất cả tài nguyên trong gói cài đặt, các nhà phát triển lưu trữ chúng trên máy chủ App Store và yêu cầu khi cần. Theo Apple ODR Guide, điều này giảm kích thước cài đặt ban đầu và cho phép thêm nội dung mới mà không cần cập nhật phiên bản ứng dụng.

Các điểm chính

  • On-Demand Resources — cơ chế tải tài nguyên theo yêu cầu sau khi cài đặt ứng dụng
  • Tài nguyên được lưu trữ trên máy chủ Apple và được yêu cầu qua NSBundleResourceRequest
  • Thẻ nhóm các tài nguyên theo khối chức năng của ứng dụng
  • Prefetching cho phép tải trước tài nguyên để cải thiện trải nghiệm người dùng
  • Hạn ngạch lưu trữ bị giới hạn và yêu cầu sự giám sát của nhà phát triển

On-Demand Resources trong iOS là gì

On-Demand Resources (ODR) là hệ thống quản lý nội dung được tích hợp trong iOS, tvOS và macOS. Nó cho phép nhà phát triển chia tài nguyên ứng dụng thành bắt buộc (bao gồm trong gói cài đặt) và theo yêu cầu (được lưu trữ trong App Store và tải xuống khi cần).

Các khái niệm chính của ODR

Hệ thống ODR hoạt động với ba thực thể chính: thẻ, gói tài nguyênyêu cầu. Thẻ là một định danh chuỗi nhóm một tập hợp các tệp. Gói tài nguyên là một tập dữ liệu liên kết với một thẻ. Yêu cầu là một lời gọi lập trình tới NSBundleResourceRequest khởi tạo việc tải gói.

Vòng đời yêu cầu tài nguyên

Việc tải tài nguyên trải qua nhiều giai đoạn: khởi tạo yêu cầu với các thẻ được chỉ định, kiểm tra tính khả dụng trong bộ nhớ cục bộ, tải xuống từ máy chủ Apple nếu không có, thông báo cho ứng dụng khi sẵn sàng và giải phóng tài nguyên sau khi sử dụng. Hệ thống tự động quản lý bộ nhớ đệm và việc xóa các tài nguyên không sử dụng.

Giai đoạnHành động hệ thốngThời gian thực hiện
Khởi tạoTạo NSBundleResourceRequest với một thẻTức thời
Kiểm tra bộ nhớ đệmTìm kiếm tài nguyên trong bộ nhớ cục bộ0,1–0,5 giây
Tải xuốngTải xuống từ CDN ApplePhụ thuộc vào kích thước
Thông báoGọi trình xử lý hoàn thành hoặc ủy quyềnTức thời
Giải phóngĐánh dấu tài nguyên có thể bị xóa bởi hệ thốngTheo yêu cầu iOS

Cách ODR hoạt động trong iOS

Cơ chế ODR dựa trên một dịch vụ nền quản lý các yêu cầu tài nguyên từ bộ nhớ đám mây App Store. Khi ứng dụng yêu cầu một thẻ, hệ thống kiểm tra xem tài nguyên có tồn tại trong bộ nhớ đệm cục bộ không. Nếu không — nó bắt đầu tải xuống qua một phiên URL nền với hỗ trợ tiếp tục cho các kết nối bị gián đoạn.

Quản lý yêu cầu qua NSBundleResourceRequest

swift
import Foundation

class ResourceManager {
    let odrRequest = NSBundleResourceRequest(tags: ["level-3"])

    func loadLevel3() {
        odrRequest.conditionallyBeginAccessingResources { available in
            if available {
                self.startLevel3()
            } else {
                self.odrRequest.beginAccessingResources { error in
                    guard error == nil else { return }
                    self.startLevel3()
                }
            }
        }
    }

    func releaseResources() {
        odrRequest.endAccessingResources()
    }
}

Phương thức conditionallyBeginAccessingResources kiểm tra tính khả dụng của tài nguyên trong bộ nhớ đệm mà không tải ngay lập tức. Nếu cờ khả dụng tích cực — ứng dụng tiếp tục mà không chậm trễ. Nếu tài nguyên vắng mặt, beginAccessingResources bắt đầu tải xuống với chỉ báo tiến trình qua thuộc tính progress.

Tải nền và ưu tiên

iOS quản lý mức độ ưu tiên tải tài nguyên ODR dựa trên hoạt động hiện tại của ứng dụng. Khi ứng dụng ở nền trước, việc tải được thực hiện với ưu tiên cao. Ở nền sau, iOS có thể trì hoãn việc tải hoặc tạm dừng khi pin yếu.

  • Ưu tiên cao — tải ngay lập tức cho các tài nguyên cần ngay bây giờ
  • Ưu tiên thấp — tải trì hoãn cho prefetching và lưu trữ đệm sơ bộ
  • Nền sau — chỉ tải khi có Wi-Fi hoạt động và đủ pin

Các loại tài nguyên và thẻ ODR

Tài nguyên ODR có thể bao gồm hình ảnh, video, tệp âm thanh, sprite, dữ liệu cấp độ và bất kỳ tệp nào khác không quan trọng đối với việc khởi chạy ứng dụng. Mỗi tài nguyên được gắn với một hoặc nhiều thẻ xác định sự thuộc về khối chức năng của nó.

Gắn thẻ nội dung trong Xcode

Trong Xcode, các thẻ được cấu hình qua trình kiểm tra Resource Tags trên tab Target Membership. Nhà phát triển chỉ định cho mỗi tệp dự án xem nó có được bao gồm trong gói chính hay được tải bằng thẻ. Một tệp có thể thuộc về nhiều thẻ, cho phép tái sử dụng tài nguyên trên các phần khác nhau của ứng dụng.

xml
<!-- Ví dụ cấu hình Resource Tags trong Info.plist -->
<key>NSBundleResourceRequestTags</key>
<dict>
    <key>level-3</key>
    <array>
        <string>levels/level3.scnassets</string>
        <string>textures/level3_tex.png</string>
    </array>
</dict>

Các danh mục thẻ theo thời gian sống

Apple phân biệt ba danh mục thẻ ODR dựa trên thời gian mà một tài nguyên nên ở lại trên thiết bị. Thẻ cài đặt ban đầu được tải cùng với ứng dụng và không bao giờ bị hệ thống xóa. Thứ tự thẻ prefetch xác định trình tự tải trước nền ngay sau khi cài đặt. Các thẻ chính được yêu cầu theo yêu cầu và có thể bị iOS xóa khi dung lượng thấp.

Ngoài các danh mục, mỗi thẻ có thể có mức ưu tiên tải xuống. Các thẻ có ưu tiên cao được tải trước các thẻ ưu tiên thấp, ngay cả khi chúng được yêu cầu sau. Điều này cho phép nhà phát triển kiểm soát thứ tự xuất hiện nội dung: đầu tiên là các tài nguyên quan trọng cho màn hình chính, sau đó là các tài liệu bổ sung cho các phần sâu của ứng dụng.

  • Thẻ cài đặt ban đầu — được tải trong lần cài đặt đầu tiên, không bị hệ thống xóa
  • Thẻ được tải trước — được tải nền sau khi cài đặt để cải thiện trải nghiệm người dùng
  • Thẻ theo yêu cầu — được yêu cầu bằng lập trình, có thể bị iOS xóa khi dung lượng thấp

Cấu hình On-Demand Resources trong Xcode

Thiết lập ODR trong Xcode bao gồm ba giai đoạn: phân loại tài nguyên theo thẻ, cấu hình tham số tải xuống trong Info.plist và triển khai yêu cầu bằng lập trình qua NSBundleResourceRequest. Phần lớn công việc được thực hiện ở phía xây dựng.

Phân loại trong Target Membership

swift
// Kiểm tra trạng thái và theo dõi tiến trình ODR
func monitorODRProgress(tag: String) {
    let request = NSBundleResourceRequest(tags: [tag])
    let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
        DispatchQueue.main.async {
            let percent = Int(progress.fractionCompleted * 100)
            print("ODR: \(percent)% đã tải")
        }
    }
}

Tiến trình tải xuống được theo dõi qua thuộc tính progress của lớp NSProgress với hỗ trợ quan sát KVO. Ứng dụng có thể hiển thỊ chỉ báo tải cho người dùng trong quá trình tải tài nguyên. Sau khi tải hoàn tất, các tài nguyên có sẵn trong gói ứng dụng chính qua cơ chế FileManager và NSDataAsset tiêu chuẩn.

Tham số hạn ngạch và giới hạn

Hạn ngạch ODR phụ thuộc vào phiên bản iOS. Bắt đầu từ iOS 13, một thiết bị có thể lưu trữ tới 20 GB tài nguyên theo yêu cầu trên một tài khoản. Dung lượng này được chia sẻ giữa tất cả các ứng dụng được cài đặt trên thiết bị — nếu một ứng dụng chiếm nhiều dung lượng, thì các ứng dụng khác sẽ có ít hơn.

Giám sát dung lượng đã sử dụng được thực hiện qua NSBundleResourceRequest. Ứng dụng có thể kiểm tra dung lượng ODR khả dụng và quyết định tài nguyên nào sẽ được tải trước. Nên triển khai cơ chế dự phòng: nếu dung lượng ODR đầy, hãy sử dụng tài nguyên chất lượng giảm từ gói chính.

Khi vượt quá hạn ngạch, hệ thống sẽ xóa các tài nguyên được gắn thẻ theo yêu cầu theo thứ tự ít được sử dụng gần đây nhất, bắt đầu từ các tài nguyên cũ nhất. Trình quản lý tài nguyên trong mã ứng dụng có thể theo dõi việc sử dụng dung lượng ODR hiện tại qua thuộc tính NSBundleResourceRequest.

Các nhà phát triển phải cân nhắc rằng iOS có thể quyết định xóa tài nguyên theo yêu cầu bất cứ lúc nào — ứng dụng phải xử lý chính xác các tình huống mà tài nguyên đã tải trước đó đột nhiên không khả dụng. Nên chặn các lỗi truy cập tài nguyên và yêu cầu lại chúng qua beginAccessingResources. Đối với các tài nguyên quan trọng mà không có chúng ứng dụng không thể hoạt động, hãy sử dụng thẻ cài đặt ban đầu không bị hệ thống xóa.

Ưu điểm và hạn chế của ODR

On-Demand Resources cung cấp cho nhà phát triển một công cụ linh hoạt để quản lý kích thước ứng dụng, nhưng áp đặt một số hạn chế liên quan đến khả năng khả dụng mạng và chính sách lưu trữ iOS.

Ưu điểm khi sử dụng ODR

Ưu điểm chính của ODR là giảm triệt để kích thước cài đặt ban đầu. Các trò chơi có nhiều cấp độ, ứng dụng có nội dung video hoặc bộ hình ảnh lớn có thể tải nội dung theo từng phần. Người dùng có quyền truy cập vào chức năng cơ bản ngay lập tức, trong khi các tài nguyên bổ sung được tải ở nền sau.

Hạn chế của công nghệ

ODR yêu cầu kết nối Internet liên tục để tải tài nguyên khi truy cập lần đầu. Người dùng ở các khu vực có vùng phủ sóng kém có thể gặp phải sự chậm trễ và lỗi tải xuống. Ngoài ra, Apple không đảm bảo rằng các tài nguyên đã tải xuống sẽ vẫn còn trên thiết bị — khi dung lượng thấp, iOS có thể xóa các thẻ theo yêu cầu mà không cảnh báo.

  • Yêu cầu mạng — yêu cầu tài nguyên đầu tiên cần kết nối Internet
  • Tự động xóa — iOS có thể xóa bộ nhớ đệm khi dung lượng thiết bị thấp
  • Phức tạp khi gỡ lỗi — tái tạo sự cố tải yêu cầu mô phỏng các điều kiện mạng khác nhau
  • Kích thước thẻ — Apple khuyên không vượt quá 512 MB cho mỗi thẻ để có hiệu suất tối ưu
  • Xử lý lỗi — ứng dụng phải xử lý chính xác các lỗi tải và thử lại yêu cầu

Câu hỏi thường gặp

Có thể sử dụng ODR để thêm nội dung động mà không cập nhật ứng dụng không?

ODR cho phép thêm và sửa đổi tài nguyên mà không cần phát hành phiên bản mới trên App Store. Chỉ cần cập nhật các tệp trên máy chủ Apple qua Xcode và gán chúng vào cùng các thẻ. Ở yêu cầu tiếp theo, ứng dụng sẽ nhận được phiên bản mới nhất của tài nguyên. Điều này thuận tiện cho nội dung theo mùa, khuyến mãi tạm thời và thử nghiệm A/B các hình ảnh và bố cục mới.

iOS quản lý việc xóa tài nguyên ODR khi thiếu dung lượng như thế nào?

Hệ thống xóa các tài nguyên được gắn thẻ theo yêu cầu khi cần giải phóng dung lượng cho các ứng dụng khác. Các tài nguyên thẻ cài đặt ban đầu không bị xóa. Thứ tự xóa được xác định bởi thuật toán LRU (Least Recently Used) — các tài nguyên không được truy cập lâu nhất sẽ bị xóa đầu tiên.

Kích thước tài nguyên ODR tối đa cho một ứng dụng là bao nhiêu?

Từ iOS 13, giới hạn dung lượng ODR tổng cộng là 20 GB cho mỗi người dùng Apple ID. Kích thước của một thẻ không được vượt quá 512 MB để có hiệu suất tải xuống tối ưu. Khi vượt quá giới hạn, các yêu cầu thất bại với NSBundleResourceRequestLowDiskSpaceError.

ODR có hoạt động ngoại tuyến sau khi tải lần đầu không?

Có, sau khi tải xuống, tài nguyên được lưu trong bộ nhớ đệm cục bộ và có sẵn trong chế độ ngoại tuyến mà không cần kết nối Internet. Sự cố chỉ phát sinh nếu iOS đã xóa tài nguyên do thiếu dung lượng và người dùng cố gắng truy cập nó mà không có mạng.

ODR khác gì so với tải tệp đơn giản qua URLSession?

ODR được tích hợp với cơ sở hạ tầng App Store: tài nguyên được lưu trữ trên CDN của Apple, được quản lý bởi hệ thống bộ nhớ đệm và không yêu cầu nhà phát triển thiết lập máy chủ riêng. URLSession yêu cầu cơ sở hạ tầng máy chủ, kiểm soát phiên bản và quản lý bộ nhớ đệm thủ công. ODR cũng tự động xử lý việc tiếp tục tải xuống khi kết nối bị gián đoạn.

Tổng kết

  • On-Demand Resources — một công nghệ tải nội dung trì hoãn trong ứng dụng iOS và tvOS
  • Hệ thống dựa trên các thẻ nhóm tài nguyên và yêu cầu qua NSBundleResourceRequest
  • Tất cả các loại tệp được hỗ trợ: hình ảnh, video, âm thanh, sprite và dữ liệu cấp độ
  • Danh mục thẻ — cài đặt ban đầu, được tải trước và theo yêu cầu với các chính sách lưu trữ khác nhau
  • Giới hạn lưu trữ — 20 GB cho mỗi Apple ID, tối đa 512 MB cho mỗi thẻ
  • Kích thước cài đặt được giảm bằng cách di chuyển tài nguyên từ gói chính lên máy chủ Apple
  • Khuyến nghị — sử dụng ODR cho trò chơi, ứng dụng nội dung đa phương tiện và dự án có cấu trúc nhiều cấp

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.

Thảo luận dự án

Đọc thêm