2012-09-21 7 views
6

Desidero aprire un file (memorizzato localmente nella mia app) con un'altra app.openURL un file locale o forza UIDocumentInteractionController per utilizzare un'app specifica

Attualmente, sto usando openURL (c'è uno schema URL dedicato), e funziona bene se uso un file ospitato su internet, ma vorrei utilizzare un file locale in modo da: a) funziona offline b) un sacco di tempo i miei utenti sono o fuori copertura zona di cellule, o il roaming internazionale

Quello che ho provato finora: non ho avuto alcuna fortuna raccontando openURL di utilizzare un file locale, ho cercato alcuni approcci, ma sono tutti qualcosa di simile

 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"ext"]; 
     NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 
     [[UIApplication sharedApplication] openURL:fileURL]; 

anche

 NSURL *fileURL = [[NSBundle mainBundle] URLForResource: @"test" withExtension:@"ext"]; 
     [[UIApplication sharedApplication] openURL:fileURL]; 

anche manualmente utilizzando le stringhe con differenti variazioni del localhost/e file: // e var/mobile etc percorsi

non funziona nulla (per me comunque)

Così, mi sono guardato intorno e SO imbattuto UIDocumentInteractionController

sono in grado di utilizzare UIDocumentInteractionController per consentire all'utente di aprire il mio file locale con l'altra app - comunque sempre presenti le opzioni multiple di altre applicazioni di utilizzare e per esempio, una delle altre applicazioni può essere 'D ropbox'.

Non voglio consentire all'utente di scaricare (o caricare tecnicamente) una copia del mio file per il loro uso in altri modi. Contiene dati che preferirei non rendere così facilmente disponibili.

Quando il file viene aperto dall'app progettata (non creata da me btw) non consente alcun tipo di salvataggio o accesso ai dati grezzi.

Mi rendo conto che includendo il file nella mia app chiunque sia seriamente interessato a ottenerlo sarà in grado di, non voglio semplicemente visualizzare un grande menu che dice 'Eccolo se vuoi che la tua copia faccia lavoro derivato da'

Idealmente, avrei potuto usare openURL ma penso che sia a causa del 'sandbox' che l'altra applicazione non risponde - in Android che uso mode_world_readable a dichiarare il file come leggibili da altre applicazioni (quindi posizionandolo fuori dalla sandbox, e non consente ad altre app di scrivere su di esso, basta leggere) - c'è comunque lo stesso per iOS?

Altrimenti, se potessi forzare UIDocumentInteractionController per utilizzare un'app specifica e non presentare il menu, anche quello andrebbe bene.

Similar question asked a while ago

Ci scusiamo per la lunga lettura, ogni aiuto è apprezzato.

Edit: Ho appena ricevuto una risposta dal supporto Apple Tech e mi hanno detto che questo è attualmente impossibile (subito dopo iOS 6 rilasciato)

+0

Sarebbe possibile impostare un server Web "locale" e ospitare il file lì per l'altra app per l'accesso? – lifeIsGood

+0

Che ne dici di usare UIPasteboard con openURL in qualche modo? – lifeIsGood

risposta

0

Sì, si è limitato a causa della rigorosa sandboxing su iOS. Ecco alcuni pensieri.

È possibile sovrascrivere la funzionalità di UIDocumentInteractionController effettuando la sottoclasse di QLPreviewController. È quindi possibile sostituire la voce del pulsante della barra standard che visualizza il menu "Apri in".Date un'occhiata a questo post per una soluzione per sottoclasse QLPreviewController: QLPreviewController remove or add UIBarButtonItems

Naturalmente, credo che il modo in cui funziona la condivisione tra app sia in gran parte fuori mano. Se un'applicazione è stata registrata per essere in grado di gestire un determinato tipo di file, verrà visualizzata come una delle scelte nell'elenco "Apri in", indipendentemente dal fatto che lo si desideri o meno. Non credo che tu possa filtrare le app visualizzate in quella lista.

Ecco due idee sperimentali Ci ho pensato, ma non ho mai provato:

  • Si potrebbe base64 codificare i dati dal file si sta cercando di passare lungo - che ha appena converte binari al testo - e consegnalo come parte dell'URL personalizzato che usi per avviare l'altra app. Quindi l'altra app può decodificare in base64 gli stessi dati in binario. Il lato negativo è che c'è un limite alla lunghezza dell'URL, il che significa che il "file" che invii dovrebbe essere piuttosto piccolo.

  • Successivamente, e non so nemmeno se questo è possibile, ma mi chiedo se è possibile utilizzare qualche algoritmo steganograhpy per incorporare i dati del documento all'interno di un'immagine e poi consegnarlo al rullino fotografico. Quindi, l'altra app potrebbe aprire il rullino della fotocamera e decodificare nuovamente l'immagine nei dati. ... Si. Lo so ... oscuro, ma potrebbe essere divertente provare a implementare. ;-)

Non sono sicuro che ciò sia d'aiuto, ma hai detto "ogni aiuto è apprezzato". ;-)

Cordiali saluti.

+0

Ciao Matt, grazie per le idee. Guarderò di più su QLPreviewController ma non penso che possa essere d'aiuto. I suoi documenti dicono che supporta solo determinati tipi di file, di cui il mio non è elencato. Gli altri 2 suggerimenti non sono realmente fattibili per una serie di motivi, il principale dei quali è che non ho alcun controllo sulla seconda app che desidero aprire il mio file poiché è stato creato da un altro sviluppatore. Non riesco a vederli lavorare con me per "decodificare" il mio file. – lifeIsGood

+0

Spiacente, non è più utile. Il sandboxing è ottimo per ridurre al minimo le attività canaglia e quindi nel complesso direi che è una buona cosa, ma impedisce alle nostre app di fare cose che abbiamo dato per scontate su altre piattaforme. –

+0

Il sandboxing è buono, per molte ragioni. Tuttavia, non vedo perché non possiamo collocare un file al di fuori di esso per consentire ad altre app di utilizzarlo. Siamo autorizzati a dire ad altre app di usare un file da internet (openURL), perché non da una fonte locale? - comunque, grazie per i tuoi suggerimenti. – lifeIsGood

Problemi correlati