我想做的是将视频保存到 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
....
})
}
这完美地工作了,我得到了本地标识符,我存储它供以后使用。 unicorn 和彩虹。
现在,当我想在上传完成后立即删除该视频时,我调用以下方法:
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:如果我的应用程序创建了该内容,我如何禁用对删除请求的确认? (我不想删除任何其他内容)。
注意:有人可能会说这是相当奇怪的事情,但应用程序是在内部分发的,这样做是有充分理由的(视频内容太有值(value)了,不能丢失,即使用户出于某种原因删除应用程序,或者出现任何问题,我们也需要能够保留视频),所以请不要质疑,只需将注意力集中在问题上:)
最佳答案
我看不到避免删除确认的方法。它是照片框架的一个实现细节,类似于您无法阻止设备在您的应用程序尝试使用麦克风时请求用户允许使用麦克风的方式,这是一个安全和信任问题。将 Assets 保存到设备照片库后,您的应用程序不再是该 Assets 的所有者,因此正如您在问题中指出的那样,设备当然必须确保该应用程序在删除此类数据之前获得用户的许可。
您永远无法完全保护用户的数据免受他们不可预测的行为的影响 - 如果他们决定删除您的应用程序,或从照片中删除特定 Assets ,这取决于他们。我认为你最好的选择是要么忍受内置的删除确认,要么为你的用户提供指南,明确他们应该通过备份他们的设备来小心保护这些重要数据,并且 不删除应用程序!
如果您确实决定坚持这种方法,也许您能做的最好的事情就是让用户做好准备,因为他们的设备可能会要求他们确认删除正在上传到您自己的服务器的文件。例如,在尝试删除 Assets 之前提出您自己的模态警报。我通常不会建议将这种方法用于公共(public)发布应用程序,但由于您只是在内部分发,因此您的团队可能可以接受。
关于ios - 在 PHPhotoLibrary 中禁用删除请求确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31922796/