2009-10-01 11 views
5

Ho cercato OVUNQUE per questo, non ho trovato nulla. Fondamentalmente ho bisogno di memorizzare un intero sito Web all'interno del mio iPhone per alcuni motivi interessanti. Indipendentemente da come non riesco a capire come visualizzarlo correttamente nel mio UIWebView.UIWebView visualizza il sito Web memorizzato localmente (HTML, immagini, Javascript)

EDIT:. Vorrei chiarire, posso caricare il file HTML originale, e ho chagned tutto il pathing essere locale, ad eccezione nulla viene collegata in

Ecco il codice

self.dataDetectorTypes = UIDataDetectorTypeLink; 
NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[self loadRequest:request]; 

index.html ha un sacco di <script type="text/javascript" src="somescript.js">

Nessuno di codice JS viene eseguito

+0

Che cosa significa "niente è linkato in" significa qui? –

risposta

13

Sembra che tu stia caricando l'HTML dal tuo pacchetto. Ciò significa che tutti i file aggiuntivi (.js, .css e tutti i file multimediali) devono essere presenti nel pacchetto. Quindi la prima cosa da controllare è guardare dentro il contenuto del tuo eseguibile e assicurarsi che i file js, ecc. Siano inclusi.

Se ciò sembra corretto, la prossima cosa da controllare è se i file html, js o css fanno riferimento al contenuto tramite URL relativi o assoluti. Se esiste un riferimento assoluto al percorso nel contenuto Web, UIWebView tenterà di scaricare ogni volta quel contenuto in modo che funzioni solo quando si dispone di una connessione di rete. Se il percorso è relativo, verrà esaminato nel pacchetto per verificare se esiste un tale file.

Quando hai incluso l'html e il contenuto nel file di progetto XCode, probabilmente trascini il/i file sulla barra laterale del progetto e ti viene chiesto se "Creare gruppi in modo ricorsivo per qualsiasi cartella aggiunta" o "Crea cartella" Riferimenti per eventuali cartelle aggiunte. "

Il valore predefinito è il primo che indica che XCode crea una cartella gialla nel progetto, ma ignorerà la gerarchia di directory sul disco quando verrà il momento di generare il pacchetto di output. Se si sceglie la seconda opzione, la cartella è blu e se si guarda nel bundle di output si vedrà che l'intera gerarchia di cartelle è stata replicata.

Il primo funziona per pagine Web semplici in cui tutto è allo stesso livello di cartella e si può utilizzare il metodo che si elenca sopra per caricarlo. Il secondo caso funziona meglio se la pagina web è complesso e riferimenti contenuti in sotto-cartelle, nel qual caso è necessario caricare le pagine web da un percorso relativo (diciamo, la cartella 'pagine web'):

NSString *path = [[NSBundle mainBundle] 
       pathForResource:@"index" ofType:@"html" 
        inDirectory:@"webpages"]; 

Il l'ultima cosa da controllare è se ci sono dei tag BASE nel file html. Questo è un modo per specificare un indirizzo o una destinazione predefiniti per tutti i collegamenti su una pagina, ma può far saltare i collegamenti alle pagine web.

+0

Questa è Laura. Ero bloccato nello stesso problema e quando ho provato ad usare la tua soluzione, nel mio caso "path" restituisce nil. Anche se ho aggiunto i file html e le risorse nello stesso modo utilizzando la seconda opzione "Crea riferimenti alle cartelle per eventuali cartelle aggiunte". Cosa mi sto perdendo. Mi aiuti per favore. Sarei davvero grato – Aisha

+0

Ciao Laura. Se il metodo "pathForResource" restituisce nil significa che non riesce a trovare il file. Una cosa da provare è trovare il file .app binario nella directory "build" nel Finder, quindi fare clic con il pulsante destro del mouse su "Mostra contenuto pacchetto". Questo mostra cosa contiene il pacchetto principale dell'app. Guarda dentro per il tuo file HTML. Se si trova in una cartella, il nome della cartella deve trovarsi nel parametro "inDirectory" della chiamata pathForResource. Se è al livello superiore, non hai un riferimento alla cartella. Eliminare e trascinare nuovamente nel progetto o utilizzare la versione pathForResource senza inDirectory. HTH. – Ramin

1

È necessario impostare questo:

myWebView.dataDetectorTypes = UIDataDetectorTypeLink 
7

Il problema è che questa chiamata:

NSURL *url = [NSURL fileURLWithPath:path]; 

non impostare un baseURL e quindi relativi percorsi nel file .html per cose come javascript, css, immagini ecc non funzionano.

utilizzare invece questo:

url = [NSURL URLWithString: [path lastPathComponent] 
      relativeToURL: [NSURL fileURLWithPath: [path stringByDeletingLastPathComponent] 
             isDirectory: YES]]; 

e quindi le cose come "styles.css" nell'indice.il file html verrà trovato IFF e saranno copiati nel pacchetto accanto al file .html.

0

Assicurati che i file .js siano nella tua copia nella sezione del pacchetto di risorse e non nella sezione di compilazione. Xcode li colloca nel gruppo di compilazione per impostazione predefinita.

0

Quando si aggiunge il percorso Per la risorsa nel Dizionario, viene visualizzato un errore di stringa nullo.

0

Il mio tentativo era di eseguire un'intera pagina Web dal file di progetto Xcode. Per fare questo è necessario:

  1. Quando l'importazione del file selezionare "Crea i riferimenti delle cartelle per tutte le cartelle aggiunte".

  2. Impostare la visualizzazione Web, ma assicurarsi di impostare il percorso relativo come precedentemente indicato.

    NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" 
                 ofType:@"html" 
                 inDirectory:@"Directory"]; 
    
    NSURL *url = [NSURL URLWithString:[path lastPathComponent] relativeToURL: 
         [NSURL fileURLWithPath: [path stringByDeletingLastPathComponent] 
          isDirectory:YES]]; 
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    
    [self.currentWebView loadRequest:request]; 
    
Problemi correlati