2012-05-15 10 views
8

Por lo que he visto, si usted está construyendo una aplicación HTML5 de escritorio OSX y desea localStorage de persistir en su envoltorio WebView, que tiene que hacer algo como esto:localStorage no persistir en OSX aplicación (Xcode 4.3)

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

Tomado de: How do I enable Local Storage in my WebKit-based application?

Pero esto no parece funcionar para mí en Xcode 4.3. En vez consigo

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

que soy muy nuevo en Objective C, y es probable que esté haciendo algo tonto como no incluidos algunos de cabecera o algo así.

He incluido el marco WebKit y ambos de estos encabezados:

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

Y lo que es extraño es que puedo acceder a otros métodos de Preferencias, es decir [prefs setDefaultFontSize:10] - pero no los dos anteriores que hice una lista.

¿Alguna idea? ¿Esto es algo que se ha eliminado en Xcode 4.3?

+0

El mensaje de error dice que no hay una declaración de _setLocalStorageDatabasePath: - No es que no funcionará si usted lo llama. Puede funcionar si lo llamas, entonces cuando Apple lanza 10.8 o 10.7.5, puede dejar de funcionar. Por lo tanto, es probable que no desee usarlos en cualquier caso. –

+1

@TomAndersen No, en realidad no compilará. Y observe que el método 'setLocalStorageEnabled' tampoco funciona, y ni siquiera es un método privado. – asgeo1

+0

Puede llamar a cualquier elemento en cacao: por ejemplo, tome un NSString aString, luego [aString thisIsACallThatWillNotWork]; debería compilar y causar un bloqueo en el tiempo de ejecución. Tal vez hay diferentes configuraciones de compilador que está utilizando. –

Respuesta

5

Bien, tengo una solución. Miré el código fuente al macgap y noté cómo estaban lidiando con este problema.

Resulta que el mensaje de error que estaba recibiendo no hacer un poco de sentido - que necesitaba para declarar una interfaz para WebPreferences primero.

@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]; 

Me gusta Le dije que soy nuevo en Objective-C. Realmente no entiendo por qué la interfaz es necesaria para llamar a esos dos métodos (es decir, cuando puedo llamar a los otros métodos sin la interfaz).

+0

Funcionó para mí con Xcode 4.3.3. ¡Gracias! – endemic

2

Hay buenas noticias y malas noticias; Voy a hacer la suposición de que quieres las malas noticias primero (sería más fácil si respondiera tu pregunta con las malas noticias primero de todos modos).

Las malas noticias

La única respuesta a por qué esto está ocurriendo es que Xcode 4.3 no ofrece esos métodos más. Esa pregunta a la que se vinculó, "How do I enable Local Storage in my WebKit-based application?", estuvo activa por última vez hace más de un año (la respuesta aceptada se editó a principios de 2011). Ha habido al menos dos actualizaciones de Xcode desde entonces (probablemente más y simplemente no las recuerdo), y me parece factible que Apple quiera mantener sus métodos privados en privado, por lo que es seguro asumir que los eliminaron así como el soporte para setLocalStorageEnabled:.

Las razones por las que no creo que haya ninguna otra respuesta a su problema son los siguientes:

  1. ambos métodos los que se llama en la WebPreferences instancia no son compatibles. No es solo el método privado, por lo que Apple debe haber modificado la clase WebPreferences, eliminando no solo setLocalStorageEnabled:, sino también soporte para métodos privados como _setLocalStorageDatabasePath:. No sé por qué apoyaron los métodos privados, pero definitivamente han reprimido su apoyo porque no he visto la oportunidad de implementar un método privado en bastante tiempo.
  2. Si fuera posible implementar el método privado (o incluso el otro método público), sería tan fácil como dice su código. Si uno mira la pregunta vinculada, no menciona ningún paso difícil para que el código sea compatible. No hay ninguna forma de importar una parte privada de un framework como WebKit sin hacer algunos trabajos pesados ​​con respecto no solo a encontrar la parte privada, sino también a incluirla en su código. Incluso si puede obtener esos métodos respaldados en su código después de todo ese trabajo pesado, sería altamente improbable que Apple esté muy contento con él y probablemente nieguen su aplicación en la tienda de aplicaciones.

Disculpa ser una Debbie-downer sobre todo, pero no creo que tu código funcione más sin una profunda excavación y grandes soluciones.Si quieres que funcione fácilmente, probablemente tengas que volver a principios de 2011 y crear tu aplicación en su lugar.

La Buena Nueva

Es probable que haya alguna solución que no implique métodos privados y no admitidas que yo no tengo conocimiento de causa de mi falta de experiencia en el uso WebKit. En lugar de buscar una respuesta de por qué su código no funciona, comenzaría a buscar alternativas para lo que su código debe hacer.

+0

Una cosa que debes comprobar: si escribes el código html5 (js + html5) y luego lo pones en tu vista web, ¿funciona? Entonces, si lo necesita, puede conectar su js a su objetivo c para poner/obtener datos. –

+0

No, no funcionaría; esto es una cuestión de llamar a un método que ya no es compatible con el SDK de iOS, no el contenido de una vista web. –

+0

Creo que tienes razón, ya no es compatible. Puede que tenga que usar un enfoque similar a PhoneGap: copie el archivo localStorage.db en una ubicación segura cuando el programa salga, y restaure cuando el programa vuelva a iniciarse. – asgeo1

Cuestiones relacionadas