Что я пытаюсь сделать, так это сохранить видео в PHPhotoLibrary, а затем удалить их, когда загрузка на клиентский удаленный сервер в приложении завершается (по сути, библиотека фотографий служит временным хранилищем для добавления дополнительного уровня безопасности в случае, если что-либо вообще не удается (я уже сохранил мои видео в каталоге приложений).
Проблема:
Проблема в том, что для того, чтобы это работало, все должно работать без участия пользователя. Вы можете записать видео в библиотеку фотографий следующим образом:
func storeVideoToLibraryForUpload(upload : SMUpload) {
if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.Authorized {
// Don't write to library since this is disallowed by user
return
}
PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
// Write asset
let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(fileURLWithPath: upload.nonsecureFilePath!)!)
let assetPlaceholder = assetRequest.placeholderForCreatedAsset
let localIdentifier = assetPlaceholder.localIdentifier
// Store local identifier for later use
upload.localAssetIdentifier = localIdentifier
}, completionHandler: { (success, error) -> Void in
....
})
}
И это работает безотказно, я получаю локальный идентификатор, сохраняю его для дальнейшего использования.. Единороги и радуги.
Теперь, когда я хочу удалить это видео сразу после завершения загрузки, я вызываю следующее:
func removeVideoFromLibraryForUpload(upload : SMUpload) {
// Only proceed if there is asset identifier (video previously stored)
if let assetIdentifier = upload.localAssetIdentifier {
// Find asset that we previously stored
let assets = PHAsset.fetchAssetsWithLocalIdentifiers([assetIdentifier], options: PHFetchOptions())
// Fetch asset, if found, delete it
if let fetchedAssets = assets.firstObject as? PHAsset {
PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
// Delete asset
PHAssetChangeRequest.deleteAssets([fetchedAssets])
}, completionHandler: { (success, error) -> Void in
...
})
}
}
}
Что успешно удаляет видео, НО пользователь должен сначала подтвердить удаление. Это проблема, так как резервное копирование не будет работать.
Я, очевидно, знаю, почему есть подтверждение (например, вы не очищаете всю пользовательскую библиотеку, но дело в том, что мое приложение сделало видео, и поэтому я подумал, что это можно обойти, поскольку как «владелец» я должен не делать этого или, по крайней мере, иметь возможность отключить подтверждение.
Заранее спасибо!
TLDR: как отключить подтверждение при запросе на удаление, если это содержимое было создано моим приложением? (Я не хочу ничего удалять).
Примечание: Кто-то, вероятно, может сказать, что это довольно странная вещь, но приложение распространяется внутри компании, и есть веская причина делать это таким образом (видеоконтент слишком ценен, чтобы его можно было потерять, даже если пользователь удаляет приложение по какой-то причине или вообще что-то идет не так, нам нужно иметь возможность сохранять видео), поэтому, пожалуйста, не задавайтесь этим вопросом, а просто сосредоточьте свое внимание на вопросе :)