2012-05-15 18 views
8

Da quello che ho visto, se si sta costruendo un OSX del desktop HTML5 app e vuole localStorage a persistere nel vostro involucro WebView, è necessario fare qualcosa di simile:localStorage non persistere in OSX app (Xcode 4.3)

WebPreferences* prefs = [webView preferences]; 
[prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"]; 
[prefs setLocalStorageEnabled:YES]; 

Tratto da: How do I enable Local Storage in my WebKit-based application?

Ma questo non sembra funzionare per me in Xcode 4.3. Invece ho

"No visible @interface for 'WebPreferences' declares the selector '_setLocalStorageDatabasePath:' 
"No visible @interface for 'WebPreferences' declares the selector 'setLocalStorageEnabled:' 

Sono molto di nuovo da Objective C, e sono probabilmente facendo qualcosa di stupido come non tra cui alcuni intestazione o qualcosa del genere.

Ho incluso il framework WebKit ed entrambi di queste intestazioni:

#import <WebKit/WebKit.h> 
#import <WebKit/WebPreferences.h> 

E ciò che è strano è che posso accedere ad altri metodi di preferenze, vale a dire [prefs setDefaultFontSize:10] - ma non solo i due di cui sopra, che ho elencato.

Qualche idea? È qualcosa che è stato rimosso in Xcode 4.3?

+0

Il messaggio di errore dice che non v'è alcuna dichiarazione di _setLocalStorageDatabasePath: - non che non funzionerà se lo si chiama. Potrebbe funzionare se lo chiami, quindi quando Apple rilascia 10.8 o 10.7.5, potrebbe smettere di funzionare. Quindi probabilmente non vuoi usarli in ogni caso. –

+1

@TomAndersen No, in realtà non verrà compilato. E si noti che il metodo 'setLocalStorageEnabled' non funziona - e non è nemmeno un metodo privato. – asgeo1

+0

È possibile chiamare qualsiasi cosa nel cacao: Ad esempio, prendere una stringa di controllo NSString, quindi [aString thisIsACallThatWillNotWork]; dovrebbe compilare e causare un arresto anomalo in fase di runtime. Forse ci sono diverse impostazioni del compilatore che stai usando. –

risposta

5

OK, ho una soluzione. Ho guardato il codice sorgente a macgap e ho notato come stavano affrontando questo problema.

Si scopre che il messaggio di errore che stavo facendo ha un senso: avevo bisogno di dichiarare prima un'interfaccia per WebPreferences.

@interface WebPreferences (WebPreferencesPrivate) 
- (void)_setLocalStorageDatabasePath:(NSString *)path; 
- (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; 
@end 

... 

WebPreferences* prefs = [WebPreferences standardPreferences]; 
[prefs _setLocalStorageDatabasePath:"~/Library/Application Support/MyApp"]; 
[prefs setLocalStorageEnabled:YES]; 
[webView setPreferences:prefs]; 

Come ho detto, sono nuovo di Objective-C. Non capisco perché l'interfaccia sia necessaria per chiamare questi due metodi (cioè quando posso chiamare gli altri metodi senza l'interfaccia).

+0

Ha funzionato per me con Xcode 4.3.3. Grazie! – endemic

2

Ci sono buone notizie e cattive notizie; Prenderò l'ipotesi che tu voglia prima la brutta notizia (sarebbe più facile se avessi risposto comunque alla tua domanda con le cattive notizie).

La cattiva notizia

L'unica risposta a perché questo sta accadendo è che Xcode 4.3 non propone più quei metodi. La domanda a cui ti sei collegato, "How do I enable Local Storage in my WebKit-based application?" è stata l'ultima attiva più di un anno fa (con la risposta accettata in fase di modifica all'inizio del 2011). Ci sono stati almeno due aggiornamenti da Xcode da allora (probabilmente di più e non li ricordo affatto), e mi sembra fattibile che Apple voglia mantenere privati ​​i loro metodi privati, quindi è lecito ritenere che li abbiano rimossi così come il supporto per setLocalStorageEnabled:.

Le ragioni per cui non credo che ci sia qualsiasi altra risposta al vostro problema sono i seguenti:

  1. entrambi i metodi che si chiama nell'istanza WebPreferences non sono supportati. Non è solo il metodo privato, quindi Apple deve aver modificato la classe WebPreferences, rimuovendo non solo setLocalStorageEnabled: ma anche il supporto per metodi privati ​​come _setLocalStorageDatabasePath:. Perché hanno supportato i metodi privati ​​per cominciare, non lo so, ma hanno decisamente represso il loro supporto perché non ho visto l'opportunità di implementare un metodo privato in un bel po 'di tempo.
  2. Se fosse possibile implementare il metodo privato (o anche l'altro, metodo pubblico), sarebbe facile come il codice lo rende. Se si esamina la domanda collegata, non menzionano passaggi difficili per ottenere il supporto del codice. Non c'è alcun modo per importare una parte privata di un framework come WebKit senza fare un po 'di sollevamento per quanto riguarda non solo trovare la parte privata ma anche inserirla nel codice. Anche se è possibile ottenere quei metodi supportati nel tuo codice dopo tutto questo sollevamento, sarebbe altamente improbabile che Apple ne sarebbe molto felice e probabilmente negherebbero la tua app dall'app store.

Mi spiace essere un Debbie-downer su tutto, ma non penso che il tuo codice funzionerebbe più senza un po 'di profondità e grandi soluzioni alternative.Se vuoi che funzioni facilmente, probabilmente dovrai tornare all'inizio del 2011 e creare la tua app.

La Buona Novella

C'è probabilmente una soluzione che non comporta metodi privati ​​e non supportate che io non sono solo a conoscenza di causa della mia mancanza di esperienza con WebKit. Invece di cercare una risposta sul perché il tuo codice non funziona, inizierei a cercare alternative per ciò che il tuo codice dovrebbe fare.

+0

Una cosa da controllare: se scrivi codice html5 (js + html5), allora metti quello nella tua vista web funziona? Quindi, se è necessario, puoi connettere il tuo js al tuo obiettivo c per inserire/ottenere dati. –

+0

No, non funzionerebbe; si tratta di chiamare un metodo che non è più supportato dall'SDK di iOS, non dal contenuto di una visualizzazione Web. –

+0

Penso che tu abbia ragione, non è più supportato. Potrei dover utilizzare un approccio simile a PhoneGap - copiare localStorage.db in un percorso sicuro quando il programma termina e ripristinare quando il programma si riavvia nuovamente. – asgeo1

Problemi correlati