Как отфильтровать изображения, показанные в PHPickerViewController, на изображения, выбранные для ограниченного доступа
Как мне отфильтровать изображения, показанные в PHPickerViewController, на изображения, выбранные пользователем с ограниченным доступом? Или мне нужно использовать другой сборщик? Я борюсь с этим уже несколько дней. Любая помощь будет оценена по достоинству. Заранее спасибо.
Когда пользователь нажимает кнопку:1-5 автоматически
Предупреждение появляется с камерой или библиотекой фотографий.
Они выбирают библиотеку фотографий
Появляется предупреждение об авторизации с указанием «Выбрать фото…», «Разрешить доступ ко всем фотографиям» или «Не разрешать».
Они нажимают Select Photos = .limited.
Отображается presentLimitedLibraryPicker, где пользователь выбирает фотографии, которые он хочет разрешить, и нажимает Готово.
Теперь я хочу, чтобы появилось средство выбора с отфильтрованным выбором изображений, которые только что выбрал пользователь. Похоже, это тоже будет автоматически. Нет...
Это отображает только то же средство выбора, в котором пользователь сделал выбор для ограниченного доступа.
PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: self)
Что входит в случай .limited?
var config = PHPickerConfiguration()
config.selectionLimit = 1
config.filter = PHPickerFilter.any(of: [.images, .livePhotos])
let picker_Photo = PHPickerViewController(configuration: config)
picker_Photo.delegate = self
let libCell = UIAction(title: "Photo Library", image: UIImage(systemName: "photo"), identifier: .none, discoverabilityTitle: .none) { (libAction) in
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
{
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
switch status
{
case .limited:
DispatchQueue.main.async
{
// PHPhotoLibrary.shared().register(self)
// PHPhotoLibrary.shared().presentLimitedLibraryPicker
self.present(picker_Photo, animated: true, completion: nil)
}
case .authorized:
DispatchQueue.main.async
{
self.present(picker_Photo, animated: true, completion: nil)
}
case .notDetermined:
DispatchQueue.main.async
{
self.present(picker_Photo, animated: true, completion: nil)
}
case .restricted:
self.view.sendConfirmationAlert(theTitle: "Photo Library Restricted",
theMessage: "Photo Library access was previously denied. Please update your Settings to allow access.", buttonTitle: "Ok")
case .denied:
let settingsAlert = UIAlertController(title: "Photo Library Access Denied",
message: "Photo Library access was previously denied. Please update your Settings to allow access.", preferredStyle: .alert)
let settingsAction = UIAlertAction(title: "Go to Settings", style: .default) { ( action ) in
let settingsUrl = URL(string: UIApplication.openSettingsURLString)
UIApplication.shared.open(settingsUrl!, options: [:])
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
DispatchQueue.main.async
{
settingsAlert.addAction(settingsAction)
settingsAlert.addAction(cancelAction)
self.present(settingsAlert, animated: true)
}
default:
return
}
}
}
}
1 ответ
Вы ошибаетесь насчет того, что означает ограниченный доступ. Он ограничивает то, какую информацию вы можете читать и записывать в библиотеку фотографий .
Но ваш код вообще не читает из библиотеки фотографий. Ты говоришь
config = PHPickerConfiguration()
Это означает, что у вас вообще нет доступа к библиотеке фотографий через средство выбора. Вы можете получить только копии изображений. Поэтому вам не нужно никаких разрешений, чтобы показывать средство выбора, и ограничение пользователя не имеет для вас никакого значения . Фактически, вы можете просто выбросить весь свой код авторизации; это не имеет никакого эффекта. Ваш сборщик без него будет работать точно так же.
Если вам нужен доступ к библиотеке фотографий с помощью средства выбора, вы бы позвонили
https://developer.apple.com/documentation/photokit/phpickerconfiguration/3616114-init
В этом случае для вас будет иметь значение ограничение пользователя - когда вы попытаетесь получить доступ к фактическому PHAsset. Но ваш код никогда этого не делает. Вы просите разрешение, которое вам не нужно.