objective-c - 更改 JavascriptCore 中 window.localStorage 的值(从 C/Obj-C API 重新定义不可配置的属性)

标签 objective-c macos cocoa webkit javascriptcore

OSX 中的 WebKit 框架有一个损坏的 localStorage 实现,它不会持久保存存储的数据(应用程序重启后数据不存在)。

所以我实现了一个替代的 LocalStorage 对象。

但是,我无法分配 window.localStorage = myLocalStorage,因为 localStorage 被定义为不可写且不可配置。

我找不到通过使用 C/Obj-C API 来覆盖 JavascriptCore 中此类属性的方法。有办法吗?

最佳答案

您不能直接覆盖它,但可以使用 StorageItem 覆盖它。但是覆盖存储项将覆盖 session 存储和本地存储

var _setItem = Storage.prototype.setItem; // first assign it to some variable
Storage.prototype.setItem = function(key, value) { 
   if (this === window.localStorage) {
     // play with localstorage here
   } else {
     // fallback
     _setItem.apply(this, arguments);
   }
}

第二种方法是用__proto__ 属性覆盖,但这不是标准的,它在 firefox、chrom、opera 中支持,但其他的不确定

localStorage.__proto__ = Object.create(Storage.prototype);

检查这个例子,他们写了覆盖默认值来存储 JSON 对象

https://gist.github.com/danott/942522

关于objective-c - 更改 JavascriptCore 中 window.localStorage 的值(从 C/Obj-C API 重新定义不可配置的属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547744/

相关文章:

cocoa - 确定 Cocoa (MAC OSX) 中字符串的像素长度

ios - UICollectionView 移动单元格在单击单元格后还原

c++ - 在 Mac OS X 上安装 C++ Armadillo 库

c++ - 以 root 身份运行时 setlocale() 返回 'C'

ODF 和 ODS (OpenOffice) 的 Objective-C 包装器?

cocoa - 具有延迟 NSMenu 的 NSButton - Objective-C/Cocoa

objective-c - 如何声明由可变类型支持的不可变属性?

objective-c - Xcode 崩溃 - 但仅针对特定项目(目标 'MyApp' 已被要求提供其构建上下文,但它不属于项目)

objective-c - Objective-C 中一行中的多个逗号分隔调用

python - 在 Python (Mac) 中使用 OpenCV 裁剪视频