Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在基于WebKit的应用程序中启用本地存储?_Objective C_Ios_Webkit_Local Storage - Fatal编程技术网

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

Objective c 如何在基于WebKit的应用程序中启用本地存储?,objective-c,ios,webkit,local-storage,Objective C,Ios,Webkit,Local Storage,我有一个Cocoa/Objective-C应用程序,它嵌入了WebKit WebView。我需要打开数据库支持和本地存储。我知道这是可以做到的——我让它在Safari中工作——但我找不到一个如何在我自己的应用程序中设置它的示例 我发现这提供了一个例子,但正如最初的海报所提到的,不起作用。事实上,他使用的方法(setDatabasesEnabled、setLocalStorageEnabled)并没有在我的WebKit.framework(Xcode 3.2.5)中定义,尽管如果我自己定义它们,它

我有一个Cocoa/Objective-C应用程序,它嵌入了WebKit WebView。我需要打开数据库支持和本地存储。我知道这是可以做到的——我让它在Safari中工作——但我找不到一个如何在我自己的应用程序中设置它的示例

我发现这提供了一个例子,但正如最初的海报所提到的,不起作用。事实上,他使用的方法(setDatabasesEnabled、setLocalStorageEnabled)并没有在我的WebKit.framework(Xcode 3.2.5)中定义,尽管如果我自己定义它们,它们似乎是存在的

有人能举个例子说明如何为基于WebKit的Cocoa应用程序启用本地数据库存储吗?非常感谢

更新:我有些东西在工作……我被“数据库”和“本地存储”弄糊涂了,它们显然是完全不同的东西。以下是有效的代码:

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

这是可行的,但它需要私有方法setLocalStorageDatabasePath,这意味着我没有应用商店。因此,我现在要修正的问题是:有没有一种不使用私人方法就能实现这一目标的方法?我找到了,它控制着数据库的去向。但是我在源代码中的任何地方都找不到本地存储的对应密钥。或者我有没有办法强制本地存储使用数据库,从而使用WebDatabaseDirectory键?有什么想法吗?

我将采用Javascript到Objective-C桥接的方法,并将所有内容存储在核心数据中。将localStorage设置为false,然后使用相同的方法构建一个JS对象和一个名为“localStorage”的实例。我的javascript开发人员不会知道这两者之间的区别,我已经对Air做了同样的事情(基本上)。还有另一种方法可以保持本地存储完好无损,即使它实际上并不将它们存储在持久数据库中。这些元素可以在javascript中迭代并从那里进行操作,但我认为最好是简单地用我自己的对象替换对象

我向Mac app Store提交了一个使用此代码的应用程序,苹果批准了它:

目标-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日起允许我申请更新:他们还批准了对同一应用程序的版本更新,因此已经进行了两次。

在经历了许多痛苦和挫折之后,我找到了一种方法来启用本地存储,并使其在应用程序正常运行时保持不变。此解决方案专门针对OSX,但也可能适用于iOS

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

添加以下行:

static NSString* _storageDirectoryPath();
+ (NSString *)_storageDirectoryPath;
这些允许您检索WebKit本地存储跟踪器数据库的目录位置。这一点很重要,因为由于WebKit中存在一个bug,如果您没有将LocalStorage WebView文件存储在与tracker数据库相同的目录中,则每隔运行一次应用程序时,它们就会被删除。我在WebStorageManager代码中没有看到为单个应用程序更改此位置的方法。它总是从用户首选项中读取

在appDelegate中包含WebStorageManagerPrivate.h

#include "WebStorageManagerPrivate.h"
#include "WebPreferencesPrivate.h"
您需要下载并在项目中包含XCode发行版中未包含的另一个标头。另存为WebPreferencesPrivate.h

在appDelegate中包含WebPreferencesPrivate.h

#include "WebStorageManagerPrivate.h"
#include "WebPreferencesPrivate.h"
现在,在ApplicationIDFinishLaunching处理程序中使用下面的代码来初始化和启用LocalStorage。代码假定您使用的webView有一个名为“webView”的IBMOutlet

    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中被正确修复。

这听起来是一个有趣的解决方案(苹果不会对此加以标记)。我真的希望看到一些代码:)这种方法唯一的问题是,如果使用sqlite,查询将异步运行,因此
alert(localStorage.getItem('a')不起作用。我在哪里可以找到这种方法的示例?如果能打开此桥的源代码,那就太好了。您是如何用自己的Windows.localStorage替换的?我成功地实现了一个LocalStorage对象,但是我无法分配给window.LocalStorage.Finally来清除最后一组环,我的应用程序现在也在商店里。你把它放在哪里了@实施H感谢您的澄清。。为愚蠢感到抱歉…一般来说,苹果会批准大多数WebKit私有方法,因为WebKit本身是开源的。这个问题最近一次出现是在将近一年前,所以苹果可能已经取消了对
\u setLocalStorageDatabasePath:
setLocalStorageEnabled:
方法的支持,因为我找不到在任何地方使用它们的方法,但是,如果您知道支持仍然存在,我将如何在代码中获得对这些方法的支持,以便使用它们?您如何在Swift中做到这一点?您遇到了什么问题?错误?不储蓄?我已经在10.7下测试过了,很好。在10.11下(El Capitan),这不再有效。为了保存和加载操作,我不得不求助于桥接到本机代码。为了最小化Javascript的更改,您可以覆盖Storage.prototype中的标准“set”和“get”函数,并调用桥接函数。苹果公司在使用本地文件引用为Webkit应用程序存储本地存储的安全处理方面填补了空白。