MessageDeleted` не вызывается, когда сообщение удаляется в WhatsApp Web (через WKScriptMessageHandler`)Javascript

Форум по Javascript
Ответить
Anonymous
 MessageDeleted` не вызывается, когда сообщение удаляется в WhatsApp Web (через WKScriptMessageHandler`)

Сообщение Anonymous »

Я разрабатываю приложение для iOS, которое использует WKWebView для отображения WhatsApp Web (

Код: Выделить всё

https://web.whatsapp.com). Мне нужно определить, когда сообщение удаляется в веб-интерфейсе WhatsApp, и обработать это событие в моем приложении с помощью WKScriptMessageHandler
. Однако событие messageDeleted не запускается при удалении сообщения в веб-интерфейсе WhatsApp.
Вот соответствующий код, в котором я обрабатываю сообщения в WKScriptMessageHandler код>:

Код: Выделить всё

extension WhatsWebVC: WKScriptMessageHandler {
@objc func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
guard let body = message.body as? [String: Any],
let type = body["type"] as? String,
let data = body["data"] as? [String: Any] else { return }

switch type {
case "messageDeleted":
handleDeletedMessage(data)  // This function is not being called
case "mediaMessage":
handleMediaMessage(data)
case "wsReceive":
handleWebSocketMessage(data)
case "wsSend":
print("Outgoing WS message:", data)
default:
print("Unknown message type received:", type)
}
}
}
Во внедрении JavaScript в WebView я отслеживаю удаление сообщения с помощью MutationObserver в контейнере веб-чата WhatsApp. Когда сообщение удаляется, я отправляю событие messageDeleted обратно в приложение iOS с помощью window.webkit.messageHandlers.messageObserver.postMessage().
Вот Код JavaScript, который я добавляю в WhatsApp Web:

Код: Выделить всё

(function() {
let messageCache = new Map();
function extractMessageContent(element) {
let messageContainer = element.querySelector('[data-pre-plain-text]');
let messageText = element.querySelector('.selectable-text');
let mediaContainer = element.querySelector('.media-container');
let timestampElement = element.querySelector('div[data-pre-plain-text]');
let timestamp = '';
let sender = '';
let mediaUrl = '';
let mediaName = '';

if (timestampElement) {
let preText = timestampElement.getAttribute('data-pre-plain-text');
if (preText) {
let matches = preText.match(/\\[(.*?)\\].*?([^:]+):/);
if (matches) {
timestamp = matches[1];
sender = matches[2].trim();
}
}
}
if (mediaContainer) {
let mediaElement = mediaContainer.querySelector('img, video');
if (mediaElement) {
mediaUrl = mediaElement.src;
mediaName = mediaElement.alt || mediaElement.src.split('/').pop();
}
}
return {
id: element.getAttribute('data-id'),
text: messageText ? messageText.innerText : '',
sender: sender,
timestamp: timestamp,
hasMedia: !!mediaContainer,
mediaUrl: mediaUrl,
mediaName: mediaName
};
}

const messageObserver = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.removedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
let messageElement = node.querySelector('[data-id]');
if (messageElement) {
let messageId = messageElement.getAttribute('data-id');
window.webkit.messageHandlers.messageObserver.postMessage({
type: 'messageDeleted',
data: extractMessageContent(messageElement)
});
}
}
});
}
});
});

function observeChat() {
const chatContainer = document.querySelector('#main div.copyable-area');
if (chatContainer) {
messageObserver.observe(chatContainer, {
childList: true,
subtree: true
});
} else {
setTimeout(observeChat, 1000);
}
}

function initObserver() {
if (document.querySelector('#app')) {
observeChat();
} else {
setTimeout(initObserver, 1000);
}
}

initObserver();
})();
В этом коде JavaScript:
  • MutationObserver прослушивает изменения в контейнере чата и специально проверяет когда сообщения удаляются.
  • Если сообщение удалено, я вызываю window.webkit.messageHandlers.messageObserver.postMessage(), чтобы уведомить приложение о сообщении messageDeleted тип и соответствующие данные сообщения.
Что я пробовал:
  • Убедитесь, что JavaScript добавлен: я подтвердил, что JavaScript правильно внедрен в WKWebView. Наблюдатель срабатывает, когда элементы удаляются из DOM, но сообщение messageDeleted никогда не достигает метода userContentController(_:didReceive:) в приложении iOS.

    Тип сообщения и данные: я добавил в приложение операторы печати для регистрации входящих сообщений, но случай «messageDeleted» не срабатывает, хотя WebView правильно выполнение JavaScript.
  • Конфигурация WebView: я гарантирую, что WKUserContentController WebView правильно настроен для обрабатывать сообщения:

    Код: Выделить всё

    let userContentController = WKUserContentController()
    userContentController.add(self, name: "messageObserver")
    let config = WKWebViewConfiguration()
    config.userContentController = userContentController
    let webView = WKWebView(frame: .zero, configuration: config)
    
  • Внедренный JavaScript: я дважды проверил, что JavaScript выполняется правильно и что функция postMessage вызывается с ожидаемыми данными.
Вопрос:
Почему messageDeleted случай не вызывается? Есть ли какие-либо проблемы с взаимодействием JavaScript с приложением iOS или с тем, как я настроил обработчик сообщений в WKWebView? Что может быть причиной этой проблемы и как ее исправить? Будем очень признательны за любые предложения!

Подробнее здесь: https://stackoverflow.com/questions/793 ... -via-wkscr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»