Как исправить тайм-аут waitForSyncReply с приложением Meteor/Cordova для iOS?

У нас есть приложение Meteor/Cordova. Разработка работает нормально, за исключением случаев развертывания на реальном устройстве iPhone. Чаще всего приложение зависает после пары действий, в результате чего в XCode появляются следующие логи:

2016-12-15 13:12:43.546614 museumexplorer[738:169260] #WK: Connection::waitForSyncReply: Timed-out while waiting for reply, id = 35
2016-12-15 13:12:44.554481 museumexplorer[738:169260] #WK: Connection::waitForSyncReply: Timed-out while waiting for reply, id = 36
2016-12-15 13:12:45.559667 museumexplorer[738:169260] #WK: Connection::waitForSyncReply: Timed-out while waiting for reply, id = 37
2016-12-15 13:13:06.239664 museumexplorer[738:169260] #WK: Connection::waitForSyncReply: Timed-out while waiting for reply, id = 38
2016-12-15 13:13:07.248334 museumexplorer[738:169260] #WK: Connection::waitForSyncReply: Timed-out while waiting for reply, id = 39
2016-12-15 13:13:08.260760 museumexplorer[738:169260] #WK: Connection::waitForSyncReply: Timed-out while waiting for reply, id = 40

Я обнаружил, что это как-то связано с функциональностью маяков. Если я закомментирую следующий код, зависаний не произойдет.

cordova.plugins.locationManager.startRangingBeaconsInRegion(beaconRegion)
    .fail(console.error)
    .done();

Я продолжу расследование. Но если у кого-то есть какие-то блестящие идеи, буду рад услышать!

С уважением, Крис


person Chris    schedule 15.12.2016    source источник
comment
Кажется, это связано с WebKit, когда я использую Google Connection::waitForSyncReply   -  person Chris    schedule 15.12.2016
comment
Очень мало информации, чтобы продолжать здесь. Какие действия вы выполняете?   -  person Mikkel    schedule 15.12.2016
comment
Просто навигация по приложению. Нажатие на пункты меню. Зависает в случайные моменты, иногда с самого начала.   -  person Chris    schedule 15.12.2016
comment
Я получаю точное сообщение об ошибке. Где найти и закомментировать приведенный выше код? cordova.plugins.locationManager...   -  person Neutrino    schedule 03.01.2017
comment
Кроме того, я не использую Beacons или locationManager. Я использую Meteor/Cordova для создания проекта iOS. Какие-либо предложения?   -  person Neutrino    schedule 03.01.2017
comment
@Neutrino, если вы не используете маяки или locationManager, вам, вероятно, лучше создать новый вопрос. Я думаю, что эта ошибка указывает на зависание или полный сбой движка JavaScript. В моем случае это, вероятно, было вызвано огромным количеством вызовов обратного вызова didRangeBeacons в сочетании с накладными расходами JavaScript Cordova. Потому что в нативном приложении эта ситуация сработала бы просто отлично.   -  person Chris    schedule 03.01.2017
comment
@Neutrino Мой совет для вас: попробуйте удалить огромные части вашего кода, пока ошибка не исчезнет. И когда он исчезнет, ​​вернитесь к коду, который вы только что удалили, и начните удалять его части и так далее. Попробуйте сузить круг таким образом. Так я узнал, что в нашем случае это был код маяка. Но это, вероятно, может быть любой тяжелый код JavaScript.   -  person Chris    schedule 03.01.2017
comment
Как вы могли обнаружить, что эта проблема связана только с маяками? @Крис   -  person Hemang    schedule 04.06.2020


Ответы (2)


Очевидно, ранжирование 98 маяков — это слишком много, по крайней мере, с накладными расходами на обратный вызов JavaScript в приложении Cordova. Проблема заключалась в том, что startRangingBeaconsInRegion вызывался для каждого маяка. Мы изменили его на вызов для каждого UUID (которых всего 2). Все приложение теперь кажется более плавным и отзывчивым!

Итак, мы заменяем это:

var beaconRegion = new cordova.plugins.locationManager.BeaconRegion(beacon._id,
    beacon.uuid,
    beacon.major,
    beacon.minor);

cordova.plugins.locationManager.startRangingBeaconsInRegion(beaconRegion)
    .fail(console.error)
    .done();

С этим:

var beaconRegion = new cordova.plugins.locationManager.BeaconRegion('museumexplorerbeacon_' + uuid,
    uuid);

cordova.plugins.locationManager.startRangingBeaconsInRegion(beaconRegion)
    .fail(console.error)
    .done();
person Chris    schedule 16.12.2016
comment
Это может быть тот случай, когда запуск JavaScript в WebView (как это делает Cordova) просто недостаточно быстр. Возможно, вы сможете заставить его работать, если сделаете логику обратного вызова didRangeBeacons максимально быстрой. Что бы это ни стоило, используя собственный код на iOS, я успешно ранжировал несколько сотен маяков одновременно на iPhone 4S с минимальным кодом в обратном вызове ранжирования. - person davidgyoung; 16.12.2016
comment
@davidgyoung Даже когда у нас есть обратный вызов с пустым диапазоном, зависания все равно происходят. - person Chris; 19.12.2016
comment
Я получаю ту же ошибку с этим плагином, но вместо этого я использую функции мониторинга регионов. Я открыл вопрос здесь: github.com/petermetz/cordova-plugin-ibeacon/ вопросы/287 - person shi11i; 06.03.2017

Согласно этому WebKit Bugzilla, это может быть скрытая ошибка в WebKit.

person Benjamin Wen    schedule 02.06.2020