我们正在从PhoneGap过渡到真正原生的iPhone应用程序,我们需要访问存储在PhoneGap创建的HTML5本地存储中的用户数据。我们如何获取这些数据,以便我们可以为用户创建无缝更新过程?
答案 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保存
Library/Caches/
(UIWebView中)Library/WebKit/WebsiteData/LocalStorage/
(UIWebView中)SELECT key,value FROM ItemTable
(WKWebView)然后打开数据库,执行查询key
可以得到value
和NSUTF16LittleEndianStringEncoding
。关键是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
类似于 http
,domain
类似于 {{1} }. localhost
等是否可能存在或是否在 iOS 13 及更高版本中发生变化尚不清楚。
结果数据是一个 SQLite 版本 3 数据库,其中一个表包含 _1
键。出于某种原因,它不想显示超出第一个字节的值,设置 localStorage
然后解码十六进制数据是读取数据的最简单方法(这是在 iOS 应用程序中找到的路径遍历,此页面是数十个页面中最有用的页面之一,但没有直接描述 iOS 应用数据目录中本地存储缓存的路径和文件名的剖析)。