本地存储在OSX应用程序(Xcode 4.3)中无法持久化

8

根据我的观察,如果您正在构建一个OSX桌面HTML5应用程序并且希望在您的WebView包装器中保持localStorage的持久性,您需要执行以下操作:

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

摘自:如何在基于WebKit的应用程序中启用本地存储?

但是在Xcode 4.3中,这对我似乎不起作用。相反,我得到了以下错误:

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

我对Objective C非常陌生,可能是因为没有包含某些头文件之类的小错误。

我已经包含了WebKit框架和这两个头文件:

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

有点奇怪的是,我可以访问其他的prefs方法,比如[prefs setDefaultFontSize:10],但就是不能访问上面我列出来的那两个方法。

你有什么想法吗?这是Xcode 4.3中删除的内容吗?


错误信息显示没有声明_setLocalStorageDatabasePath: - 并不是说如果您调用它就无法工作。如果您调用它,那么当苹果发布10.8或10.7.5时,它可能会停止工作。因此,您可能根本不想使用它们。 - Tom Andersen
1
@TomAndersen 不,它实际上无法编译。请注意,'setLocalStorageEnabled'方法也不起作用 - 而且这甚至不是一个私有方法。 - asgeo1
你可以在Cocoa中调用任何东西:例如,取一个NSString aString,然后[aString thisIsACallThatWillNotWork];应该编译,并在运行时导致崩溃。也许你正在使用不同的编译器设置。 - Tom Andersen
3个回答

5

好的,我有一个解决方案。我查看了macgap的源代码,并注意到他们是如何处理这个问题的。

原来我收到的错误信息确实有一点道理 - 我需要先声明一个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];

就像我说的一样,我是Objective-C的新手。我不太明白为什么要使用接口来调用这两个方法(即使我可以在没有接口的情况下调用其他方法)。


2
好消息和坏消息都有;我假设你想先听坏消息(如果我先回答坏消息会更容易些)。
坏消息是,这种情况发生的唯一原因是Xcode 4.3不再提供那些方法了。你链接到的问题“如何在基于WebKit的应用程序中启用本地存储?”最后一次更新是一年前(接受的答案在2011年初编辑过)。自那时以来,Xcode已经至少更新了两次(可能更多,只是我没有记住),我认为苹果公司希望保持他们的私有方法私有,因此可以安全地假定他们已经删除了它们以及对setLocalStorageEnabled:的支持。
我认为没有其他解决你的问题的原因是以下几点:
你调用 WebPreferences 实例的两个方法都不受支持。不仅是私有方法,苹果可能修改了 WebPreferences 类,不仅删除了 setLocalStorageEnabled: 方法,还删除了对私有方法(如 _setLocalStorageDatabasePath:)的支持。为什么他们一开始支持私有方法,我不知道,但他们肯定加强了对其支持的限制,因为我已经很长时间没有看到实现私有方法的机会了。
如果能够实现私有方法(甚至其他公共方法),那么像你的代码所描述的那样简单。如果查看相关问题,就不会提到任何使代码得到支持的困难步骤。没有任何方式可以导入框架(如 WebKit)的私有部分,而不需要进行一些繁重的工作,包括不仅找到私有部分,还要将其放入你的代码中。即使你在完成所有这些繁重的工作后,也很难让苹果感到满意,他们可能会拒绝你的应用程序进入应用商店。
很抱歉我要泼你一盆冷水,但我认为你的代码现在可能需要进行深入挖掘和大量绕过才能运行。如果想让它更容易地运作,你可能需要回到2011年早期制作你的应用程序。
好消息是,也许有些解决方案不需要使用私有和不支持的方法,只是由于我对使用WebKit的经验不足而不知道而已。与其寻找为什么你的代码不起作用的答案,不如开始寻找替代方案来完成你的代码所需达成的目标。

有一件事需要检查:如果您编写了HTML5代码(JS + HTML5),然后将其放入Web视图中,它是否有效?然后,如果需要,您可以将您的JS连接到Objective-C以获取/放置数据。 - Tom Andersen
不,这行不通;这是因为调用了一个已经不再被iOS SDK支持的方法,而不是web视图的内容问题。 - Carter Pape
我认为你是对的,它已经不再受支持了。我可能需要使用类似于PhoneGap的方法 - 在程序退出时将localStorage.db复制到安全位置,并在程序重新启动时进行恢复。 - asgeo1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接