PHPickerViewController tải video qua PHAsset

Oct 06 2020

PHPickerViewController cho phép truy cập vào các bản sao của nội dung thư viện ảnh cũng như trả về PHAssets trong kết quả. Để nhận PHAssets thay vì các bản sao tệp, tôi thực hiện:

        let photolibrary = PHPhotoLibrary.shared()
        var configuration = PHPickerConfiguration(photoLibrary: photolibrary)
        configuration.filter = .videos
        configuration.selectionLimit = 0
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        self.present(picker, animated: true, completion: nil)

Và sau đó,

 //MARK:- PHPickerViewController delegate

@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    
    picker.dismiss(animated: true) {
        let identifiers:[String] = results.compactMap(\.assetIdentifier)
        let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)
        
        NSLog("\(identifiers), \(fetchResult)")
    }
    
}

Nhưng vấn đề là khi bộ chọn ảnh bị loại bỏ, nó sẽ nhắc truy cập Thư viện ảnh gây nhầm lẫn và vì người dùng luôn ngầm cấp quyền truy cập vào các nội dung đã chọn trong PHPickerViewController, PHPhotoLibrary sẽ tải trực tiếp các nội dung đó. Có cách nào để tránh quyền Thư viện ảnh không?

Trả lời

2 matt Oct 06 2020 at 15:21

Có cách nào để tránh quyền Thư viện ảnh không?

Ừ kiểu vậy, chắc vậy:

  1. Thay đổi PHPickerConfiguration(photoLibrary: photolibrary)thànhPHPickerConfiguration()

  2. Đừng không sử dụng assetIdentifierđể trở về thư viện ảnh (nó sẽ được nilanyway)

Trong trường hợp đó, người dùng có thể cung cấp cho bạn dữ liệu hình ảnh nhưng chỉ có vậy. Bộ chọn nằm ngoài quy trình và không có dữ liệu nào từ chính thư viện thực sự xuất hiện, chỉ là một hình ảnh đơn thuần mà người dùng đã chọn rõ ràng.

Tuy nhiên, nếu mục tiêu của bạn thực sự là quay lại thư viện ảnh và lấy PHAsset, thì bạn phải có quyền, vì bây giờ bạn thực sự đang cố gắng thăm dò thư viện ảnh đằng sau hậu trường trong ứng dụng của mình.

Điều tôi làm, khi ứng dụng của tôi phụ thuộc vào thông tin PHAsset, là yêu cầu quyền thư viện ảnh (nếu cần) trước khi trình bày bộ chọn và tôi không xuất trình bộ chọn nếu tôi không thể xin phép. Vì vậy, người dùng nhấn vào một nút, tôi phát hiện ra chúng tôi không có quyền, tôi xin phép, chúng tôi nhận được nó (giả sử), và tôi trình bày bộ chọn (thực hiện bước nhảy không đồng bộ, vì quyền đến không đồng bộ). Trông rất tuyệt.

Nhân tiện, điều này cũng đúng với UIImagePickerController.