我目前正在重构一个应用程序,使用OPFS将图像保存在iPad上,用于用户需要在没有wi-fi的位置拍照的用例,但将所有图像存储在RAM中会导致iPad崩溃。
我已经成功地创建了一个可以在Chrome和Firefox的本地Windows机器上工作的OPFS Worker,但我不能让它在测试iPad上工作。[编辑]它所做的是将base64文本发送给worker,并将其保存为文本文件,我可以稍后检索。
我正在测试的iPad是iOS 16版本。3.1.
我正在开发的iPad是iOS 15版。7.3.
据我所知,Safari iOS从15开始就兼容OPFS了。2.
我能够将问题缩小到一个特定的错误(通过Web Inspector):Unhandled Promise Rejection: UnknownError: invalid platform file handle
它引用回以下代码(在Web Worker中):
const root = await navigator.storage.getDirectory();
const saveHandle = await root.getFileHandle(input.fileName, { create: true });
const access = await saveHandle.createSyncAccessHandle(); //<-- ERROR
input.fileName
通常类似于S0I0.txt
,基于我用于组织图像的标签系统。
文件是否由getFileHandle()
创建似乎并不重要。
我无法从Error
对象中提取任何其他内容。
我也找不到任何地方提到这个具体的错误。它不在web文档中的Exceptions
列表中。事实上,我找到的唯一一个确切短语的引用是在an old ticket from 2013上。
据我所知,前面的两条语句工作正常,并生成了正确的对象,分别是FileSystemDirectoryHandle
和FileSystemFileHandle
。
【更新】:
我做了更多的挖掘,发现了一些对保留文件名的引用(比如Windows上的con
),所以我尝试了一些使用不同文件名的测试(比如test1.txt
),我还尝试删除{ create: true }
子句,但没有成功。
我开始觉得这是一个兼容性问题,但这听起来不对,因为Safari iOS 15的multiplesourcessay。2和更高版本可以支持OPFS,但不支持文件系统访问API的其余部分。我是否无意中使用了FSA API的不兼容部分?
1条答案
按热度按时间of1yzvn41#
这是WebKit方面的一个问题,在https://bugs.webkit.org/show_bug.cgi?id=251460中报告,已标记为已修复。这可能是因为您的设备没有包含此修复程序的Safari版本,因为Safari版本绑定到操作系统。如果你的应用程序可以公开访问,我很乐意在我的一台设备上进行测试,无论最新的beta版本是什么。