在 PHPhotoLibrary 中禁用删除请求的确认

Posted

技术标签:

【中文标题】在 PHPhotoLibrary 中禁用删除请求的确认【英文标题】:Disable confirmation on delete request in PHPhotoLibrary 【发布时间】:2015-08-10 14:54:33 【问题描述】:

我想要做的是将视频保存到 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:如果我的应用程序创建了该内容,我如何禁用对删​​除请求的确认? (我不想删除其他任何内容)。

注意:可能有人会说这是一件很奇怪的事情,但应用程序是内部分发的,这样做是有充分理由的(视频内容太宝贵了,不能丢失,即使用户出于某种原因删除了应用程序,或者出现了任何问题,我们也需要能够保存视频),所以请不要质疑,只关注问题:)

【问题讨论】:

我不确定这个问题的答案,但我怀疑这是否可能。将资产保存到设备照片库后,您不再是所有者,出于您已经提到的原因,它要求删除确认是正确的。所以,暂时忽略你的“注意”:是什么让通过照片框架保存资产比自己保存更安全? 我自己将视频内容保存到应用程序目录(加密),但如果用户 fe.删除应用程序;它已经发生了,因为用户是奇怪的生物,所以我们甚至试图阻止这种情况 - 视频将安全地存储在照片中。问题是由于某些内容所有权问题,我们必须在将其上传到我们的服务器时立即删除(基本上有系统在设备再次联网后继续上传,因为设备在现场使用时没有连接)。 那么当用户擦除他们的设备、丢失设备或直接从照片中删除资产时会发生什么?通常通过备份/同步/告诉用户不要删除该死的应用程序(!)来避免内容丢失,而不是通过劫持另一个应用程序的存储机制 - 你只是避免了许多“用户愚蠢”中的一个!当您要求人们不要这样做时,很抱歉接您,但我认为值得考虑。除非对照片框架有更多了解的人可以证明我错了,否则我认为您可能不得不忍受警报,或者考虑重新考虑您的方法。 我绝对同意。有很多我无法涵盖的问题,我也有同样的看法。我只是想知道这是否可能并且我需要另一种意见,但我可能会放弃该功能并改进有关该做什么/不做什么的指南。如果您发布答案说这是不可能的,我会为您接受它。谢谢:) 非常感谢 - 很抱歉我无法为删除确认提供更多帮助。 【参考方案1】:

我看不到避免删除确认的方法。这是照片框架的一个实现细节,类似于当您的应用程序尝试使用麦克风时,您无法阻止设备询问用户使用麦克风的权限,这是一个安全和信任问题。将资产保存到设备照片库后,您的应用程序不再是该资产的所有者,因此正如您在问题中指出的那样,设备当然必须确保应用程序在删除此类数据之前获得用户的许可。

您永远无法完全保护您的用户数据免受他们自己不可预测的行为的影响 - 如果他们决定删除您的应用,或从照片中删除特定资产,这取决于他们。我认为你最好的选择是要么忍受内置的删除确认,要么为你的用户提供一个指南,明确他们应该通过备份他们的设备来小心保护这些重要数据,不要删除应用!

如果您确实决定坚持这种方法,也许您可​​以做的最好的事情是让用户做好准备,因为他们的设备可能会要求他们确认删除正在上传到您自己服务器的文件。例如,在尝试删除资产之前设置您自己的模式警报。我通常不会为公共运输应用建议这种方法,但由于您只是在内部分发,因此您的团队可能会接受。

【讨论】:

以上是关于在 PHPhotoLibrary 中禁用删除请求的确认的主要内容,如果未能解决你的问题,请参考以下文章

PHPhotoLibrary 请求授权,不请求

从自定义相册 PHPhotoLibrary 目标 C 中删除图像

PHPhotoLibrary.sharedPhotoLibrary().performChanges 中的活动指示器动作缓慢

重置 [PHPhotoLibrary 授权状态]

删除 PHAsset 时禁用授权请求

PHPhotoLibrary - photoLibraryDidChange 在 Swift 中多次调用