localStorage不能持久存在于OSX应用程序中(Xcode 4.3)

时间:2012-05-15 22:23:44

标签: objective-c macos webkit local-storage xcode4.3

据我所知,如果您正在构建OSX桌面HTML5应用程序并希望localStorage在WebView包装器中保留,则需要执行以下操作:

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

取自:How do I enable Local Storage in my WebKit-based application?

但在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中删除的内容吗?

3 个答案:

答案 0 :(得分: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的新手。我真的不明白为什么需要接口才能调用这两种方法(即当我可以在没有接口的情况下调用其他方法时)。

答案 1 :(得分:2)

有好消息,有坏消息;我会假设你首先想要坏消息(如果我首先用坏消息回答你的问题会更容易)。

坏消息

为什么会发生这种情况的唯一答案是Xcode 4.3不再提供这些方法。您链接到的问题“How do I enable Local Storage in my WebKit-based application?”是一年前的最后一次活动(已接受的答案在2011年初编辑)。从那以后,Xcode至少有两次更新(可能更多,我只是不记得它们),我认为Apple希望将私有方法保密,这是可行的,因此可以安全地假设他们删除了它们以及对setLocalStorageEnabled:的支持。

我认为您的问题没有任何其他答案的原因如下:

  1. 不支持在WebPreferences实例上调用的两种方法。这不仅仅是私有方法,因此Apple必须修改WebPreferences类,不仅要删除setLocalStorageEnabled:,还要支持_setLocalStorageDatabasePath:等私有方法。为什么他们支持私有方法,我不知道,但是他们肯定会打击他们的支持,因为我没有看到在相当长的一段时间内实现私有方法的机会。
  2. 如果实现私有方法(甚至是其他公共方法)是可能的,那么它就像你的代码那样容易实现。如果查看链接的问题,他们没有提到任何难以获得支持代码的步骤。没有任何方法可以导入WebKit这样的框架的私有部分而不需要做一些繁重的工作,不仅要查找私有部分,还要将其添加到代码中。即使您可以在所有这些繁重的工作中获得代码支持的方法,Apple也不太可能对它很满意,并且他们可能会从应用程序商店拒绝您的应用程序。
  3. 很抱歉成为Debbie-downer关于这一切,但我不认为如果没有深入的挖掘和大的解决方法,你的代码将不再适用。如果你想让它轻松工作,你可能不得不回到2011年初然后制作你的应用程序。

    好消息

    由于我缺乏使用WebKit的经验,可能有一些解决方案不涉及我不知道的私有和不受支持的方法。我没有寻找代码无效的答案,而是开始寻找代码应该做的替代方案。

答案 2 :(得分:1)

我找到了持久性问题的解决方案。点击我的帖子

Local Storage in webview is not persistent