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)的主要内容,如果未能解决你的问题,请参考以下文章
viewDidLoad 函数未在 Xcode 6.2 swift 应用程序中调用,但在 OS X 上的 Xcode 6.4 swift 应用程序中调用