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.

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