9

私がやろうとしているのは、ビデオを 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 : アプリケーションがそのコンテンツを作成した場合、削除要求の確認を無効にするにはどうすればよいですか? (他のものは削除したくありません)。

注:これはかなり奇妙なことだと言う人もいるかもしれませんが、アプリケーションは内部で配布されており、このようにするのには十分な理由があります (ユーザーが何らかの理由でアプリケーションを削除したとしても、ビデオ コンテンツは失われるにはあまりにも貴重です。または、何か問題が発生した場合は、ビデオを保存できるようにする必要があります)、それについて質問しないで、質問に注意を向けてください :)

4

1 に答える 1

5

削除の確認を回避する方法がわかりません。これは Photos フレームワークの実装の詳細であり、アプリがマイクを使用しようとしたときにデバイスがユーザーにマイクの使用許可を求めるのを防ぐことができないのと同様であり、セキュリティと信頼の問題です。アセットをデバイスの写真ライブラリに保存すると、アプリはそのアセットの所有者ではなくなります。そのため、質問で指摘したように、デバイスはもちろん、そのようなデータを削除する前に、アプリにユーザーの許可があることを確認する必要があります。

ユーザーの予測できない行動からユーザーのデータを完全に保護することはできません。ユーザーがアプリを削除したり、写真内の特定のアセットを削除したりする場合、それはユーザー次第です。あなたの最善の選択肢は、組み込みの削除確認を我慢するか、デバイスをバックアップしてこの重要なデータを保護するように注意する必要があることをユーザーに明確にするガイドを提供することですアプリ!

このアプローチに固執することにした場合、おそらく最善の方法は、自分のサーバーにアップロードされているファイルを削除するための確認をデバイスが要求する可能性があるという事実にユーザーを準備することです. たとえば、アセットを削除しようとする直前に、独自のモーダル アラートを設定します。私は通常、公共の配送アプリに対してそのようなアプローチを提案しませんが、内部でのみ配布しているため、チームには受け入れられるかもしれません.

于 2015-08-10T19:37:34.887 に答える