如何在iOS上访问PhoneGap创建的HTML5本地存储?

时间:2012-01-30 16:31:56

标签: ios cordova local-storage

我们正在从PhoneGap过渡到真正原生的iPhone应用程序,我们需要访问存储在PhoneGap创建的HTML5本地存储中的用户数据。我们如何获取这些数据,以便我们可以为用户创建无缝更新过程?

4 个答案:

答案 0 :(得分:5)

我没有尝试过Mattias的方式,但我只是直接访问了webkit本地存储数据库,然后导入了iPhone SDK附带的sqlite3 lib来提取我需要的值。这是您访问PhoneGap创建的localstorage的方式:

NSString *databaseName = @"file__0.localstorage"; 

//Get Library path 
NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, 
                                                            NSUserDomainMask, YES); 
NSString *libraryDir = [libraryPaths objectAtIndex:0];

NSString *databasePath = [libraryDir 
                             stringByAppendingPathComponent:@"WebKit/LocalStorage/"]; 

NSString *databaseFile = [databasePath 
                             stringByAppendingPathComponent:databaseName]; 

BOOL webkitDb; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 

webkitDb = [fileManager fileExistsAtPath:databaseFile]; 

if (webkitDb) {
    MMWebKitLocalStorageController* wkc = [[MMWebKitLocalStorageController alloc] init];
    [wkc updateUserFromLocalStorage:databaseFile];
}

答案 1 :(得分:3)

我认为目前没有用于访问本地存储的本机API,但您可以尝试使用一些将本地存储转储为JSON的JavaScript创建Web视图。

创建一个UIWebView,其UIWebViewDelegate委托实现webViewDidFinishLoad:方法,并使用stringByEvaluatingJavaScriptFromString:方法触发转储。

像这样的东西,首先要在网页视图中加载页面:

<html>
<head>
  <script>
  // download and insert JSON-js here
  // https://github.com/douglascrockford/JSON-js

  function dumpLocalStorageToJSON() {
    d = {};
    for(i = 0; i < localStorage.length; i++)
      d[localStorage.key(i)] = localStorage.getItem(localStorage.key(i));
    return JSON.stringify(d);
  }
  </script>
</head>
</html>

然后完成加载委托方法:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
  NSString *localStorageAsJSON = [webView stringByEvaluatingJavaScriptFromString:@"dumpLocalStorageToJSON();"];
  // parse JSON and do something useful
}

答案 2 :(得分:1)

我只是提供一些细节FYI,数据库whitch路径中的LocalStorage保存

  1. Library/Caches/(UIWebView中)
  2. Library/WebKit/WebsiteData/LocalStorage/(UIWebView中)
  3. SELECT key,value FROM ItemTable(WKWebView)
  4. 然后打开数据库,执行查询key可以得到valueNSUTF16LittleEndianStringEncoding。关键是NSString,值是NSData,用[[NSString alloc] initWithData:data encoding:NSUTF16LittleEndianStringEncoding]; 编码,转换为NSString with代码:

     [[[ 1  2  3]
       [ 4  5  6]]
    
      [[ 7  8  9]
       [10 11 12]]]
    

答案 3 :(得分:0)

在 iOS 12 上,Library/WebKit/WebsiteData/LocalStorage/proto_domain_0.localstorage 似乎是 iOS webview 的正确路径,其中 proto 类似于 httpdomain 类似于 {{1} }. localhost 等是否可能存在或是否在 iOS 13 及更高版本中发生变化尚不清楚。

结果数据是一个 SQLite 版本 3 数据库,其中一个表包含 _1 键。出于某种原因,它不想显示超出第一个字节的值,设置 localStorage 然后解码十六进制数据是读取数据的最简单方法(这是在 iOS 应用程序中找到的路径遍历,此页面是数十个页面中最有用的页面之一,但没有直接描述 iOS 应用数据目录中本地存储缓存的路径和文件名的剖析)。