Как получить доступ к локальному хранилищу HTML5, созданному PhoneGap на iOS? - PullRequest
5 голосов
/ 30 января 2012

Мы переходим от PhoneGap к настоящему родному приложению для iPhone, и нам необходим доступ к пользовательским данным, хранящимся в локальном хранилище HTML5, созданном PhoneGap. Как нам получить эти данные, чтобы мы могли создать плавный процесс обновления для пользователя?

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Я не пробовал путь Маттиаса, но я просто напрямую обратился к базе данных локального хранилища webkit, а затем импортировал библиотеку sqlite3, включенную в iPhone SDK, чтобы извлечь нужные мне значения.Вот как вы получаете доступ к localalstorage, созданному PhoneGap:

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];
}
3 голосов
/ 31 января 2012

Я не думаю, что в настоящее время существует какой-либо собственный API для доступа к локальному хранилищу, но вы можете попробовать создать веб-представление с некоторым JavaScript, который выводит локальное хранилище в, например, JSON.

Создайте 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
}
1 голос
/ 02 апреля 2018

Я просто привожу некоторые подробности, к сведению, что LocalStorage сохраняет в базе данных путь

  1. Library/WebKit/LocalStorage/ (UIWebView)
  2. Library/Caches/ (UIWebView)
  3. Library/WebKit/WebsiteData/LocalStorage/ (WKWebView)

Затем откройте базу данных, выполните запрос SELECT key,value FROM ItemTable можно получить key и value. Ключ - NSString, значение - NSData, закодировать с помощью NSUTF16LittleEndianStringEncoding, преобразовать в NSString с кодом:

[[NSString alloc] initWithData:data encoding:NSUTF16LittleEndianStringEncoding];
...