2015-08-10 15 views
8

Co próbuję zrobić, to zapisać wideo w PHPhotoLibrary, a następnie usunąć je po zakończeniu przesyłania do klienta zdalnego serwera w aplikacji (w zasadzie biblioteka zdjęć służy jako tymczasowe miejsce do przechowywania dodatkowych warstw bezpieczeństwa w przypadku w ogóle nic się nie powiedzie (I już uratować moje coraz konkretniejsze go w katalogu Programy)Wyłącz potwierdzenie na żądanie usunięcia w PHPhotoLibrary

problem:.

problemem jest za to do pracy, wszystko musi działać bez ingerencji ze strony użytkownika Możesz napisać film do biblioteki zdjęć w ten sposób:

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 
     .... 
    }) 
} 

I działa bezbłędnie, otrzymuję lokalny identyfikator, przechowuję go do późniejszego wykorzystania .. Jednorożce i tęcze.

Teraz, kiedy chcę natychmiast usunąć ten film po wykończeniach wysyłania wzywam następujący:

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 
       ... 
      }) 
     } 
    } 
} 

który z powodzeniem usuwa wideo, ale użytkownik ma pierwszy aby potwierdzić usunięcie. To jest problem, ponieważ tworzenie kopii zapasowych nie będzie działać.

Oczywiście wiem, dlaczego istnieje potwierdzenie (na przykład nie wyczyszczono całej biblioteki użytkownika, ale chodzi o to, że moja aplikacja zrobiła wideo - i dlatego pomyślałem, że będzie na to sposób, ponieważ " Właściciel”nie powinienem tego robić, albo przynajmniej mieć możliwość wyłączenia potwierdzenie

góry dziękuję

TLDR.! Jak mogę wyłączyć potwierdzenie na kasowania wniosek, jeśli moja aplikacja stworzona tej treści? (Nie chcę niczego więcej kasować).

Uwaga: Ktoś może powiedzieć, że to dość dziwna sprawa, ale aplikacja jest rozpowszechniana wewnętrznie i jest dobry powód, aby to zrobić (zawartość wideo jest zbyt cenna, aby można ją było zgubić, nawet jeśli użytkownik usunie aplikację dla niektórych powód, albo coś jest nie tak, musimy zachować filmy), więc nie kwestionuj tego i po prostu skup swoją uwagę na pytaniu :)

+0

Nie znam definitywnie odpowiedzi na to pytanie, ale wątpię, czy to możliwe. Po zapisaniu zasobu w bibliotece zdjęć urządzenia użytkownik nie jest już jego właścicielem i może poprosić o potwierdzenie usunięcia z powodów, o których już wspomniałeś. Zignoruj ​​więc "notatkę" na minutę: co sprawia, że ​​zapisywanie swoich zasobów za pośrednictwem Photoshopa jest bezpieczniejsze niż samemu oszczędzasz? – Stuart

+0

Sam zapisuję zawartość wideo do katalogu aplikacji (zaszyfrowane), ale filmy wideo zostaną usunięte, jeśli użytkownik na przykład. usuwa aplikację; Zdarzyło się to już, ponieważ użytkownicy są dziwnymi stworzeniami, więc staramy się temu zapobiec - filmy będą bezpiecznie przechowywane na zdjęciach. Problem polega na tym, że ze względu na pewne problemy z własnością treści musimy natychmiast usunąć, gdy przesyłamy je na nasz serwer (w zasadzie jest system, który kontynuuje przesyłanie po ponownym uruchomieniu urządzenia, ponieważ urządzenie jest używane w terenie bez połączenia). –

+0

Co się dzieje, gdy użytkownik kasuje swoje urządzenie, lub je traci, lub po prostu usuwa zasób bezpośrednio ze Zdjęć? Utraty zawartości zazwyczaj unika się poprzez tworzenie kopii zapasowej/synchronizacji/wyzyskiwania użytkowników, aby nie usuwali tej cholernej aplikacji (!), A nie przez porwanie mechanizmu przechowywania innej aplikacji - unikacie tylko jednego z wielu "głupstw użytkownika"! Przepraszam, że podjąłem decyzję, kiedy nie prosiliście ludzi, ale myślę, że warto się nad tym zastanowić. Chyba że ktoś, kto ma większą wiedzę na temat ram Zdjęć, może mi udowodnić, że jestem w błędzie, myślę, że być może będziesz musiał się pogodzić z alarmem lub rozważyć ponowne przemyślenie swojego podejścia. – Stuart

Odpowiedz

5

Nie widzę sposobu na unikaj potwierdzenia usunięcia. Jest to szczegół implementacji struktury Zdjęć, podobny do sposobu, w jaki urządzenie nie może poprosić użytkownika o zgodę na używanie mikrofonu, gdy aplikacja próbuje go użyć, i jest kwestią zaufania. Po zapisaniu zasobu w bibliotece zdjęć urządzenia Twoja aplikacja nie jest już właścicielem tego zasobu, więc jak zauważyłeś w swoim pytaniu, urządzenie musi oczywiście upewnić się, że aplikacja ma pozwolenie użytkownika, zanim zniknie z usuwania takich danych.

Nigdy nie można całkowicie zabezpieczyć danych użytkowników przed ich nieprzewidywalnym zachowaniem - jeśli zdecydują się oni usunąć aplikację lub usunąć określony zasób ze Zdjęć, to do nich należy. Uważam, że najlepszym wyjściem jest skorzystanie z wbudowanego potwierdzenia usunięcia lub dostarczenie przewodnika użytkownikom, który wyjaśnia, że ​​powinni zachować ostrożność, aby chronić te ważne dane, tworząc kopie zapasowe swoich urządzeń, a także , a nie. usuwanie aplikacji!

Jeśli zdecydowałeś się trzymać tego podejścia, być może najlepszą rzeczą, jaką możesz zrobić, jest przygotowanie użytkownika do tego, że jego urządzenie może poprosić o potwierdzenie usunięcia pliku, który jest przesyłany na twoje własne serwery. Na przykład ustaw własne alert modalny tuż przed usunięciem zasobu.Zwykle nie sugerowałbym takiego podejścia do publicznej aplikacji do wysyłki, ale skoro dzielisz się tylko wewnętrznie, może to być akceptowalne dla twojego zespołu.