API доступа к файловой системе в Safari iOS — createSyncAccessHandle() UnknownError: «недопустимый дескриптор файла платформы»

В настоящее время я рефакторинг приложения для использования 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?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это была проблема на стороне WebKit, о которой сообщалось в https://bugs.webkit.org/show_bug.cgi?id=251460, которая помечена как исправленная. Возможно, на ваших устройствах нет версии Safari, которая включает это исправление, поскольку выпуски Safari привязаны к операционной системе. Если ваше приложение общедоступно, я буду рад протестировать его на одном из своих устройств, на каждом из которых установлена ​​последняя бета-версия.

О, хорошо, значит, я не сумасшедший. Я собираюсь обновить систему на своем устройстве и попробовать. Поскольку это было «исправлено» в январе, я надеюсь, что это вошло в одну из трех версий, выпущенных с тех пор. Я ничего не вижу в примечаниях к выпуску, но, вероятно, они слишком малы, чтобы обращать на них внимание. К сожалению, это внутреннее приложение, поэтому я не могу дать вам ссылку, которой можно поделиться, но, тем не менее, я ценю это предложение, однако это приложение мало что делает, кроме сохранения и извлечения файлов, поэтому, если createSyncAccessHandle() работает на любом из ваших устройств, тогда Это все, что мне нужно. Спасибо!

mshaw 27.04.2023 20:36

Вопрос. Я обновился до версии 16.4.1 и теперь не могу вывести консольные сообщения. Я немного покопался, и похоже, что это как-то связано с этим свойством isInspectable, но ни одна из перечисленных реализаций не написана на Javascript. Как включить isInspectable, если я не использую Swift или Objective-C?

mshaw 28.04.2023 15:26

Извините, но я не знаю ответа на этот конкретный вопрос. Что я могу вам сказать, так это то, что до недавнего времени была проблема с исходной частной файловой системой в подворках (см. ошибка), так что, возможно, вы сталкиваетесь с чем-то похожим, когда пытаетесь использовать API из WKWebView. Хотя это чистое предположение.

DenverCoder9 30.04.2023 01:06

Просто для закрытия, оказывается, это была проблема с версией iMac, которую я тестировал, по сравнению с новой версией iOS для iPad [слишком старая].

mshaw 10.05.2023 17:16

Спасибо за то, что дали нам знать. Приятно слышать, что загадка раскрыта.

DenverCoder9 11.05.2023 15:38

Другие вопросы по теме

Как вы манипулируете двумя датами в «некотором представлении» в SwiftUI
Проблема сборки с xcode 14.3 при архивировании для выпуска IPA [iOS][Flutter]
Ошибка при запуске «установки модуля» в терминале -> CocoaPods не удалось найти совместимые версии для модуля «FirebaseAppCheck»
Должен ли я использовать viewDidLayoutSubviews() или traitCollectionDidChange(), чтобы реагировать на изменения в ориентации интерфейса
MacOS Ventura как ориентироваться на ios 10
Сообщение об ошибке: libc++abi: завершение работы с необработанным исключением типа NSException, этот класс не соответствует кодированию значения ключа для ключа emailTxt
Как отобразить вид над навигационным контроллером с помощью UIKit
Обнаружено неожиданное значение нулевого указателя при попытке привести значение типа «UIApplication» (0x1ba22ac10) к «NSObject» (0x1ba227d18)
Как непрерывно создавать эффект ряби и повторять процесс после некоторой задержки в Swift
CollectionView не сосредоточен на iOS в MAUI