Отключить подтверждение запроса на удаление в PHPhotoLibrary

Что я пытаюсь сделать, так это сохранить видео в 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: как отключить подтверждение при запросе на удаление, если это содержимое было создано моим приложением? (Я не хочу ничего удалять).

Примечание: Кто-то, вероятно, может сказать, что это довольно странная вещь, но приложение распространяется внутри компании, и есть веская причина делать это таким образом (видеоконтент слишком ценен, чтобы его можно было потерять, даже если пользователь удаляет приложение по какой-то причине или вообще что-то идет не так, нам нужно иметь возможность сохранять видео), поэтому, пожалуйста, не задавайтесь этим вопросом, а просто сосредоточьте свое внимание на вопросе :)


person Jiri Trecak    schedule 10.08.2015    source источник
comment
Я точно не знаю ответа на этот вопрос, но сомневаюсь, что это возможно. Как только вы сохраните актив в библиотеке фотографий устройства, вы больше не являетесь владельцем, и он вправе запрашивать подтверждение удаления по уже упомянутой вами причине. Итак, игнорируя вашу заметку на минуту: что делает сохранение ваших ресурсов с помощью платформы Photos более безопасным, чем сохранение их самостоятельно?   -  person Stuart    schedule 10.08.2015
comment
Я сам сохраняю видеоконтент в каталог приложения (в зашифрованном виде), но видео будут удалены, если пользователь fe. удаляет приложение; Это уже произошло, потому что пользователи странные существа, поэтому мы пытаемся предотвратить даже это - видео будут надежно сохранены в фотографиях. Проблема в том, что из-за некоторых проблем с владением контентом мы должны удалить его сразу же, как только загрузим его на наш сервер (в основном существует система, которая продолжает загрузку после того, как устройство снова находится в Интернете, поскольку устройство используется в полевых условиях без подключения).   -  person Jiri Trecak    schedule 10.08.2015
comment
Так что же происходит, когда пользователь стирает свое устройство, теряет его или просто удаляет актив прямо из Фото? Потерю контента обычно можно избежать путем резервного копирования/синхронизации/сообщения пользователям не удалять это чертово приложение (!), а не путем захвата механизма хранения другого приложения - вы только избегаете одной из многих глупостей пользователя! Извините, что затронул вас в момент, когда вы просили людей не делать этого, но я думаю, что стоит задуматься. Если кто-то с большим знанием фреймворка Photos не сможет доказать мне, что я не прав, я думаю, вам, возможно, придется смириться с предупреждением или подумать о переосмыслении своего подхода.   -  person Stuart    schedule 10.08.2015
comment
Я определенно согласен. Есть много проблем, которые я не могу охватить, и у меня такое же мнение. Мне просто интересно, возможно ли это, и мне нужно другое мнение, но я, вероятно, просто отменю эту функцию и улучшу руководство о том, что делать / не делать. Если вы опубликуете ответ, говоря, что это невозможно, я приму его за вас. Спасибо :)   -  person Jiri Trecak    schedule 10.08.2015
comment
Я ценю это - мне жаль, что я не мог больше помочь в отношении подтверждения удаления.   -  person Stuart    schedule 10.08.2015


Ответы (1)


Я не вижу способа избежать подтверждения удаления. Это деталь реализации платформы Photos, аналогичная тому, как вы не можете запретить устройству запрашивать у пользователя разрешение на использование микрофона, когда ваше приложение пытается его использовать, и является вопросом безопасности и доверия. После того, как вы сохранили актив в библиотеке фотографий устройства, ваше приложение больше не является владельцем этого актива, поэтому, как вы отметили в своем вопросе, устройство, конечно, должно убедиться, что у приложения есть разрешение пользователя, прежде чем оно будет удалять такие данные.

Вы никогда не сможете полностью защитить данные своих пользователей от их собственного непредсказуемого поведения — если они решат удалить ваше приложение или удалить определенный ресурс из Фото, это их дело. Я думаю, что ваш лучший вариант — либо смириться со встроенным подтверждением удаления, либо предоставить пользователям руководство, в котором будет ясно, что они должны быть осторожны, чтобы защитить эти важные данные, создав резервную копию своего устройства, и не удаляя приложение!

Если вы все-таки решили придерживаться этого подхода, возможно, лучшее, что вы могли бы сделать, — это подготовить пользователя к тому факту, что его устройство может запросить у него подтверждение на удаление файла, загружаемого на ваши собственные серверы. Например, поместите собственное модальное оповещение непосредственно перед попыткой удалить ресурс. Обычно я бы не рекомендовал такой подход для общедоступного приложения для доставки, но, поскольку вы распространяете только внутри компании, это может быть приемлемо для вашей команды.

person Stuart    schedule 10.08.2015