8

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

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 setDefaultFontSize:10]- 但不能访问我列出的上述两种方法。

有任何想法吗?这是在 Xcode 4.3 中删除的东西吗?

4

3 回答 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 的新手。我真的不明白为什么需要接口来调用这两个方法(即当我可以在没有接口的情况下调用其他方法时)。

于 2012-05-26T04:58:35.117 回答
2

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

坏消息

发生这种情况的唯一答案是 Xcode 4.3 不再提供这些方法。您链接到的那个问题“如何在我的基于 WebKit 的应用程序中启用本地存储? ”最后一次活跃是在一年多前(接受的答案是在 2011 年初编辑的)。从那时起,Xcode 至少有两次更新(可能更多,我只是不记得它们了),对我来说,Apple 希望将它们的私有方法保持私有似乎是可行的,所以可以安全地假设他们删除了它们以及对setLocalStorageEnabled:.

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

  1. 您在实例上调用的两种方法WebPreferences均不受支持。这不仅仅是私有方法,所以 Apple 肯定修改了这个WebPreferences类,不仅删除setLocalStorageEnabled:了对私有方法的支持,例如_setLocalStorageDatabasePath:. 为什么他们一开始就支持私有方法,我不知道,但他们肯定会打击他们的支持,因为我已经有一段时间没有看到实现私有方法的机会了。
  2. 如果实现私有方法(或什至其他公共方法)是可能的,那么它会像您的代码一样简单。如果查看链接的问题,他们并没有提到获得支持代码的任何困难步骤。没有任何方法可以导入框架的私有部分,例如WebKit不做一些繁重的工作,不仅要找到私有部分,还要将其放入您的代码中。即使您可以在所有繁重的工作之后在您的代码中获得这些方法的支持,Apple 也不太可能对此感到非常满意,并且他们可能会拒绝您的应用程序从应用程序商店中发布。

很抱歉成为 Debbie-downer,但我只是认为如果没有一些深入挖掘和大型解决方法,您的代码将不再工作。如果您希望它轻松工作,您可能不得不回到 2011 年初,然后改为制作您的应用程序。

好消息

由于缺乏使用WebKit. 与其寻找为什么你的代码不能工作的答案,我会开始寻找你的代码应该做什么的替代方案。

于 2012-05-19T13:54:14.187 回答
1

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

webview中的本地存储不是持久的

于 2013-08-09T18:24:37.067 回答