В настоящее время я рефакторинг приложения для использования OPFS для сохранения изображений на iPad для случая использования, когда пользователю необходимо делать снимки в месте, где нет Wi-Fi, но хранение всех изображений в ОЗУ вызовет iPad сломается.
Мне удалось создать рабочий OPFS Worker, который работает на моем локальном компьютере с Windows в Chrome и Firefox, но я не могу заставить его работать на тестовом iPad. [EDIT] Что он делает, так это отправляет текст base64 рабочему и сохраняет его в виде текстового файла, который я могу получить позже.
iPad, который я использую для тестирования, имеет версию iOS 16.3.1.
iPad, для которого я пытаюсь разработать, — iOS версии 15.7.3.
Насколько я могу судить, Safari iOS поддерживает OPFS с версии 15.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.
Я также не смог нигде найти ссылку на эту конкретную ошибку. Его нет в списке Exceptions в веб-документах . На самом деле, единственная ссылка на точную фразу, которую я нашел, находится на старом билете 2013 года.
Насколько я могу судить, два предыдущих утверждения работают правильно и генерируют правильные объекты, а именно FileSystemDirectoryHandle и FileSystemFileHandle соответственно.
[ОБНОВЛЯТЬ]:
Я еще немного покопался и нашел несколько ссылок на зарезервированные имена файлов (например, con в Windows), поэтому я попробовал несколько тестов с использованием разных имен файлов (например, test1.txt), а также безуспешно пытался удалить пункт { create: true }.
Мне начинает казаться, что это проблема совместимости, но это звучит неправильно, поскольку несколько источников говорят, что Safari iOS 15.2 и более поздние версии могут поддерживать OPFS, но не остальные API доступа к файловой системе. Я невольно использую несовместимую часть FSA API?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это была проблема на стороне WebKit, о которой сообщалось в https://bugs.webkit.org/show_bug.cgi?id=251460, которая помечена как исправленная. Возможно, на ваших устройствах нет версии Safari, которая включает это исправление, поскольку выпуски Safari привязаны к операционной системе. Если ваше приложение общедоступно, я буду рад протестировать его на одном из своих устройств, на каждом из которых установлена последняя бета-версия.
Вопрос. Я обновился до версии 16.4.1 и теперь не могу вывести консольные сообщения. Я немного покопался, и похоже, что это как-то связано с этим свойством isInspectable, но ни одна из перечисленных реализаций не написана на Javascript. Как включить isInspectable, если я не использую Swift или Objective-C?
Извините, но я не знаю ответа на этот конкретный вопрос. Что я могу вам сказать, так это то, что до недавнего времени была проблема с исходной частной файловой системой в подворках (см. ошибка), так что, возможно, вы сталкиваетесь с чем-то похожим, когда пытаетесь использовать API из WKWebView. Хотя это чистое предположение.
Просто для закрытия, оказывается, это была проблема с версией iMac, которую я тестировал, по сравнению с новой версией iOS для iPad [слишком старая].
Спасибо за то, что дали нам знать. Приятно слышать, что загадка раскрыта.
О, хорошо, значит, я не сумасшедший. Я собираюсь обновить систему на своем устройстве и попробовать. Поскольку это было «исправлено» в январе, я надеюсь, что это вошло в одну из трех версий, выпущенных с тех пор. Я ничего не вижу в примечаниях к выпуску, но, вероятно, они слишком малы, чтобы обращать на них внимание. К сожалению, это внутреннее приложение, поэтому я не могу дать вам ссылку, которой можно поделиться, но, тем не менее, я ценю это предложение, однако это приложение мало что делает, кроме сохранения и извлечения файлов, поэтому, если
createSyncAccessHandle()работает на любом из ваших устройств, тогда Это все, что мне нужно. Спасибо!