NSExtensionRequestHandling не обрабатывает собственные сообщения
Я пытаюсь создать расширение Safari для своего собственного приложения. Я хочу иметь всплывающее окно с кнопкой, которая при нажатии будет взаимодействовать с моим родным приложением. Прежде чем я перейду к этой части, у меня возникла проблема с отправкой собственного сообщения и его обработкой в функции из класса, соответствующего стандарту
NSExtensionRequestHandling
протокол. Я мало что сделал, потому что полагаюсь на код, сгенерированный Xcode.
в
manifest.json
я добавил
nativeMessaging
такое разрешение:
"permissions": [ "nativeMessaging" ]
popup.js
который содержит прослушиватель событий:
console.log("Hello World!", browser);
document.addEventListener('DOMContentLoaded', function() {
var checkPageButton = document.getElementById('clickIt');
checkPageButton.addEventListener('click', function() {
console.log("click")
browser.runtime.sendNativeMessage({ message: "Hello" });
}, false)
}, false)
Когда я проверяю всплывающий элемент, я вижу
Hello World
а также
click
сообщение, но, как я уже упоминал ранее -
beginRequest
не называется. Чего не хватает? Я также смотрел
Meet Safari Web Extensions
сеанс с WWDC20, но я не нашел ответа.
2 ответа
Поскольку это может быть вызвано несколькими причинами, я бы попробовал следующее, чтобы помочь отладить проблему.
Убедитесь, что вы настроили группу приложений в своих возможностях и установили расширение и приложение в одну и ту же группу приложений.
Убедитесь, что «Разработчик» -> «Разрешить неподписанные расширения» включен. (если вы не видите «Разработка», вам нужно будет включить его в «Настройки» -> «Дополнительно»
убедитесь, что у вас есть правильные разрешения в вашем
manifest.json
пример:
"permissions": [ "nativeMessaging", "<all_urls>" ]
Я не думаю, что вы можете позвонить из
popup.js
или же
content.js
. Я считаю, что вы можете вызывать его только из . Поэтому вам нужно будет вызвать popup.js -> background.js -> sendNativeMessage.
Если вы посмотрите в своем Safari в меню разработки инспектора, вы можете увидеть что-то вроде «неопределенное не является функцией (
sendNativeMessage
)». Это происходит, когда не вызывается из
background.js
или другие проблемы с разрешениями.
- Также посмотрите в своем Console.app -> ошибки и ошибки (фильтр по идентификатору пакета) и посмотрите, есть ли какие-либо проблемы с разрешениями.
Вы не можете «видеть», если
beginRequest
вызывается просмотром вашего журнала Xcode или установкой точки останова в этом файле func. Он никогда не столкнется с точкой останова или не распечатает журналы Xcode, поскольку он работает в своем собственном процессе. Ваш отладчик подключается к вашему приложению, а не к процессу расширения.
Чтобы использовать отладчик на
SafariWebExtensionHandler
вам нужно будет подключить отладчик к процессу расширения Safari, чтобы достичь точки останова.
Кроме того, если вы используете шаблон по умолчанию из Xcode, он вызывает
os_log
который снова регистрируется в Console.app, а не в Xcode (расширение выполняется в своем собственном процессе).
Я настоятельно рекомендую всем, у кого есть проблемы с собственным обменом сообщениями или кто хочет получить более подробное объяснение, посмотреть хотя бы последние 5 минут этого сеанса для получения дополнительной информации: WWDC 2020: знакомство с веб-расширениями Safari.
Документы Apple также очень полезны: Обмен сообщениями между приложением и JavaScript в веб-расширении Safari.
и передача сообщений между расширениями приложения Safari и внедряемыми скриптами
В манифесте найдите имя своего расширения и используйте его в качестве первого аргумента для
sendNativeMessage
функция.
Если ваше расширение названо
My Test Extension
звонок будет выглядеть так:
browser.runtime.sendNativeMessage('My Test Extension', { message: "Hello" });
Одна вещь, которую я обнаружил, упростила проверку, - это изменить
os_log
в сгенерированном коде иметь
type: .error
и используя приложение Console
Applications > Utilities > Console
для просмотра журналов, поскольку он не будет печататься в консоли xcode.