Конечная игра для меня - провайдер UPnP, который может запрашивать устройства в сети. Я пробовал несколько существующих плагинов для обнаружения, но они сломаны и не поддерживаются. Если кто-то знает решение для этой цели, остальное становится спорным.
Что касается моей проблемы: я застрял при написании своего провайдера UDP-сокетов. Я использую Ionic v3 и cordova-plugin-chrome-apps-sockets-udp@1.3.0. Я тестирую на Android. Я не пробовал iOS.
Я могу нормально создавать .create () и .close (). Вызовы .bind () и .send () всегда терпят неудачу. Первоначально вызовы были прерваны, сообщив об этой ошибке:
Error in Error callbackId: ChromeSocketsUdp1682499592 : TypeError: Cannot read property 'message' of undefined
Проверяя плагин UDP, я нашел require () для cordova-plugin-chrome-apps-runtime.runtime, но он не был установлен. Итак, я установил это. Обратные вызовы ошибок перестали работать сразу же, но их возвращаемые значения теперь не определены. Чтобы быть педантичным, ответ .bind () на слой ионного кода совершенно не определен, но .send () имеет оболочку Cordova, которая собирает результат, который теперь таков:
{bytesSent: 0, resultCode: undefined}
Неопределенный resultCode вызван пустой ошибкой, исходящей из кода платформы Android. Соответствующая цитата выглядит так:
var fail = callback && function(error) {
var sendInfo = {
bytesSent: 0,
resultCode: error.resultCode
};
callbackWithError(error.message, callback, sendInfo);
};
exec(win, fail, 'ChromeSocketsUdp', 'send', [socketId, address, port, data]);
Функция exec () предоставляет метод fail () для вызываемого кода платформы, ничего не передавая обратно на уровень приложения. Я сравнил код платформы UDP с кодом платформы TCP, так как плагин TCP используется в другом месте этого же проекта без проблем. Единственное различие в функциях отправки платформы TCP и UDP, вызываемых exec (), заключается в проверке соединения TCP. В противном случае структура и имена переменных идентичны.
Наличие подключаемого модуля * apps-runtime было случайностью. Он не является частью каких-либо инструкций по установке и подготовке, которые я прочитал. Я вполне уверен, что я или мой проект каким-то образом сбились с пути.
Мой файл manifest.json включает, но не ограничивается этим:
"sockets": {
"udp": {
"send": ["*"],
"bind": ["*"]
}
}
Мой список плагинов включает, но не ограничивается следующими:
cordova-plugin-chrome-apps-common 1.0.7 "Chrome Apps Common Utils"
cordova-plugin-chrome-apps-runtime 2.0.0 "Chrome App Runtime"
cordova-plugin-chrome-apps-sockets-tcp 1.3.7 "Chrome Apps Sockets TCP API"
cordova-plugin-chrome-apps-sockets-udp 1.3.0 "Chrome Apps Sockets UDP API"
использование adb logcat
в момент сбоя обратного вызова не дает ничего интересного. Нет разрешений жалоб. Только стек вызовов, указывающий мне на места, описанные выше, и мой список стрельбы из console.log ().
У меня есть declare var chrome;
вверху документа моего провайдера, но я на самом деле вызываю вызовы, используя (<any>window).chrome.sockets.udp.
Я проверил, что typeof .bind () и .send () является функцией и что chrome.sockets.udp! = 'Undefined'.
Мои слушатели onReceive и onReceiveError зарегистрированы в конструкторе моего провайдера.
Halp