localStorage 未在 OSX 应用程序中保留(Xcode 4.3)

Posted

技术标签:

【中文标题】localStorage 未在 OSX 应用程序中保留(Xcode 4.3)【英文标题】:localStorage not persisting in OSX app (Xcode 4.3) 【发布时间】:2012-05-15 22:23:44 【问题描述】:

据我所知,如果您正在构建 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 setDefaultFontSize:10] - 但不能访问我列出的上述两个方法。

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

【问题讨论】:

错误信息说没有声明 _setLocalStorageDatabasePath: - 并不是说​​如果你调用它就不起作用。如果你调用它可能会起作用,然后当 Apple 发布 10.8 或 10.7.5 时,它可能会停止工作。很可能您无论如何都不想使用它们。 @TomAndersen 不,它实际上不会编译。请注意,“setLocalStorageEnabled”方法也不起作用 - 这甚至不是私有方法。 你可以在 cocoa 中调用任何东西:例如取一个 NSString aString,然后是 [aString thisIsACallThatWillNotWork];应该编译,并在运行时导致崩溃。也许您正在使用不同的编译器设置。 【参考方案1】:

好的,我有一个解决方案。我查看了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 不再提供这些方法。您链接到的那个问题“How do I enable Local Storage in my WebKit-based application?”最后一次活跃是一年多前(接受的答案是在 2011 年初编辑的)。从那时起,Xcode 至少有两次更新(可能更多,我只是不记得它们了),对我来说,Apple 希望将它们的私有方法保持私有似乎是可行的,所以可以安全地假设他们删除了它们以及对setLocalStorageEnabled:的支持。

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

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

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

好消息

可能有一些解决方案不涉及私有和不受支持的方法,由于我缺乏使用WebKit 的经验,我只是不知道这些方法。我不会为您的代码为何无法工作而寻找答案,而是开始为您的代码应该做的事情寻找替代方案。

【讨论】:

要检查的一件事:如果您编写 html5 代码(js + html5),然后将其放入您的 Web 视图中是否有效?然后,如果您需要,您可以将您的 js 连接到您的目标 c 以放置/获取数据。 不,这行不通;这是调用 ios SDK 不再支持的方法的问题,而不是 Web 视图的内容。 我认为你是对的,它不再受支持。我可能不得不使用与 PhoneGap 类似的方法 - 程序退出时将 localStorage.db 复制到安全位置,并在程序再次启动时恢复。【参考方案3】:

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

Local Storage in webview is not persistent

【讨论】:

以上是关于localStorage 未在 OSX 应用程序中保留(Xcode 4.3)的主要内容,如果未能解决你的问题,请参考以下文章

libpng 未在 Mac OSX 10.9.2 上链接

viewDidLoad 函数未在 Xcode 6.2 swift 应用程序中调用,但在 OS X 上的 Xcode 6.4 swift 应用程序中调用

CoreMIDI 应用程序未在其他软件中显示

XAMPP - Apache 未在 Mac OS 上启动

使用 py2app 构建 PySide 应用程序包时,QApplication 未在主线程中运行

PhpStorm + XAMPP 未在命令行中显示最新的 PHP 版本