2015-08-10 10 views
8

Quello che sto cercando di fare è salvare i video su PHPhotoLibrary e quindi rimuoverli quando il caricamento sul server remoto dei client nell'applicazione è completato (in pratica, la libreria fotografica funge da memoria temporanea per aggiungere ulteriore livello di sicurezza in caso nulla fallisce (ho già salvare i miei VIDES nella directory applicazioni)Disabilita la conferma sulla richiesta di cancellazione in PHPhotoLibrary

problema:.

il problema è per questo al lavoro, tutto deve funzionare senza input da parte dell'utente Puoi scrivere video nella libreria di foto come questa:

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

E che funziona perfettamente, ottengo l'identificatore locale, lo memorizzo per un uso successivo .. Unicorni e arcobaleni.

Ora quando voglio per rimuovere quel video subito dopo finiture di upload, che io chiamo seguente:

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

che cancella con successo il video, ma l'utente deve confermare l'eliminazione prima. Questo è un problema in quanto il backup non funzionerà.

Ovviamente so perché c'è una conferma (quindi non si cancella tutta la libreria utente ad esempio, ma il fatto è che la mia app ha realizzato il video - e così ho pensato che ci sarebbe stato modo di aggirarlo, dato che come " proprietario" io non dovrebbe fare questo, o almeno hanno opzione per disabilitare la conferma

Grazie in anticipo

TLDR:.! Come è possibile disattivare la conferma su richiesta di eliminazione, se la mia domanda ha creato tale contenuto? (Non voglio cancellare nient'altro)

Nota: Qualcuno può probabilmente dire che è una cosa piuttosto strana da fare ma l'applicazione è distribuita internamente e ci sono buone ragioni per farlo in questo modo (il contenuto del video è troppo prezioso per essere perso, anche se l'utente cancella l'applicazione per alcuni ragione, o c'è qualcosa che va storto, dobbiamo essere in grado di preservare i video), quindi per favore non metterlo in discussione e focalizza la tua attenzione sulla domanda :)

+0

Non conosco definitivamente la risposta a questa domanda, ma dubito che sia possibile. Una volta salvato un asset nella libreria di foto del dispositivo, non sei più il proprietario ed è giusto che richieda una conferma di eliminazione per il motivo che hai già menzionato. Quindi, ignorando la tua "Nota" per un minuto: cosa rende più sicuro il salvataggio dei tuoi beni tramite il framework Foto che salvarlo da solo? – Stuart

+0

Sto salvando il contenuto del video personalmente nella directory dell'applicazione (crittografato), ma i video verranno eliminati se l'utente fe. rimuove l'applicazione; È già successo perché gli utenti sono strane creature, quindi stiamo cercando di impedire anche che - i video vengano archiviati in modo sicuro nelle foto. Il problema è che a causa di alcuni problemi di proprietà dei contenuti, dobbiamo eliminarli immediatamente mentre li carichiamo sul nostro server (in pratica c'è un sistema che continua a caricare dopo che il dispositivo è di nuovo su Internet, poiché il dispositivo viene utilizzato nel campo senza connessione). –

+0

Quindi cosa succede quando l'utente cancella il suo dispositivo, o lo perde, o semplicemente elimina la risorsa direttamente da Foto? La perdita di contenuti viene generalmente evitata eseguendo il backup/sincronizzazione/_telling degli utenti per non eliminare la maledetta app_ (!), Non rubando il meccanismo di memorizzazione di un'altra app - si evita solo una delle tante "stupidità dell'utente"! Mi dispiace prenderti sul punto quando hai chiesto alle persone di non farlo, ma penso che valga la pena di prenderlo in considerazione. A meno che qualcuno con una maggiore conoscenza del framework Photos possa dimostrarmi sbagliato, penso che potresti dover sopportare l'avviso o considerare di ripensare il tuo approccio. – Stuart

risposta

5

Non riesco a vedere un modo per evitare la conferma dell'eliminazione. Si tratta di un dettaglio di implementazione del framework Photos, simile al modo in cui non è possibile impedire al dispositivo di chiedere l'autorizzazione dell'utente a utilizzare il microfono quando l'app tenta di utilizzarlo e si tratta di un problema di sicurezza & trust. Una volta salvato un asset nella libreria di foto del dispositivo, l'app non è più proprietaria di tale risorsa, pertanto, come indicato nella domanda, il dispositivo deve ovviamente garantire che l'app disponga dell'autorizzazione dell'utente prima che venga effettuata l'eliminazione di tali dati.

Non è mai possibile salvaguardare interamente i dati degli utenti dal loro comportamento imprevedibile: se decidono di rimuovere la tua app o di eliminare una particolare risorsa da Foto, dipende da loro. Penso che la tua migliore opzione sia quella di accettare la conferma di cancellazione integrata, o di fornire una guida ai tuoi utenti che chiarisca che dovrebbero fare attenzione a proteggere questi dati importanti eseguendo il backup del loro dispositivo, e non cancellare l'app!

Se si è deciso di attenersi a questo approccio, forse la cosa migliore che si potrebbe fare è preparare l'utente al fatto che il proprio dispositivo potrebbe chiedere conferma per eliminare un file che viene caricato sui propri server. Ad esempio, imposta il tuo avviso modale prima di provare a eliminare la risorsa.Normalmente non suggerirei questo tipo di approccio per un'app di trasporto pubblico, ma dal momento che distribuisci solo internamente potrebbe essere accettabile per la tua squadra.

Problemi correlati