Загрузка socket.io в JavaScriptCore для iOS

Я пишу приложение iOS/JavaScriptCore, которое вызывает код из файла Javascript. Мой код Javascript зависит от переменной io, созданной путем импорта socket.io.js. Все Javascript отлично работает при загрузке из файла HTML, но когда я загружаю socket.io.js в JavaScriptCore, переменная io не определена, и мой собственный Javascript не может работать.

My JSCore code looks like this...

NSString *socketPath = [[NSBundle mainBundle] pathForResource:@"socket.io" ofType:@"js"];
NSString *socketJS = [NSString stringWithContentsOfFile:socketPath encoding:NSUTF8StringEncoding error:nil];
JSValue  *socketEval = [context evaluateScript: socketJS];

NSString *arPath = [[NSBundle mainBundle] pathForResource:@"arFunctions" ofType:@"js"];
NSString *arJS = [NSString stringWithContentsOfFile:arPath encoding:NSUTF8StringEncoding error:nil];
JSValue  *arEval = [context evaluateScript: arJS];

JSValue *function = context[@"connectToServer"];
JSValue *result = [function callWithArguments:nil];

Обработчик исключений, определенный для контекста, возвращает эти ошибки, когда AssessmentScript запускается в импортированном файле socket.io... TypeError: undefined is not an object (evaluating 'Object.prototype') runInContext webpack_require webpack_require webpack_require webpackUniversalModuleDefinition

Функция connectToServer завершается ошибкой, поскольку она ожидает, что переменная io уже определена. кто-нибудь знает, почему переменная io не создается в контексте, когда я вызываю AssessmentScript на socket.io.js? Похоже, что в socket.io отсутствуют ожидаемые определения или другие ресурсы при оценке runInContext и webpackUniversalModuleDefinition, но я загружаю те же самые файлы Javascript в том же порядке, что и в моем файле HTML. Что мне здесь не хватает?

Я разрабатываю Xcode 9 на macOS High Sierra для iOS 11.

Спасибо!


person noah.b    schedule 25.10.2017    source источник
comment
это среда браузера, которая предлагает window.WebSocket()?   -  person dandavis    schedule 25.10.2017
comment
Он не работает в браузере. Это приложение ARkit для iOS.   -  person noah.b    schedule 26.10.2017
comment
Я думаю, что в среде JavaScriptCore отсутствуют все API-интерфейсы браузера, связанные с SocketIO, которые используются для установления соединений с веб-сокетами и т. Д. У вас когда-нибудь это работало?   -  person Jed Richards    schedule 01.07.2019


Ответы (1)


Возможно, я столкнулся с той же проблемой при переносе рабочего кода JavaScriptCore в High Sierra.

В моем случае проблема возникла из-за того, что я невольно полагался на то, что -[NSFileManager enumeratorAtURL: includingPropertiesForKeys: options: errorHandler:] возвращает перечислитель, который отсортировал свое содержимое на основе пути URL-адресов. Раньше это имело место в macOS 10.12, но, похоже, не в случае 10.13, где порядок, похоже, определяется каким-то неизвестным свойством файловой системы.

person ryecroft    schedule 15.11.2017