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

我有一个embeddedWebKit WebView的Cocoa / Objective-C应用程序。 我需要打开数据库支持和本地存储。 我知道这是可以做到的 – 我已经在Safari上工作了 – 但我找不到如何在我自己的应用程序中设置的例子。

我发现这个(未答复的)SO问题提供了一个例子,但是,正如原来的海报所提到的,这个问题不起作用。 事实上,他使用的方法(setDatabasesEnabled,setLocalStorageEnabled)没有在我的WebKit.framework(Xcode 3.2.5)中定义,虽然它们似乎存在,如果我自己定义它们。

任何人都可以提供一个如何启用本地数据库存储为基于WebKit的cocoa应用程序的例子吗? 非常感谢!

更新:我有一些工作…我被“数据库”与“本地存储”混淆,这显然是完全不同的东西。 以下是可用的代码:

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

所以,这工作,但它需要私人方法_setLocalStorageDatabasePath,这意味着没有App Store的我。 所以我现在修改的问题是:有没有办法使这个工作, 而不使用私人方法? 我在这个答案中find了WebDatabaseDirectory首选项 ,它控制着数据库的位置 。 但是我找不到源中任何位置的本地存储的相应密钥。 或者有没有办法让我强制本地存储使用数据库,所以WebDatabaseDirectory的关键? 有任何想法吗?

我提交了一个应用程序使用这个代码到Mac App Store,苹果公司批准它:

Objective-C的

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

Swift 3

 var prefs: WebPreferences? = webView.preferences prefs?._setLocalStorageDatabasePath("~/Library/Application Support/MyApp") prefs?.localStorageEnabled = true 

他们是否会继续批准,我不知道,但他们从2011年1月29日起允许我申请。 更新:他们也批准了一个版本更新到同一个应用程序,所以它经历了两次。

我将采用Javascript到Objective-C的桥接方式,并将所有内容存储在核心数据中。 将localStorage设置为false,然后使用相同的方法构build一个名为“localStorage”的JS对象和一个实例。 我的JavaScript开发人员不知道差异,我已经不得不做空气(基本上)同样的事情。 还有另一种方法可以让localStorage保持完整,即使它并没有实际存储在一个持久数据库中。 元素可以在javascript中迭代并从那里操作,但是我认为用我自己的方法replace对象会更好。

在经历了很多痛苦和挫折之后,我发现了一种启用本地存储的方法,并且在应用程序正常运行的过程中持续存在。 该解决scheme专门用于OSX,但也可能适用于iOS。

下载并将此头文件添加到您的项目。 它不包含在XCode Webkit发行版中。

点击下载WebStorageManagerPrivate.h

添加到它,以下行:

 static NSString* _storageDirectoryPath(); + (NSString *)_storageDirectoryPath; 

这些允许您检索WebKit本地存储跟踪器数据库的目录位置。 这很重要,因为由于WebKit中的一个错误,如果您不将LocalStorage WebView文件与跟踪器数据库存储在同一个目录中,则每隔一次运行应用程序时都会将其删除。 我没有看到在WebStorageManager代码中更改单个应用程序的位置。 它总是从用户偏好中读取。

在您的appDelegate中包含WebStorageManagerPrivate.h。

 #include "WebStorageManagerPrivate.h" 

您需要下载并在您的项目中包含另一个未包含在XCode分发中的头文件。 将其保存为WebPreferencesPrivate.h

点击下载WebPreferencesPrivate.h

在您的appDelegate中包含WebPreferencesPrivate.h。

 #include "WebPreferencesPrivate.h" 

现在在applicationDidFinishLaunching处理程序中使用下面的代码来初始化和启用LocalStorage。 该代码假定您有一个名为“webView”的IBOutlet用于您正在使用的WebView。

  NSString* dbPath = [WebStorageManager _storageDirectoryPath]; WebPreferences* prefs = [self.webView preferences]; NSString* localDBPath = [prefs _localStorageDatabasePath]; // PATHS MUST MATCH!!!! otherwise localstorage file is erased when starting program if( [localDBPath isEqualToString:dbPath] == NO) { [prefs setAutosaves:YES]; //SET PREFS AUTOSAVE FIRST otherwise settings aren't saved. // Define application cache quota static const unsigned long long defaultTotalQuota = 10 * 1024 * 1024; // 10MB static const unsigned long long defaultOriginQuota = 5 * 1024 * 1024; // 5MB [prefs setApplicationCacheTotalQuota:defaultTotalQuota]; [prefs setApplicationCacheDefaultOriginQuota:defaultOriginQuota]; [prefs setWebGLEnabled:YES]; [prefs setOfflineWebApplicationCacheEnabled:YES]; [prefs setDatabasesEnabled:YES]; [prefs setDeveloperExtrasEnabled:[[NSUserDefaults standardUserDefaults] boolForKey: @"developer"]]; #ifdef DEBUG [prefs setDeveloperExtrasEnabled:YES]; #endif [prefs _setLocalStorageDatabasePath:dbPath]; [prefs setLocalStorageEnabled:YES]; [self.webView setPreferences:prefs]; } 

我希望这可以帮助别人解决这个问题,或者一直在努力解决这个问题,直到在WebKit中正确解决问题。